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

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

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 4, 2022, 01:56 UTC
Message-ID
<xmqq35m4gt5x.fsf@gitster.g>
In-Reply-To
<pull.1125.v3.git.git.1640931460758.gitgitgadget@gmail.com>
"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)
Show 26 quoted lines
> +		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.

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: John Cai via GitGitGadgetNext: John Cai
Message 8 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.