mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-27 22:41:37 +00:00
Merge pull request #3530 from libgit2/cmn/parse-mode
tree: use a specialised mode parse function
This commit is contained in:
commit
5d1f31c6e6
26
src/tree.c
26
src/tree.c
@ -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;
|
||||
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user