Skip to content

Commit

Permalink
Merge pull request libgit2#3530 from libgit2/cmn/parse-mode
Browse files Browse the repository at this point in the history
tree: use a specialised mode parse function
  • Loading branch information
ethomson committed Dec 3, 2015
2 parents 2d36e14 + 0174f21 commit 5d1f31c
Showing 1 changed file with 21 additions and 5 deletions.
26 changes: 21 additions & 5 deletions src/tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,25 @@ static int tree_error(const char *str, const char *path)
return -1;
}

static int parse_mode(unsigned int *modep, const char *buffer, const char **buffer_out)
{
unsigned char c;
unsigned int mode = 0;

if (*buffer == ' ')
return -1;

while ((c = *buffer++) != ' ') {
if (c < '0' || c > '7')
return -1;
mode = (mode << 3) + (c - '0');
}
*modep = mode;
*buffer_out = buffer;

return 0;
}

int git_tree__parse(void *_tree, git_odb_object *odb_obj)
{
git_tree *tree = _tree;
Expand All @@ -430,14 +449,11 @@ int git_tree__parse(void *_tree, git_odb_object *odb_obj)
git_tree_entry *entry;
size_t filename_len;
const char *nul;
int attr;
unsigned int attr;

if (git__strtol32(&attr, buffer, &buffer, 8) < 0 || !buffer)
if (parse_mode(&attr, buffer, &buffer) < 0 || !buffer)
return tree_error("Failed to parse tree. Can't parse filemode", NULL);

if (*buffer++ != ' ')
return tree_error("Failed to parse tree. Object is corrupted", NULL);

if ((nul = memchr(buffer, 0, buffer_end - buffer)) == NULL)
return tree_error("Failed to parse tree. Object is corrupted", NULL);

Expand Down

0 comments on commit 5d1f31c

Please sign in to comment.