git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Modify fsck_commit. Replace memcmp by skip_prefix

From
AJAshwin Jha <ajha.dev@gmail.com>
Date
Mar 23, 2014, 13:10 UTC
Message-ID
<532EDD5F.9020402@gmail.com>
In-Reply-To
<CAPig+cRL3zFWtBq_yJQqwGa7Wc6GsdBqA_jrGm8p5ZMJVmr-yw@mail.gmail.com>
Thanks for your comments, Tanay and Eric.

Regarding the [PATCH v2], I will keep this in mind for the subsequent patches.

On 03/23/2014 02:10 PM, Eric Sunshine wrote:
Show 63 quoted lines
> Thanks for the resubmission. Comments below...
>
> On Sat, Mar 22, 2014 at 11:12 AM, Ashwin Jha <ajha.dev@gmail.com> wrote:
>> Subject: [PATCH] Modify fsck_commit. Replace memcmp by skip_prefix
> In his review, Tanay already mentioned indicating a resubmission via
> [PATCH vN]. Additionally, specify the module or function being
> modified, followed by a colon and space. On this project, it is
> customary to forego capitalization in the subject (and only the
> subject). So, you might write:
>
>      Subject: [PATCH v2] fsck_commit: replace memcmp() by skip_prefix()
>
>> Replace memcmp by skip_prefix as it serves the dual
>> purpose of checking the string for a prefix as well
>> as skipping that prefix.
> Good.
>
>> Signed-off-by: Ashwin Jha <ajha.dev@gmail.com>
>> ---
> Tanay mentioned this already: Below the "---" line under your sign-off
> is where you should, as a courtesy to reviewers, explain what changed
> since the previous attempt. Also, provide a link to the previous
> version, like this [1].
>
> [1]: http://git.661346.n2.nabble.com/PATCH-GSoC-Miniproject-15-Rewrite-fsck-c-fsck-commit-td7606180.html
>
>>   fsck.c |   25 ++++++++++++++-----------
>>   1 file changed, 14 insertions(+), 11 deletions(-)
>>
>> diff --git a/fsck.c b/fsck.c
>> index 64bf279..021b3fc 100644
>> --- a/fsck.c
>> +++ b/fsck.c
>> @@ -6,6 +6,7 @@
>>   #include "commit.h"
>>   #include "tag.h"
>>   #include "fsck.h"
>> +#include "git-compat-util.h"
>>
>>   static int fsck_walk_tree(struct tree *tree, fsck_walk_func walk, void *data)
>>   {
>> @@ -284,21 +285,23 @@ static int fsck_ident(char **ident, struct object *obj, fsck_error error_func)
>>
>>   static int fsck_commit(struct commit *commit, fsck_error error_func)
>>   {
>> -       char *buffer = commit->buffer;
>> +       char *next_parent, *buffer = commit->buffer;
> The name 'next_parent' doesn't seem correct. After invoking
> skip_prefix(), this variable will point at the hex representation of
> the parent's SHA1, so a better name might be 'parent_id'.
>
>>          unsigned char tree_sha1[20], sha1[20];
>>          struct commit_graft *graft;
>>          int parents = 0;
>>          int err;
>>
>> -       if (memcmp(buffer, "tree ", 5))
>> +       buffer = (char *)skip_prefix(buffer, "tree ");
> These casts are ugly. It should be possible to get rid of all of them.
> Hint: Does this function modify the memory referenced by 'buffer'?
> (The answer is very slightly involved, though not difficult. A proper
> fix would involve turning this submission into a 2-patch series: one a
> preparatory patch, and the other this patch without the casts.)

Eric, certainly this function does not modify the memory referenced by 'buffer'. So, 'buffer' should be declared as a const char *. But, what about the argument to fsck_ident(). First argument required is a char **. Now, the compiler will correctly give a warning for incorrect argument type.

I have seen the code of fsck_ident(), and it is nowhere modifying the memory referenced by buffer. So, I know that this will not cause any problem. But, still it will be a bad practice to do away with warnings.

And can you explain me a bit about a 2-patch series.
Once again thanks for your help.
Show 48 quoted lines
>> +       if (buffer == NULL)
>>
>> On this project, it is customary to say !buffer. Ditto for the
>> remaining instances.
>>
>>                  return error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'tree' line");
>> -       if (get_sha1_hex(buffer+5, tree_sha1) || buffer[45] != '\n')
>> +       if (get_sha1_hex(buffer, tree_sha1) || buffer[40] != '\n')
>>                  return error_func(&commit->object, FSCK_ERROR, "invalid 'tree' line format - bad sha1");
>> -       buffer += 46;
>> -       while (!memcmp(buffer, "parent ", 7)) {
>> -               if (get_sha1_hex(buffer+7, sha1) || buffer[47] != '\n')
>> +       buffer += 41;
>> +       while ((next_parent = (char *)skip_prefix(buffer, "parent ")) != NULL) {
> Likewise, on this project, it is customary to omit the '!= NULL'.
>
>> +               buffer = next_parent;
>> +               if (get_sha1_hex(buffer, sha1) || buffer[40] != '\n')
>>                          return error_func(&commit->object, FSCK_ERROR, "invalid 'parent' line format - bad sha1");
>> -               buffer += 48;
>> +               buffer += 41;
>>                  parents++;
>>          }
>>          graft = lookup_commit_graft(commit->object.sha1);
>> @@ -322,15 +325,15 @@ static int fsck_commit(struct commit *commit, fsck_error error_func)
>>                  if (p || parents)
>>                          return error_func(&commit->object, FSCK_ERROR, "parent objects missing");
>>          }
>> -       if (memcmp(buffer, "author ", 7))
>> +       buffer = (char *)skip_prefix(buffer, "author ");
>> +       if (buffer == NULL)
>>                  return error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'author' line");
>> -       buffer += 7;
>>          err = fsck_ident(&buffer, &commit->object, error_func);
>>          if (err)
>>                  return err;
>> -       if (memcmp(buffer, "committer ", strlen("committer ")))
>> +       buffer = (char *)skip_prefix(buffer, "committer ");
>> +       if (buffer == NULL)
>>                  return error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'committer' line");
>> -       buffer += strlen("committer ");
>>          err = fsck_ident(&buffer, &commit->object, error_func);
>>          if (err)
>>                  return err;
> Other than the minor points mentioned above, the patch looks good. Thanks.
>
>> --
>> 1.7.9.5

Regards, Ashwin

Previous: Eric SunshineNext: Eric Sunshine
Message 4 of 5 in “Modify fsck_commit. Replace memcmp by skip_prefix”
  1. Modify fsck_commit. Replace memcmp by skip_prefixAshwin Jha, Mar 22, 2014
  2. Tanay AbhraMar 23, 2014
  3. Eric SunshineMar 23, 2014
  4. Ashwin JhaMar 23, 2014
  5. Eric SunshineMar 24, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.