зеркало из https://github.com/microsoft/git.git
list-objects-filter: initialize sub-filter structs
Since commitc54980ab83
(list-objects-filter: convert filter_spec to a strbuf, 2022-09-11), building with SANITIZE=undefined triggers an error in t5616. The problem is that we end up with a strbuf that has been zero-initialized instead of via STRBUF_INIT. Feeding that strbuf to strbuf_addbuf() in list_objects_filter_copy() means we will call memcpy like: memcpy(some_actual_buffer, NULL, 0); This works on most systems because we're copying zero bytes, but it is technically undefined behavior to ever pass NULL to memcpy. Even thoughc54980ab83
is where the bug manifests, that is only because we switched away from a string_list, which is OK with being zero-initialized (though it may cause other problems by not duplicating the strings, it happened to be OK in this instance). The actual bug is caused by the commit before that,2a01bdedf8
(list-objects-filter: add and use initializers, 2022-09-11). There we consistently initialize the top-level filter structs, but we forgot the dynamically allocated ones we stick in filter_options->sub when creating combined filters. Note that we need to fix two spots here: where we parse a "combine:" filter, but also where we transform from a single-filter into a combined one after seeing multiple "--filter" options. In the second spot, we'll do some minor refactoring to avoid repeating our very-long array index. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
c54980ab83
Коммит
4eaed7c2f2
|
@ -143,6 +143,7 @@ static int parse_combine_subfilter(
|
|||
|
||||
ALLOC_GROW_BY(filter_options->sub, filter_options->sub_nr, 1,
|
||||
filter_options->sub_alloc);
|
||||
list_objects_filter_init(&filter_options->sub[new_index]);
|
||||
|
||||
decoded = url_percent_decode(subspec->buf);
|
||||
|
||||
|
@ -263,6 +264,8 @@ void parse_list_objects_filter(
|
|||
parse_error = gently_parse_list_objects_filter(
|
||||
filter_options, arg, &errbuf);
|
||||
} else {
|
||||
struct list_objects_filter_options *sub;
|
||||
|
||||
/*
|
||||
* Make filter_options an LOFC_COMBINE spec so we can trivially
|
||||
* add subspecs to it.
|
||||
|
@ -273,10 +276,11 @@ void parse_list_objects_filter(
|
|||
filter_spec_append_urlencode(filter_options, arg);
|
||||
ALLOC_GROW_BY(filter_options->sub, filter_options->sub_nr, 1,
|
||||
filter_options->sub_alloc);
|
||||
sub = &filter_options->sub[filter_options->sub_nr - 1];
|
||||
|
||||
parse_error = gently_parse_list_objects_filter(
|
||||
&filter_options->sub[filter_options->sub_nr - 1], arg,
|
||||
&errbuf);
|
||||
list_objects_filter_init(sub);
|
||||
parse_error = gently_parse_list_objects_filter(sub, arg,
|
||||
&errbuf);
|
||||
}
|
||||
if (parse_error)
|
||||
die("%s", errbuf.buf);
|
||||
|
|
Загрузка…
Ссылка в новой задаче