Re: [PATCH 11/15] find multi-byte comment chars in unterminated buffers
- From
René Scharfe <l.s.r@web.de>
- Date
- Mar 7, 2024, 19:47 UTC
- Message-ID
- <50c7f2b9-2f40-49f8-af13-1521323825cd@web.de>
- In-Reply-To
- <742ed8e6-d68b-47a0-8d57-731716c5365d@web.de>
Am 07.03.24 um 20:41 schrieb René Scharfe:
Sorry, sent too early.
Show 64 quoted lines
> Am 07.03.24 um 12:08 schrieb Jeff King:
>> On Thu, Mar 07, 2024 at 04:26:38AM -0500, Jeff King wrote:
>>
>>> IMHO this is the trickiest commit of the whole series, as it would be
>>> easy to get the length computations subtly wrong.
>>
>> And sure enough...
>>
>>> diff --git a/trailer.c b/trailer.c
>>> index fe18faf6c5..f59c90b4b5 100644
>>> --- a/trailer.c
>>> +++ b/trailer.c
>>> @@ -882,7 +882,7 @@ static size_t find_trailer_block_start(const char *buf, size_t len)
>>>
>>> /* The first paragraph is the title and cannot be trailers */
>>> for (s = buf; s < buf + len; s = next_line(s)) {
>>> - if (s[0] == comment_line_char)
>>> + if (starts_with_mem(s, buf + len - s, comment_line_str))
>>> continue;
>>> if (is_blank_line(s))
>>> break;
>>> @@ -902,7 +902,7 @@ static size_t find_trailer_block_start(const char *buf, size_t len)
>>> const char **p;
>>> ssize_t separator_pos;
>>>
>>> - if (bol[0] == comment_line_char) {
>>> + if (starts_with_mem(bol, buf + end_of_title - bol, comment_line_str)) {
>>> non_trailer_lines += possible_continuation_lines;
>>> possible_continuation_lines = 0;
>>> continue;
>>
>> This second hunk needs:
>>
>> diff --git a/trailer.c b/trailer.c
>> index f59c90b4b5..fdb0b8137e 100644
>> --- a/trailer.c
>> +++ b/trailer.c
>> @@ -902,7 +902,7 @@ static size_t find_trailer_block_start(const char *buf, size_t len)
>> const char **p;
>> ssize_t separator_pos;
>>
>> - if (starts_with_mem(bol, buf + end_of_title - bol, comment_line_str)) {
>> + if (starts_with_mem(bol, buf + len - bol, comment_line_str)) {
>> non_trailer_lines += possible_continuation_lines;
>> possible_continuation_lines = 0;
>> continue;
>>
>> I was trying to bound the size based on the loop, which is:
>>
>> for (l = last_line(buf, len);
>> l >= end_of_title;
>> l = last_line(buf, l)) {
>> const char *bol = buf + l;
>>
>> but I misread "end_of_title" as an upper bound, not a lower one. Which
>> makes sense because we're iterating backwards over the lines. So I
>> suppose we could bound it by the previous "bol" value. But in practice,
>> your prefix won't cross such a boundary anyway, as it won't have a
>> newline in it (maybe that's something we should enforce? I guess you
>> could set core.commentChar to '\n' even before my series, which would be
>> slightly insane).
>>
>> So just bounding ourselves to "buf + len" seems reasonable, as that
>> makes sure we don't step outside the buffer passed into the function.If you don't want or expect LF in comment_line_str, better check it. And if you do that, most callers of starts_with_mem() -- including this one -- can use starts_with() instead, as mentioned in my reply to your patch. Less calculations, less errors..
René