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

Re: [PATCH 2/3] setup_path(): Free temporary buffer

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 14, 2011, 20:14 UTC
Message-ID
<7v7hc1cvdt.fsf@alter.siamese.dyndns.org>
In-Reply-To
<1300130318-11279-3-git-send-email-cmn@elego.de>
Carlos Martín Nieto <cmn@elego.de> writes:
Show 7 quoted lines
> Make sure the pointer git_exec_path() returns is in the heap and free
> it after it's no longer needed.
>
> Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
> ---
>  exec_cmd.c |    9 ++++++---
>  1 files changed, 6 insertions(+), 3 deletions(-)

The proposed log message does not explain half of what this patch does, if I am reading the patch correctly. Here is what I would consider as a fair description:

    Subject: git_exec_path: always return a free-able string
    git_exec_path() returns a string that the callers do not have to free
    in most cases, but when it calls into system_path() and ends up going
    into runtime-prefix codepath, it allocates an extra string on the
    heap, which ends up leaking because the callers are not allowed to
    free it.
    In order to allow the callers to clean up in all cases, change the API
    of git_exec_path() to always return a string on heap.  This requires
    all the callers to free it.
    Update only one caller setup_path() to follow the new API, but leave
    other callers to leak even in normal cases.  The caller in git.c exits
    immediately after using it, so we don't care about the leak there
    anyway.  Also help.c has a few calls to it but the number of calls to
    the function is small and bounded, so the leak is small and we don't
    care.

And then reviewers can agree or disagree if the small leaks in git.c (just one string allocation that immediately is followed by exit after its use) and help.c (in list_commands() and load_commands_list(), neither of which is called millions of times anyway) are OK to accept.

I tend to think they are Ok, but then I also tend to think one leak of exec-path return value in setup_path() is perfectly fine for the same reason, so in that sense I don't see a point in this patch...

Show 33 quoted lines
> diff --git a/exec_cmd.c b/exec_cmd.c
> index 38545e8..c16c3d4 100644
> --- a/exec_cmd.c
> +++ b/exec_cmd.c
> @@ -73,11 +73,11 @@ const char *git_exec_path(void)
>  	const char *env;
>  
>  	if (argv_exec_path)
> -		return argv_exec_path;
> +		return xstrdup(argv_exec_path);
>  
>  	env = getenv(EXEC_PATH_ENVIRONMENT);
>  	if (env && *env) {
> -		return env;
> +		return xstrdup(env);
>  	}
>  
>  	return system_path(GIT_EXEC_PATH);
> @@ -99,10 +99,13 @@ void setup_path(void)
>  {
>  	const char *old_path = getenv("PATH");
>  	struct strbuf new_path = STRBUF_INIT;
> +	char *exec_path = (char *) git_exec_path();
>  
> -	add_path(&new_path, git_exec_path());
> +	add_path(&new_path, exec_path);
>  	add_path(&new_path, argv0_path);
>  
> +	free(exec_path);
> +
>  	if (old_path)
>  		strbuf_addstr(&new_path, old_path);
>  	else
Previous: Nguyễn Thái Ngọc DuyNext: Carlos Martín Nieto
Message 40 of 48 in “Fix some errors reported by valgrind”
  1. 0/3 Fix some errors reported by valgrindCarlos Martín Nieto, Mar 14, 2011
  2. 1/3 make_absolute_path: Don't try to copy a string to itselfCarlos Martín Nieto, Mar 14, 2011
  3. Jeff KingMar 14, 2011
  4. Junio C HamanoMar 14, 2011
  5. Carlos Martín NietoMar 14, 2011
  6. Junio C HamanoMar 14, 2011
  7. Carlos Martín NietoMar 15, 2011
  8. Carlos Martín NietoMar 15, 2011
  9. Junio C HamanoMar 15, 2011
  10. Carlos Martín NietoMar 15, 2011
  11. Nguyen Thai Ngoc DuyMar 16, 2011
  12. Carlos Martín NietoMar 16, 2011
  13. Nguyen Thai Ngoc DuyMar 16, 2011
  14. Nguyen Thai Ngoc DuyMar 16, 2011
  15. Carlos Martín NietoMar 16, 2011
  16. 2/3 setup_path(): Free temporary bufferCarlos Martín Nieto, Mar 14, 2011
  17. Jeff KingMar 14, 2011
  18. Carlos Martín NietoMar 14, 2011
  19. system_path: use a static bufferCarlos Martín Nieto, Mar 16, 2011
  20. Erik Faye-LundMar 16, 2011
  21. Carlos Martín NietoMar 16, 2011
  22. system_path: use a static bufferCarlos Martín Nieto, Mar 16, 2011
  23. Junio C HamanoMar 16, 2011
  24. system_path: use a static bufferCarlos Martín Nieto, Mar 17, 2011
  25. system_path: use a static bufferCarlos Martín Nieto, Mar 17, 2011
  26. Junio C HamanoMar 18, 2011
  27. Carlos Martín NietoMar 21, 2011
  28. Jeff KingMar 21, 2011
  29. Carlos Martín NietoMar 21, 2011
  30. Jeff KingMar 21, 2011
  31. Carlos Martín NietoMar 21, 2011
  32. Nguyen Thai Ngoc DuyMar 18, 2011
  33. PATH_MAX (Re: [PATCH] system_path: use a static buffer)Jonathan Nieder, Mar 18, 2011
  34. Nguyen Thai Ngoc DuyMar 18, 2011
  35. Carlos Martín NietoMar 21, 2011
  36. Lasse MakholmMar 21, 2011
  37. Nguyen Thai Ngoc DuyMar 21, 2011
  38. 1/2 wrapper.c: add xgetcwd()Nguyễn Thái Ngọc Duy, Mar 18, 2011
  39. 2/2 setup_gently: use xgetcwd()Nguyễn Thái Ngọc Duy, Mar 18, 2011
  40. Junio C HamanoMar 14, 2011
  41. Carlos Martín NietoMar 14, 2011
  42. Jeff KingMar 15, 2011
  43. t/README: Add a note about running commands under valgrindCarlos Martín Nieto, Mar 15, 2011
  44. Junio C HamanoMar 15, 2011
  45. Carlos Martín NietoMar 15, 2011
  46. 3/3 clone: Free a few pathsCarlos Martín Nieto, Mar 14, 2011
  47. Jonathan NiederMar 14, 2011
  48. Junio C HamanoMar 18, 2011

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.