attr: harden allocation against integer overflows

When parsing an attributes line, we need to allocate an array that holds all attributes specified for the given file pattern. The calculation to determine the number of bytes that need to be allocated was prone to an overflow though when there was an unreasonable amount of attributes. Harden the allocation by instead using the `st_` helper functions that cause us to die when we hit an integer overflow. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Dec 1, 2022 at 15:45 UTC a60a66e409c265b2944f18bf43581c146812586d
1 file changed +3 -4
attr.c
+3 -4
@@ -380,10 +380,9 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
380 goto fail_return;
381 }
382
383 - res = xcalloc(1,
384 - sizeof(*res) +
385 - sizeof(struct attr_state) * num_attr +
386 - (is_macro ? 0 : namelen + 1));
383 + res = xcalloc(1, st_add3(sizeof(*res),
384 + st_mult(sizeof(struct attr_state), num_attr),
385 + is_macro ? 0 : namelen + 1));
386 if (is_macro) {
387 res->u.attr = git_attr_internal(name, namelen);
388 } else {