X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=tree-walk.c;fp=tree-walk.c;h=39220582713311c692dde45d6705700995545f38;hb=7d65848afd42f075f6db0d03da2c9f5a9bac6267;hp=9f7abb7cb352241191e395e3967730f3bdcf6d55;hpb=878ccb26941a15312b6676372e4688d42a73882b;p=git.git diff --git a/tree-walk.c b/tree-walk.c index 9f7abb7c..39220582 100644 --- a/tree-walk.c +++ b/tree-walk.c @@ -47,18 +47,33 @@ void update_tree_entry(struct tree_desc *desc) desc->size = size - len; } +static const char *get_mode(const char *str, unsigned int *modep) +{ + unsigned char c; + unsigned int mode = 0; + + while ((c = *str++) != ' ') { + if (c < '0' || c > '7') + return NULL; + mode = (mode << 3) + (c - '0'); + } + *modep = mode; + return str; +} + const unsigned char *tree_entry_extract(struct tree_desc *desc, const char **pathp, unsigned int *modep) { void *tree = desc->buf; unsigned long size = desc->size; int len = strlen(tree)+1; const unsigned char *sha1 = tree + len; - const char *path = strchr(tree, ' '); + const char *path; unsigned int mode; - if (!path || size < len + 20 || sscanf(tree, "%o", &mode) != 1) + path = get_mode(tree, &mode); + if (!path || size < len + 20) die("corrupt tree file"); - *pathp = path+1; + *pathp = path; *modep = canon_mode(mode); return sha1; }