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

Re: [PATCH 01/23] builtin/help: fix dangling reference to `html_path`

From
Justin Tobler <jltobler@gmail.com>
Date
Sep 16, 2024, 16:24 UTC
Message-ID
<guzjej2ghio2bxxt6epofcnl57nqaoagm65byox4iwhvkim2oy@qcuyzzsw5que>
In-Reply-To
<e3bed973afacaec801cff1e77aeea6050cb34f57.1726484308.git.ps@pks.im>
On 24/09/16 01:45PM, Patrick Steinhardt wrote:
Show 29 quoted lines
> In `get_html_page_path()` we may end up assigning the return value of
> `system_path()` to the global `html_path` variable. But as we also
> assign the returned value to `to_free`, we will deallocate its memory
> upon returning from the function. Consequently, `html_path` will now
> point to deallocated memory.
> 
> Fix this issue by instead assigning the value to a separate local
> variable.
> 
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  builtin/help.c | 13 +++++++------
>  1 file changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/builtin/help.c b/builtin/help.c
> index dc1fbe2b986..282ea5721fa 100644
> --- a/builtin/help.c
> +++ b/builtin/help.c
> @@ -513,23 +513,24 @@ static void show_info_page(const char *page)
>  static void get_html_page_path(struct strbuf *page_path, const char *page)
>  {
>  	struct stat st;
> +	const char *path = html_path;
>  	char *to_free = NULL;
>  
> -	if (!html_path)
> -		html_path = to_free = system_path(GIT_HTML_PATH);
> +	if (!path)
> +		path = to_free = system_path(GIT_HTML_PATH);

Previously, `html_path` was being assigned the return value of `system_path()` and consequently escaping this scope even though the value was being freed. There is no reason to modify the global value to begin with so we instead assign the value to a local variable. Makes sense.

Show 24 quoted lines
>  
>  	/*
>  	 * Check that the page we're looking for exists.
>  	 */
> -	if (!strstr(html_path, "://")) {
> -		if (stat(mkpath("%s/%s.html", html_path, page), &st)
> +	if (!strstr(path, "://")) {
> +		if (stat(mkpath("%s/%s.html", path, page), &st)
>  		    || !S_ISREG(st.st_mode))
>  			die("'%s/%s.html': documentation file not found.",
> -				html_path, page);
> +				path, page);
>  	}
>  
>  	strbuf_init(page_path, 0);
> -	strbuf_addf(page_path, "%s/%s.html", html_path, page);
> +	strbuf_addf(page_path, "%s/%s.html", path, page);
>  	free(to_free);
>  }
>  
> -- 
> 2.46.0.551.gc5ee8f2d1c.dirty
> 
> 
Previous: Patrick SteinhardtNext: Patrick Steinhardt
Message 3 of 62 in “Memory leak fixes (pt.7)”
  1. 00/23 Memory leak fixes (pt.7)Patrick Steinhardt, Sep 16, 2024
  2. 01/23 builtin/help: fix dangling reference to `html_path`Patrick Steinhardt, Sep 16, 2024
  3. Justin ToblerSep 16, 2024
  4. 02/23 builtin/help: fix leaking `html_path` when reading config multiple timesPatrick Steinhardt, Sep 16, 2024
  5. 03/23 git: fix leaking argv when handling builtinsPatrick Steinhardt, Sep 16, 2024
  6. 04/23 submodule: fix leaking update strategyPatrick Steinhardt, Sep 16, 2024
  7. 05/23 builtin/submodule--helper: clear child process when not running itPatrick Steinhardt, Sep 16, 2024
  8. 06/23 builtin/submodule--helper: fix leaking error bufferPatrick Steinhardt, Sep 16, 2024
  9. 07/23 t/helper: fix leaking subrepo in nested submodule config helperPatrick Steinhardt, Sep 16, 2024
  10. 08/23 builtin/submodule--helper: fix leaking remote ref on errorsPatrick Steinhardt, Sep 16, 2024
  11. Justin ToblerSep 16, 2024
  12. Patrick SteinhardtSep 17, 2024
  13. Junio C HamanoSep 25, 2024
  14. Patrick SteinhardtSep 26, 2024
  15. 09/23 dir: fix off by one errors for ignored and untracked entriesPatrick Steinhardt, Sep 16, 2024
  16. Junio C HamanoSep 20, 2024
  17. 10/23 builtin/pull: fix leaking "ff" optionPatrick Steinhardt, Sep 16, 2024
  18. Junio C HamanoSep 20, 2024
  19. Patrick SteinhardtSep 24, 2024
  20. 11/23 diff: fix leaking orderfile optionPatrick Steinhardt, Sep 16, 2024
  21. 12/23 parse-options: free previous value of `OPTION_FILENAME`Patrick Steinhardt, Sep 16, 2024
  22. Junio C HamanoSep 20, 2024
  23. 13/23 diffcore-order: fix leaking buffer when parsing orderfilesPatrick Steinhardt, Sep 16, 2024
  24. 14/23 builtin/repack: fix leaking configurationPatrick Steinhardt, Sep 16, 2024
  25. Junio C HamanoSep 20, 2024
  26. 15/23 builtin/difftool: plug several trivial memory leaksPatrick Steinhardt, Sep 16, 2024
  27. 16/23 trace2: destroy context stored in thread-local storagePatrick Steinhardt, Sep 16, 2024
  28. 17/23 submodule: fix leaking submodule ODB pathsPatrick Steinhardt, Sep 16, 2024
  29. 18/23 grep: fix leaking grep patternPatrick Steinhardt, Sep 16, 2024
  30. 19/23 promisor-remote: fix leaking partial clone filterPatrick Steinhardt, Sep 16, 2024
  31. 20/23 builtin/maintenance: fix leaking config stringPatrick Steinhardt, Sep 16, 2024
  32. Junio C HamanoSep 20, 2024
  33. 21/23 builtin/maintenance: fix leak in `get_schedule_cmd()`Patrick Steinhardt, Sep 16, 2024
  34. 22/23 revision: fix leaking parents when simplifying commitsPatrick Steinhardt, Sep 16, 2024
  35. Junio C HamanoSep 19, 2024
  36. 23/23 diffcore-break: fix leaking filespecs when merging broken pairsPatrick Steinhardt, Sep 16, 2024
  37. Junio C HamanoSep 19, 2024
  38. Patrick SteinhardtSep 24, 2024
  39. 00/23 Memory leak fixes (pt.7)Patrick Steinhardt, Sep 26, 2024
  40. 01/23 builtin/help: fix dangling reference to `html_path`Patrick Steinhardt, Sep 26, 2024
  41. 02/23 builtin/help: fix leaking `html_path` when reading config multiple timesPatrick Steinhardt, Sep 26, 2024
  42. 03/23 git: fix leaking argv when handling builtinsPatrick Steinhardt, Sep 26, 2024
  43. 04/23 submodule: fix leaking update strategyPatrick Steinhardt, Sep 26, 2024
  44. 05/23 builtin/submodule--helper: clear child process when not running itPatrick Steinhardt, Sep 26, 2024
  45. 06/23 builtin/submodule--helper: fix leaking error bufferPatrick Steinhardt, Sep 26, 2024
  46. 07/23 t/helper: fix leaking subrepo in nested submodule config helperPatrick Steinhardt, Sep 26, 2024
  47. 08/23 builtin/submodule--helper: fix leaking remote ref on errorsPatrick Steinhardt, Sep 26, 2024
  48. 09/23 dir: fix off by one errors for ignored and untracked entriesPatrick Steinhardt, Sep 26, 2024
  49. 10/23 builtin/pull: fix leaking "ff" optionPatrick Steinhardt, Sep 26, 2024
  50. 11/23 diff: fix leaking orderfile optionPatrick Steinhardt, Sep 26, 2024
  51. 12/23 parse-options: free previous value of `OPTION_FILENAME`Patrick Steinhardt, Sep 26, 2024
  52. 13/23 diffcore-order: fix leaking buffer when parsing orderfilesPatrick Steinhardt, Sep 26, 2024
  53. 14/23 builtin/repack: fix leaking configurationPatrick Steinhardt, Sep 26, 2024
  54. 15/23 builtin/difftool: plug several trivial memory leaksPatrick Steinhardt, Sep 26, 2024
  55. 16/23 trace2: destroy context stored in thread-local storagePatrick Steinhardt, Sep 26, 2024
  56. 17/23 submodule: fix leaking submodule ODB pathsPatrick Steinhardt, Sep 26, 2024
  57. 18/23 grep: fix leaking grep patternPatrick Steinhardt, Sep 26, 2024
  58. 19/23 promisor-remote: fix leaking partial clone filterPatrick Steinhardt, Sep 26, 2024
  59. 20/23 builtin/maintenance: fix leaking config stringPatrick Steinhardt, Sep 26, 2024
  60. 21/23 builtin/maintenance: fix leak in `get_schedule_cmd()`Patrick Steinhardt, Sep 26, 2024
  61. 22/23 revision: fix leaking parents when simplifying commitsPatrick Steinhardt, Sep 26, 2024
  62. 23/23 diffcore-break: fix leaking filespecs when merging broken pairsPatrick Steinhardt, Sep 26, 2024

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.