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

Re: [PATCH 1/4] compat/win32/syslog: fix use-after-realloc

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
May 24, 2022, 12:39 UTC
Message-ID
<nycvar.QRO.7.76.6.2205241431400.352@tvgsbejvaqbjf.bet>
In-Reply-To
<d0ade6531bc77b654c28cf7b1bfa42523150c015.1653351786.git.gitgitgadget@gmail.com>
Hi,
On Tue, 24 May 2022, Johannes Schindelin via GitGitGadget wrote:
Show 11 quoted lines
> diff --git a/compat/win32/syslog.c b/compat/win32/syslog.c
> index 161978d720a..1f8d8934cc9 100644
> --- a/compat/win32/syslog.c
> +++ b/compat/win32/syslog.c
> @@ -43,6 +43,7 @@ void syslog(int priority, const char *fmt, ...)
>  	va_end(ap);
>
>  	while ((pos = strstr(str, "%1")) != NULL) {
> +		size_t offset = pos - str;
>  		char *oldstr = str;
>  		str = realloc(str, st_add(++str_len, 1));

Since it has been raised elsewhere: Why is that `++str_len` not turned into an `st_add()`?

The commit adding that `st_add()` call (50a6c8efa2b (use st_add and st_mult for allocation size computation, 2016-02-22)) does not really talk about it, but the explanation is simple:

Before this `while()` loop, we allocate one more than `str_len` (see compat/win32/syslog.c#L35), and we do that already using `st_add()`, so that the string and the terminating NUL fit into the allocated memory.

Therefore, the first time we enter the loop, we know that `++str_len` is safe.

Now, in this very line, we then increment `str_len` and then `reallocate` one more than that, again guarding it via `st_add()`. So every subsequent iteration will already have checked that `++str_len` is safe, too.

By induction (https://en.wikipedia.org/wiki/Mathematical_induction), it follows that this line is safe, and we do not have to change it to a clunkier two-step assignment where we first use `st_add()` to increment `str_len` and then use `st_add()` to allocate enough memory to also fit the trailing NUL.

Now you know, Dscho

Show 13 quoted lines
>  		if (!str) {
> @@ -50,6 +51,7 @@ void syslog(int priority, const char *fmt, ...)
>  			warning_errno("realloc failed");
>  			return;
>  		}
> +		pos = str + offset;
>  		memmove(pos + 2, pos + 1, strlen(pos));
>  		pos[1] = ' ';
>  	}
> --
> gitgitgadget
>
>
Previous: Johannes Schindelin via GitGitGadgetNext: Junio C Hamano
Message 3 of 23 in “ci: fix windows-build with GCC v12.x”
  1. 0/4 ci: fix windows-build with GCC v12.xJohannes Schindelin via GitGitGadget, May 24, 2022
  2. 1/4 compat/win32/syslog: fix use-after-reallocJohannes Schindelin via GitGitGadget, May 24, 2022
  3. Johannes SchindelinMay 24, 2022
  4. Junio C HamanoMay 24, 2022
  5. 2/4 nedmalloc: avoid new compile errorJohannes Schindelin via GitGitGadget, May 24, 2022
  6. Ævar Arnfjörð BjarmasonMay 24, 2022
  7. René ScharfeMay 24, 2022
  8. Johannes SchindelinMay 24, 2022
  9. Ævar Arnfjörð BjarmasonMay 24, 2022
  10. 3/4 http.c: avoid danging pointer to local variable `finished`Johannes Schindelin via GitGitGadget, May 24, 2022
  11. Ævar Arnfjörð BjarmasonMay 24, 2022
  12. Junio C HamanoMay 24, 2022
  13. Johannes SchindelinMay 24, 2022
  14. Ævar Arnfjörð BjarmasonMay 24, 2022
  15. Junio C HamanoMay 24, 2022
  16. Johannes SchindelinMay 25, 2022
  17. Ævar Arnfjörð BjarmasonMay 25, 2022
  18. 4/4 dir.c: avoid "exceeds maximum object size" error with GCC v12.xJohannes Schindelin via GitGitGadget, May 24, 2022
  19. Ævar Arnfjörð BjarmasonMay 24, 2022
  20. Johannes SchindelinMay 24, 2022
  21. Derrick StoleeMay 25, 2022
  22. Junio C HamanoMay 25, 2022
  23. Jeff HostetlerMay 24, 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.