git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v3] receive-pack.c: consolidate find header logic

From
John Cai <johncai86@gmail.com>
Date
Jan 4, 2022, 15:12 UTC
Message-ID
<CAE7F284-4D3F-4412-ACC1-216BB93F74EB@gmail.com>
In-Reply-To
<xmqq35m4gt5x.fsf@gitster.g>
Show 47 quoted lines
> On Jan 3, 2022, at 8:56 PM, Junio C Hamano <gitster@pobox.com> wrote:
> 
> "John Cai via GitGitGadget" <gitgitgadget@gmail.com> writes:
> 
>> +	size_t out_len;
>> +	const char *val = find_header_mem(msg, len, key, &out_len);
>> +
>> +	if (val == NULL)
> 
> Style:
> 
> 	if (!val)
> 
>> +		return NULL;
>> +
>> +	if (next_line)
>> +		*next_line = val + out_len + 1;
>> +
>> +	return xmemdupz(val, out_len);
>> }
>> 
>> /*
>> diff --git a/commit.c b/commit.c
>> index a348f085b2b..8ac32a4d7b5 100644
>> --- a/commit.c
>> +++ b/commit.c
>> @@ -1631,12 +1631,13 @@ struct commit_list **commit_list_append(struct commit *commit,
>> 	return &new_commit->next;
>> }
>> 
>> -const char *find_commit_header(const char *msg, const char *key, size_t *out_len)
>> +const char *find_header_mem(const char *msg, size_t len,
>> +			const char *key, size_t *out_len)
>> {
>> 	int key_len = strlen(key);
>> 	const char *line = msg;
>> 
>> +	while (line && line < msg + len) {
>> 		const char *eol = strchrnul(line, '\n');
> 
> Between line[0] and msg[len], there may not be a LF nor NUL at all,
> and strchrnul() will scan beyond the range we were given (which is
> msg[0]..msg[len]).
> 
> But that is something we share with the find_header() if I am not
> mistaken, so I am OK to leave the code as posted and leave it
> outside the scope of this series to clean it up to make it safer.

Good catch. Thanks for pointing that out-I didn’t notice it. I’ve added a NEEDSWORK Block to this so we can address it in a later patch series.

Show 10 quoted lines
> 
> The reason why it is probably safe for the current set of callers
> (and presumably any reasonable new callers we may add later) is that
> they computed "len" by scanning the block of memory starting at (or
> before) "msg" before calling us, and we know that the block of
> memory is properly NUL-terminated.  find_header() is called by
> check_nonce() and check_cert_push_options(), both of which tell
> us to scan in a strbuf, which is designed to be scannable for NUL
> safely by having an extra NUL at the end beyond the end.
> 
Previous: Junio C HamanoNext: John Cai via GitGitGadget
Message 9 of 16 in “Consolidate find_header logic into one function”
  1. 0/2 Consolidate find_header logic into one functionJohn Cai via GitGitGadget, Dec 27, 2021
  2. 1/2 receive-pack.c: consolidate find header logicJohn Cai via GitGitGadget, Dec 27, 2021
  3. Junio C HamanoDec 27, 2021
  4. 2/2 commit.c: rename find_commit_header to find_headerJohn Cai via GitGitGadget, Dec 27, 2021
  5. receive-pack.c: consolidate find header logicJohn Cai via GitGitGadget, Dec 29, 2021
  6. Junio C HamanoDec 30, 2021
  7. receive-pack.c: consolidate find header logicJohn Cai via GitGitGadget, Dec 31, 2021
  8. Junio C HamanoJan 4, 2022
  9. John CaiJan 4, 2022
  10. receive-pack.c: consolidate find header logicJohn Cai via GitGitGadget, Jan 5, 2022
  11. Junio C HamanoJan 5, 2022
  12. receive-pack.c: consolidate find header logicJohn Cai via GitGitGadget, Jan 6, 2022
  13. Junio C HamanoJan 6, 2022
  14. receive-pack.c: consolidate find header logicJohn Cai via GitGitGadget, Jan 6, 2022
  15. John CaiJan 8, 2022
  16. Junio C HamanoJan 8, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.