Skip to content

Commit 5b5def9

Browse files
committed
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
2 parents d1311be + 08bf354 commit 5b5def9

File tree

1 file changed

+18
-23
lines changed

1 file changed

+18
-23
lines changed

dir.c

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2738,54 +2738,49 @@ static int read_one_dir(struct untracked_cache_dir **untracked_,
27382738
struct read_data *rd)
27392739
{
27402740
struct untracked_cache_dir ud, *untracked;
2741-
const unsigned char *next, *data = rd->data, *end = rd->end;
2741+
const unsigned char *data = rd->data, *end = rd->end;
2742+
const unsigned char *eos;
27422743
unsigned int value;
2743-
int i, len;
2744+
int i;
27442745

27452746
memset(&ud, 0, sizeof(ud));
27462747

2747-
next = data;
2748-
value = decode_varint(&next);
2749-
if (next > end)
2748+
value = decode_varint(&data);
2749+
if (data > end)
27502750
return -1;
27512751
ud.recurse = 1;
27522752
ud.untracked_alloc = value;
27532753
ud.untracked_nr = value;
27542754
if (ud.untracked_nr)
27552755
ALLOC_ARRAY(ud.untracked, ud.untracked_nr);
2756-
data = next;
27572756

2758-
next = data;
2759-
ud.dirs_alloc = ud.dirs_nr = decode_varint(&next);
2760-
if (next > end)
2757+
ud.dirs_alloc = ud.dirs_nr = decode_varint(&data);
2758+
if (data > end)
27612759
return -1;
27622760
ALLOC_ARRAY(ud.dirs, ud.dirs_nr);
2763-
data = next;
27642761

2765-
len = strlen((const char *)data);
2766-
next = data + len + 1;
2767-
if (next > rd->end)
2762+
eos = memchr(data, '\0', end - data);
2763+
if (!eos || eos == end)
27682764
return -1;
2769-
*untracked_ = untracked = xmalloc(st_add3(sizeof(*untracked), len, 1));
2765+
2766+
*untracked_ = untracked = xmalloc(st_add3(sizeof(*untracked), eos - data, 1));
27702767
memcpy(untracked, &ud, sizeof(ud));
2771-
memcpy(untracked->name, data, len + 1);
2772-
data = next;
2768+
memcpy(untracked->name, data, eos - data + 1);
2769+
data = eos + 1;
27732770

27742771
for (i = 0; i < untracked->untracked_nr; i++) {
2775-
len = strlen((const char *)data);
2776-
next = data + len + 1;
2777-
if (next > rd->end)
2772+
eos = memchr(data, '\0', end - data);
2773+
if (!eos || eos == end)
27782774
return -1;
2779-
untracked->untracked[i] = xstrdup((const char*)data);
2780-
data = next;
2775+
untracked->untracked[i] = xmemdupz(data, eos - data);
2776+
data = eos + 1;
27812777
}
27822778

27832779
rd->ucd[rd->index++] = untracked;
27842780
rd->data = data;
27852781

27862782
for (i = 0; i < untracked->dirs_nr; i++) {
2787-
len = read_one_dir(untracked->dirs + i, rd);
2788-
if (len < 0)
2783+
if (read_one_dir(untracked->dirs + i, rd) < 0)
27892784
return -1;
27902785
}
27912786
return 0;

0 commit comments

Comments
 (0)