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

[PATCH v3 1/5] rev-parse: fix a leak with --abbrev-ref

From
Rubén Justo <rjusto@gmail.com>
Date
Jun 17, 2023, 06:40 UTC
Message-ID
<38534e6c-f245-38ad-1468-742b5756ab42@gmail.com>
In-Reply-To
<71b49be1-eeef-2f60-38f1-cfcbe4c8252f@gmail.com>

To handle "--abbrev-ref" we use shorten_unambiguous_ref(). This function takes a refname and returns a shortened refname, which is a newly allocated string that needs to be freed.

Unfortunately, the refname variable is reused to receive the shortened one. Therefore, we lose the original refname, which needs to be freed as well, producing a leak.

This leak can be reviewed with:
   $ for a in {1..10}; do git branch foo_${a}; done
   $ git rev-parse --abbrev-ref refs/heads/foo_{1..10}
   Direct leak of 171 byte(s) in 10 object(s) allocated from:
       ... in xstrdup wrapper.c
       ... in expand_ref refs.c
       ... in repo_dwim_ref refs.c
       ... in show_rev builtin/rev-parse.c
       ... in cmd_rev_parse builtin/rev-parse.c
       ... in run_builtin git.c

We have this leak since a45d34691e (rev-parse: --abbrev-ref option to shorten ref name, 2009-04-13) when "--abbrev-ref" was introduced.

Let's fix it.
Signed-off-by: Rubén Justo <rjusto@gmail.com>
---
 builtin/rev-parse.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 852e49e340..d2eb239a08 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -156,9 +156,12 @@ static void show_rev(int type, const struct object_id *oid, const char *name)
 				 */
 				break;
 			case 1: /* happy */
-				if (abbrev_ref)
+				if (abbrev_ref) {
+					char *old = full;
 					full = shorten_unambiguous_ref(full,
 						abbrev_ref_strict);
+					free(old);
+				}
 				show_with_type(type, full);
 				break;
 			default: /* ambiguous */
-- 
2.40.1
Previous: Rubén JustoNext: Rubén Justo
Message 43 of 47 in “tests: mark as passing with SANITIZE=leak”
  1. Rubén JustoJun 11, 2023
  2. 01/11 rev-parse: fix a leak with --abbrev-refRubén Justo, Jun 11, 2023
  3. Jeff KingJun 12, 2023
  4. Rubén JustoJun 16, 2023
  5. 02/11 config: fix a leak in git_config_copy_or_rename_section_in_fileRubén Justo, Jun 11, 2023
  6. Jeff KingJun 12, 2023
  7. 03/11 remote: fix a leak in query_matches_negative_refspecRubén Justo, Jun 11, 2023
  8. Jeff KingJun 12, 2023
  9. Rubén JustoJun 16, 2023
  10. 04/11 branch: fix a leak in dwim_and_setup_trackingRubén Justo, Jun 11, 2023
  11. Jeff KingJun 12, 2023
  12. Rubén JustoJun 16, 2023
  13. 05/11 branch: fix a leak in setup_trackingRubén Justo, Jun 11, 2023
  14. Jeff KingJun 12, 2023
  15. Rubén JustoJun 16, 2023
  16. 06/11 branch: fix a leak in cmd_branchRubén Justo, Jun 11, 2023
  17. Jeff KingJun 12, 2023
  18. Rubén JustoJun 16, 2023
  19. 07/11 branch: fix a leak in inherit_trackingRubén Justo, Jun 11, 2023
  20. Jeff KingJun 12, 2023
  21. 08/11 branch: fix a leak in check_tracking_branchRubén Justo, Jun 11, 2023
  22. Jeff KingJun 12, 2023
  23. 09/11 branch: fix a leak in setup_trackingRubén Justo, Jun 11, 2023
  24. Jeff KingJun 12, 2023
  25. 10/11 config: fix a leak in git_config_copy_or_rename_section_in_fileRubén Justo, Jun 11, 2023
  26. Jeff KingJun 12, 2023
  27. Rubén JustoJun 16, 2023
  28. 11/11 tests: mark as passing with SANITIZE=leakRubén Justo, Jun 11, 2023
  29. Rubén JustoJun 11, 2023
  30. Jeff KingJun 12, 2023
  31. Rubén JustoJun 16, 2023
  32. Junio C HamanoJun 13, 2023
  33. 0/5 tests: mark as passing with SANITIZE=leakRubén Justo, Jun 16, 2023
  34. 1/5 rev-parse: fix a leak with --abbrev-refRubén Justo, Jun 16, 2023
  35. 2/5 branch: fix a leak in setup_trackingRubén Justo, Jun 16, 2023
  36. 3/5 branch: fix a leak in cmd_branchRubén Justo, Jun 16, 2023
  37. 4/5 config: fix a leak in git_config_copy_or_rename_section_in_fileRubén Justo, Jun 16, 2023
  38. 5/5 tests: mark as passing with SANITIZE=leakRubén Justo, Jun 16, 2023
  39. Junio C HamanoJun 16, 2023
  40. Jeff KingJun 17, 2023
  41. Rubén JustoJun 17, 2023
  42. 0/5 tests: mark as passing with SANITIZE=leakRubén Justo, Jun 17, 2023
  43. 1/5 rev-parse: fix a leak with --abbrev-refRubén Justo, Jun 17, 2023
  44. 2/5 branch: fix a leak in setup_trackingRubén Justo, Jun 17, 2023
  45. 3/5 branch: fix a leak in cmd_branchRubén Justo, Jun 17, 2023
  46. 4/5 config: fix a leak in git_config_copy_or_rename_section_in_fileRubén Justo, Jun 17, 2023
  47. 5/5 tests: mark as passing with SANITIZE=leakRubén Justo, Jun 17, 2023

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.