Merge branch 'jk/untracked-cache-more-fixes'

Code clean-up.

* jk/untracked-cache-more-fixes:
  untracked-cache: simplify parsing by dropping "len"
  untracked-cache: simplify parsing by dropping "next"
  untracked-cache: be defensive about missing NULs in index
This commit is contained in:
Junio C Hamano 2019-05-09 00:37:28 +09:00
commit 5b5def9a99
1 changed files with 18 additions and 23 deletions

41
dir.c
View File

@ -2738,54 +2738,49 @@ static int read_one_dir(struct untracked_cache_dir **untracked_,
struct read_data *rd) struct read_data *rd)
{ {
struct untracked_cache_dir ud, *untracked; struct untracked_cache_dir ud, *untracked;
const unsigned char *next, *data = rd->data, *end = rd->end; const unsigned char *data = rd->data, *end = rd->end;
const unsigned char *eos;
unsigned int value; unsigned int value;
int i, len; int i;
memset(&ud, 0, sizeof(ud)); memset(&ud, 0, sizeof(ud));
next = data; value = decode_varint(&data);
value = decode_varint(&next); if (data > end)
if (next > end)
return -1; return -1;
ud.recurse = 1; ud.recurse = 1;
ud.untracked_alloc = value; ud.untracked_alloc = value;
ud.untracked_nr = value; ud.untracked_nr = value;
if (ud.untracked_nr) if (ud.untracked_nr)
ALLOC_ARRAY(ud.untracked, ud.untracked_nr); ALLOC_ARRAY(ud.untracked, ud.untracked_nr);
data = next;
next = data; ud.dirs_alloc = ud.dirs_nr = decode_varint(&data);
ud.dirs_alloc = ud.dirs_nr = decode_varint(&next); if (data > end)
if (next > end)
return -1; return -1;
ALLOC_ARRAY(ud.dirs, ud.dirs_nr); ALLOC_ARRAY(ud.dirs, ud.dirs_nr);
data = next;
len = strlen((const char *)data); eos = memchr(data, '\0', end - data);
next = data + len + 1; if (!eos || eos == end)
if (next > rd->end)
return -1; return -1;
*untracked_ = untracked = xmalloc(st_add3(sizeof(*untracked), len, 1));
*untracked_ = untracked = xmalloc(st_add3(sizeof(*untracked), eos - data, 1));
memcpy(untracked, &ud, sizeof(ud)); memcpy(untracked, &ud, sizeof(ud));
memcpy(untracked->name, data, len + 1); memcpy(untracked->name, data, eos - data + 1);
data = next; data = eos + 1;
for (i = 0; i < untracked->untracked_nr; i++) { for (i = 0; i < untracked->untracked_nr; i++) {
len = strlen((const char *)data); eos = memchr(data, '\0', end - data);
next = data + len + 1; if (!eos || eos == end)
if (next > rd->end)
return -1; return -1;
untracked->untracked[i] = xstrdup((const char*)data); untracked->untracked[i] = xmemdupz(data, eos - data);
data = next; data = eos + 1;
} }
rd->ucd[rd->index++] = untracked; rd->ucd[rd->index++] = untracked;
rd->data = data; rd->data = data;
for (i = 0; i < untracked->dirs_nr; i++) { for (i = 0; i < untracked->dirs_nr; i++) {
len = read_one_dir(untracked->dirs + i, rd); if (read_one_dir(untracked->dirs + i, rd) < 0)
if (len < 0)
return -1; return -1;
} }
return 0; return 0;