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

[PATCH v4 00/22] Memory leak fixes (pt.4)

From
Patrick Steinhardt <ps@pks.im>
Date
Aug 14, 2024, 06:51 UTC
Message-ID
<cover.1723614263.git.ps@pks.im>
In-Reply-To
<cover.1722933642.git.ps@pks.im>
Hi,

this is the fourth version of my fourth set of memory leak fixes. There are only minor changes compared to v3:

  - Amend a commit message to explain that `release_revisions()` takes
    care of releasing `rev.diffopt` for us.
  - Fix another memory leak in `get_base_commit()`.
  - Remove `NULL` pointer check in `symdiff_release()` and stop
    zero-initializing `struct symdiff`.
Thanks!
Patrick
Patrick Steinhardt (22):
  remote: plug memory leak when aliasing URLs
  git: fix leaking system paths
  object-file: fix memory leak when reading corrupted headers
  object-name: fix leaking symlink paths in object context
  bulk-checkin: fix leaking state TODO
  read-cache: fix leaking hashfile when writing index fails
  submodule-config: fix leaking name entry when traversing submodules
  config: fix leaking comment character config
  builtin/rebase: fix leaking `commit.gpgsign` value
  builtin/notes: fix leaking `struct notes_tree` when merging notes
  builtin/fast-import: plug trivial memory leaks
  builtin/fast-export: fix leaking diff options
  builtin/fast-export: plug leaking tag names
  merge-ort: unconditionally release attributes index
  sequencer: release todo list on error paths
  unpack-trees: clear index when not propagating it
  diff: fix leak when parsing invalid ignore regex option
  builtin/format-patch: fix various trivial memory leaks
  userdiff: fix leaking memory for configured diff drivers
  builtin/log: fix leak when showing converted blob contents
  diff: free state populated via options
  builtin/diff: free symmetric diff members
 builtin/commit.c                      |  7 +-
 builtin/diff.c                        |  6 ++
 builtin/fast-export.c                 | 19 ++++--
 builtin/fast-import.c                 |  8 ++-
 builtin/log.c                         | 14 +++-
 builtin/notes.c                       |  9 ++-
 builtin/rebase.c                      |  1 +
 bulk-checkin.c                        |  2 +
 config.c                              |  3 +-
 csum-file.c                           |  2 +-
 csum-file.h                           | 10 +++
 diff.c                                | 16 ++++-
 environment.c                         |  1 +
 environment.h                         |  1 +
 git.c                                 | 13 +++-
 merge-ort.c                           |  3 +-
 object-file.c                         |  1 +
 object-name.c                         |  1 +
 range-diff.c                          |  6 +-
 read-cache.c                          | 97 ++++++++++++++++-----------
 remote.c                              |  2 +
 sequencer.c                           | 67 ++++++++++++------
 submodule-config.c                    | 18 +++--
 t/t0210-trace2-normal.sh              |  2 +-
 t/t1006-cat-file.sh                   |  1 +
 t/t1050-large.sh                      |  1 +
 t/t1450-fsck.sh                       |  1 +
 t/t1601-index-bogus.sh                |  2 +
 t/t2107-update-index-basic.sh         |  1 +
 t/t3310-notes-merge-manual-resolve.sh |  1 +
 t/t3311-notes-merge-fanout.sh         |  1 +
 t/t3404-rebase-interactive.sh         |  1 +
 t/t3435-rebase-gpg-sign.sh            |  1 +
 t/t3507-cherry-pick-conflict.sh       |  1 +
 t/t3510-cherry-pick-sequence.sh       |  1 +
 t/t3705-add-sparse-checkout.sh        |  1 +
 t/t4013-diff-various.sh               |  1 +
 t/t4014-format-patch.sh               |  1 +
 t/t4018-diff-funcname.sh              |  1 +
 t/t4030-diff-textconv.sh              |  2 +
 t/t4042-diff-textconv-caching.sh      |  2 +
 t/t4048-diff-combined-binary.sh       |  1 +
 t/t4064-diff-oidfind.sh               |  2 +
 t/t4065-diff-anchored.sh              |  1 +
 t/t4068-diff-symmetric-merge-base.sh  |  1 +
 t/t4069-remerge-diff.sh               |  1 +
 t/t4108-apply-threeway.sh             |  1 +
 t/t4209-log-pickaxe.sh                |  2 +
 t/t6421-merge-partial-clone.sh        |  1 +
 t/t6428-merge-conflicts-sparse.sh     |  1 +
 t/t7008-filter-branch-null-sha1.sh    |  1 +
 t/t7030-verify-tag.sh                 |  1 +
 t/t7817-grep-sparse-checkout.sh       |  1 +
 t/t9300-fast-import.sh                |  1 +
 t/t9304-fast-import-marks.sh          |  2 +
 t/t9351-fast-export-anonymize.sh      |  1 +
 unpack-trees.c                        |  2 +
 userdiff.c                            | 38 ++++++++---
 userdiff.h                            |  4 ++
 59 files changed, 286 insertions(+), 105 deletions(-)
Range-diff against v3:
 1:  02f6da020f =  1:  02f6da020f remote: plug memory leak when aliasing URLs
 2:  f36d895948 =  2:  f36d895948 git: fix leaking system paths
 3:  0415ac986d =  3:  0415ac986d object-file: fix memory leak when reading corrupted headers
 4:  e5130e50a9 =  4:  e5130e50a9 object-name: fix leaking symlink paths in object context
 5:  276c828ad1 =  5:  276c828ad1 bulk-checkin: fix leaking state TODO
 6:  ed0608e705 =  6:  ed0608e705 read-cache: fix leaking hashfile when writing index fails
 7:  b7a7f88c7d =  7:  b7a7f88c7d submodule-config: fix leaking name entry when traversing submodules
 8:  9054a459a1 =  8:  9054a459a1 config: fix leaking comment character config
 9:  1d3957a5eb =  9:  1d3957a5eb builtin/rebase: fix leaking `commit.gpgsign` value
10:  0af1bab5a1 = 10:  0af1bab5a1 builtin/notes: fix leaking `struct notes_tree` when merging notes
11:  30d4e9ed43 = 11:  30d4e9ed43 builtin/fast-import: plug trivial memory leaks
12:  9591fb7b5e ! 12:  070813a740 builtin/fast-export: fix leaking diff options
    @@ Commit message
     
         Before calling `handle_commit()` in a loop, we set `diffopt.no_free`
         such that its contents aren't getting freed inside of `handle_commit()`.
    -    We never unset that flag though, which means that it'll ultimately leak
    -    when calling `release_revisions()`.
    +    We never unset that flag though, which means that the structure's
    +    allocated resources will ultimately leak.
     
    -    Fix this by unsetting the flag after the loop.
    +    Fix this by unsetting the flag after the loop such that we release its
    +    resources via `release_revisions()`.
     
         Signed-off-by: Patrick Steinhardt <ps@pks.im>
     
13:  254bbb7f6f = 13:  b4096e971f builtin/fast-export: plug leaking tag names
14:  334c4ed71a = 14:  bdfdf53313 merge-ort: unconditionally release attributes index
15:  9f08a859fb = 15:  f6c1055805 sequencer: release todo list on error paths
16:  5d4934b1a9 = 16:  9db41181a6 unpack-trees: clear index when not propagating it
17:  e1b6a24fbe = 17:  85f6ffd610 diff: fix leak when parsing invalid ignore regex option
18:  c048b54a2c ! 18:  e00aa1ef06 builtin/format-patch: fix various trivial memory leaks
    @@ Commit message
     
      ## builtin/log.c ##
     @@ builtin/log.c: static struct commit *get_base_commit(const struct format_config *cfg,
    + 				if (die_on_failure) {
    + 					die(_("failed to find exact merge base"));
    + 				} else {
    ++					free_commit_list(merge_base);
    + 					free(rev);
    + 					return NULL;
    + 				}
      			}
      
      			rev[i] = merge_base->item;
19:  39b2921e3e = 19:  cc04751134 userdiff: fix leaking memory for configured diff drivers
20:  50dea1c98a = 20:  0e2d3e523f builtin/log: fix leak when showing converted blob contents
21:  d5cb4ad580 = 21:  9faffa7a62 diff: free state populated via options
22:  31e38ba4e1 ! 22:  ee252e752c builtin/diff: free symmetric diff members
    @@ builtin/diff.c: static void symdiff_prepare(struct rev_info *rev, struct symdiff
      
     +static void symdiff_release(struct symdiff *sdiff)
     +{
    -+	if (!sdiff)
    -+		return;
     +	bitmap_free(sdiff->skip);
     +}
     +
      int cmd_diff(int argc, const char **argv, const char *prefix)
      {
      	int i;
    -@@ builtin/diff.c: int cmd_diff(int argc, const char **argv, const char *prefix)
    - 	struct object_array_entry *blob[2];
    - 	int nongit = 0, no_index = 0;
    - 	int result;
    --	struct symdiff sdiff;
    -+	struct symdiff sdiff = {0};
    - 
    - 	/*
    - 	 * We could get N tree-ish in the rev.pending_objects list.
     @@ builtin/diff.c: int cmd_diff(int argc, const char **argv, const char *prefix)
      		refresh_index_quietly();
      	release_revisions(&rev);
-- 
2.46.0.46.g406f326d27.dirty
Previous: Junio C HamanoNext: Patrick Steinhardt
Message 124 of 146 in “Memory leak fixes (pt.4)”
  1. 00/22 Memory leak fixes (pt.4)Patrick Steinhardt, Aug 6, 2024
  2. 01/22 remote: plug memory leak when aliasing URLsPatrick Steinhardt, Aug 6, 2024
  3. 02/22 git: fix leaking system pathsPatrick Steinhardt, Aug 6, 2024
  4. James LiuAug 7, 2024
  5. 03/22 object-file: fix memory leak when reading corrupted headersPatrick Steinhardt, Aug 6, 2024
  6. 04/22 object-name: fix leaking symlink paths in object contextPatrick Steinhardt, Aug 6, 2024
  7. 05/22 bulk-checkin: fix leaking state TODOPatrick Steinhardt, Aug 6, 2024
  8. 06/22 read-cache: fix leaking hashfile when writing index failsPatrick Steinhardt, Aug 6, 2024
  9. James LiuAug 7, 2024
  10. Patrick SteinhardtAug 8, 2024
  11. 07/22 submodule-config: fix leaking name enrty when traversing submodulesPatrick Steinhardt, Aug 6, 2024
  12. 08/22 config: fix leaking comment character configPatrick Steinhardt, Aug 6, 2024
  13. James LiuAug 7, 2024
  14. Patrick SteinhardtAug 8, 2024
  15. Junio C HamanoAug 8, 2024
  16. 09/22 builtin/rebase: fix leaking `commit.gpgsign` valuePatrick Steinhardt, Aug 6, 2024
  17. James LiuAug 7, 2024
  18. Patrick SteinhardtAug 8, 2024
  19. Phillip WoodAug 8, 2024
  20. Patrick SteinhardtAug 8, 2024
  21. 10/22 builtin/notes: fix leaking `struct notes_tree` when merging notesPatrick Steinhardt, Aug 6, 2024
  22. 11/22 builtin/fast-import: plug trivial memory leaksPatrick Steinhardt, Aug 6, 2024
  23. 12/22 builtin/fast-export: fix leaking diff optionsPatrick Steinhardt, Aug 6, 2024
  24. 13/22 builtin/fast-export: plug leaking tag namesPatrick Steinhardt, Aug 6, 2024
  25. James LiuAug 7, 2024
  26. Patrick SteinhardtAug 8, 2024
  27. 14/22 merge-ort: unconditionally release attributes indexPatrick Steinhardt, Aug 6, 2024
  28. 15/22 sequencer: release todo list on error pathsPatrick Steinhardt, Aug 6, 2024
  29. Phillip WoodAug 8, 2024
  30. Junio C HamanoAug 8, 2024
  31. 16/22 unpack-trees: clear index when not propagating itPatrick Steinhardt, Aug 6, 2024
  32. 17/22 diff: fix leak when parsing invalid ignore regex optionPatrick Steinhardt, Aug 6, 2024
  33. 18/22 builtin/format-patch: fix various trivial memory leaksPatrick Steinhardt, Aug 6, 2024
  34. James LiuAug 7, 2024
  35. Patrick SteinhardtAug 8, 2024
  36. 19/22 userdiff: fix leaking memory for configured diff driversPatrick Steinhardt, Aug 6, 2024
  37. James LiuAug 7, 2024
  38. Patrick SteinhardtAug 8, 2024
  39. Junio C HamanoAug 8, 2024
  40. 20/22 builtin/log: fix leak when showing converted blob contentsPatrick Steinhardt, Aug 6, 2024
  41. 21/22 diff: free state populated via optionsPatrick Steinhardt, Aug 6, 2024
  42. 22/22 builtin/diff: free symmetric diff membersPatrick Steinhardt, Aug 6, 2024
  43. James LiuAug 7, 2024
  44. Patrick SteinhardtAug 8, 2024
  45. James LiuAug 8, 2024
  46. Junio C HamanoAug 7, 2024
  47. Patrick SteinhardtAug 7, 2024
  48. Junio C HamanoAug 8, 2024
  49. 00/22 Memory leak fixes (pt.4)Patrick Steinhardt, Aug 8, 2024
  50. 01/22 remote: plug memory leak when aliasing URLsPatrick Steinhardt, Aug 8, 2024
  51. karthik nayakAug 12, 2024
  52. Taylor BlauAug 12, 2024
  53. Jeff KingAug 12, 2024
  54. Patrick SteinhardtAug 13, 2024
  55. 02/22 git: fix leaking system pathsPatrick Steinhardt, Aug 8, 2024
  56. Taylor BlauAug 12, 2024
  57. Patrick SteinhardtAug 13, 2024
  58. Junio C HamanoAug 13, 2024
  59. 03/22 object-file: fix memory leak when reading corrupted headersPatrick Steinhardt, Aug 8, 2024
  60. karthik nayakAug 12, 2024
  61. 04/22 object-name: fix leaking symlink paths in object contextPatrick Steinhardt, Aug 8, 2024
  62. 05/22 bulk-checkin: fix leaking state TODOPatrick Steinhardt, Aug 8, 2024
  63. 06/22 read-cache: fix leaking hashfile when writing index failsPatrick Steinhardt, Aug 8, 2024
  64. 07/22 submodule-config: fix leaking name enrty when traversing submodulesPatrick Steinhardt, Aug 8, 2024
  65. 08/22 config: fix leaking comment character configPatrick Steinhardt, Aug 8, 2024
  66. Junio C HamanoAug 8, 2024
  67. Patrick SteinhardtAug 12, 2024
  68. Junio C HamanoAug 12, 2024
  69. Patrick SteinhardtAug 13, 2024
  70. 09/22 builtin/rebase: fix leaking `commit.gpgsign` valuePatrick Steinhardt, Aug 8, 2024
  71. 10/22 builtin/notes: fix leaking `struct notes_tree` when merging notesPatrick Steinhardt, Aug 8, 2024
  72. 11/22 builtin/fast-import: plug trivial memory leaksPatrick Steinhardt, Aug 8, 2024
  73. 12/22 builtin/fast-export: fix leaking diff optionsPatrick Steinhardt, Aug 8, 2024
  74. karthik nayakAug 12, 2024
  75. 13/22 builtin/fast-export: plug leaking tag namesPatrick Steinhardt, Aug 8, 2024
  76. 14/22 merge-ort: unconditionally release attributes indexPatrick Steinhardt, Aug 8, 2024
  77. 15/22 sequencer: release todo list on error pathsPatrick Steinhardt, Aug 8, 2024
  78. 16/22 unpack-trees: clear index when not propagating itPatrick Steinhardt, Aug 8, 2024
  79. 17/22 diff: fix leak when parsing invalid ignore regex optionPatrick Steinhardt, Aug 8, 2024
  80. 18/22 builtin/format-patch: fix various trivial memory leaksPatrick Steinhardt, Aug 8, 2024
  81. 19/22 userdiff: fix leaking memory for configured diff driversPatrick Steinhardt, Aug 8, 2024
  82. 20/22 builtin/log: fix leak when showing converted blob contentsPatrick Steinhardt, Aug 8, 2024
  83. 21/22 diff: free state populated via optionsPatrick Steinhardt, Aug 8, 2024
  84. 22/22 builtin/diff: free symmetric diff membersPatrick Steinhardt, Aug 8, 2024
  85. karthik nayakAug 12, 2024
  86. karthik nayakAug 12, 2024
  87. Junio C HamanoAug 12, 2024
  88. Patrick SteinhardtAug 13, 2024
  89. Phillip WoodAug 12, 2024
  90. Junio C HamanoAug 12, 2024
  91. 00/22 Memory leak fixes (pt.4)Patrick Steinhardt, Aug 13, 2024
  92. 01/22 remote: plug memory leak when aliasing URLsPatrick Steinhardt, Aug 13, 2024
  93. 02/22 git: fix leaking system pathsPatrick Steinhardt, Aug 13, 2024
  94. 03/22 object-file: fix memory leak when reading corrupted headersPatrick Steinhardt, Aug 13, 2024
  95. 04/22 object-name: fix leaking symlink paths in object contextPatrick Steinhardt, Aug 13, 2024
  96. 05/22 bulk-checkin: fix leaking state TODOPatrick Steinhardt, Aug 13, 2024
  97. 06/22 read-cache: fix leaking hashfile when writing index failsPatrick Steinhardt, Aug 13, 2024
  98. 07/22 submodule-config: fix leaking name entry when traversing submodulesPatrick Steinhardt, Aug 13, 2024
  99. 08/22 config: fix leaking comment character configPatrick Steinhardt, Aug 13, 2024
  100. 09/22 builtin/rebase: fix leaking `commit.gpgsign` valuePatrick Steinhardt, Aug 13, 2024
  101. 10/22 builtin/notes: fix leaking `struct notes_tree` when merging notesPatrick Steinhardt, Aug 13, 2024
  102. 11/22 builtin/fast-import: plug trivial memory leaksPatrick Steinhardt, Aug 13, 2024
  103. 12/22 builtin/fast-export: fix leaking diff optionsPatrick Steinhardt, Aug 13, 2024
  104. Junio C HamanoAug 13, 2024
  105. Patrick SteinhardtAug 14, 2024
  106. 13/22 builtin/fast-export: plug leaking tag namesPatrick Steinhardt, Aug 13, 2024
  107. 14/22 merge-ort: unconditionally release attributes indexPatrick Steinhardt, Aug 13, 2024
  108. 15/22 sequencer: release todo list on error pathsPatrick Steinhardt, Aug 13, 2024
  109. 16/22 unpack-trees: clear index when not propagating itPatrick Steinhardt, Aug 13, 2024
  110. 17/22 diff: fix leak when parsing invalid ignore regex optionPatrick Steinhardt, Aug 13, 2024
  111. 18/22 builtin/format-patch: fix various trivial memory leaksPatrick Steinhardt, Aug 13, 2024
  112. Junio C HamanoAug 13, 2024
  113. Patrick SteinhardtAug 14, 2024
  114. Junio C HamanoAug 13, 2024
  115. 19/22 userdiff: fix leaking memory for configured diff driversPatrick Steinhardt, Aug 13, 2024
  116. 20/22 builtin/log: fix leak when showing converted blob contentsPatrick Steinhardt, Aug 13, 2024
  117. 21/22 diff: free state populated via optionsPatrick Steinhardt, Aug 13, 2024
  118. Junio C HamanoAug 13, 2024
  119. 22/22 builtin/diff: free symmetric diff membersPatrick Steinhardt, Aug 13, 2024
  120. Junio C HamanoAug 13, 2024
  121. Patrick SteinhardtAug 14, 2024
  122. Junio C HamanoAug 14, 2024
  123. Junio C HamanoAug 13, 2024
  124. 00/22 Memory leak fixes (pt.4)Patrick Steinhardt, Aug 14, 2024
  125. 01/22 remote: plug memory leak when aliasing URLsPatrick Steinhardt, Aug 14, 2024
  126. 02/22 git: fix leaking system pathsPatrick Steinhardt, Aug 14, 2024
  127. 03/22 object-file: fix memory leak when reading corrupted headersPatrick Steinhardt, Aug 14, 2024
  128. 04/22 object-name: fix leaking symlink paths in object contextPatrick Steinhardt, Aug 14, 2024
  129. 05/22 bulk-checkin: fix leaking state TODOPatrick Steinhardt, Aug 14, 2024
  130. 06/22 read-cache: fix leaking hashfile when writing index failsPatrick Steinhardt, Aug 14, 2024
  131. 07/22 submodule-config: fix leaking name entry when traversing submodulesPatrick Steinhardt, Aug 14, 2024
  132. 08/22 config: fix leaking comment character configPatrick Steinhardt, Aug 14, 2024
  133. 09/22 builtin/rebase: fix leaking `commit.gpgsign` valuePatrick Steinhardt, Aug 14, 2024
  134. 10/22 builtin/notes: fix leaking `struct notes_tree` when merging notesPatrick Steinhardt, Aug 14, 2024
  135. 11/22 builtin/fast-import: plug trivial memory leaksPatrick Steinhardt, Aug 14, 2024
  136. 12/22 builtin/fast-export: fix leaking diff optionsPatrick Steinhardt, Aug 14, 2024
  137. 13/22 builtin/fast-export: plug leaking tag namesPatrick Steinhardt, Aug 14, 2024
  138. 14/22 merge-ort: unconditionally release attributes indexPatrick Steinhardt, Aug 14, 2024
  139. 15/22 sequencer: release todo list on error pathsPatrick Steinhardt, Aug 14, 2024
  140. 16/22 unpack-trees: clear index when not propagating itPatrick Steinhardt, Aug 14, 2024
  141. 17/22 diff: fix leak when parsing invalid ignore regex optionPatrick Steinhardt, Aug 14, 2024
  142. 18/22 builtin/format-patch: fix various trivial memory leaksPatrick Steinhardt, Aug 14, 2024
  143. 19/22 userdiff: fix leaking memory for configured diff driversPatrick Steinhardt, Aug 14, 2024
  144. 20/22 builtin/log: fix leak when showing converted blob contentsPatrick Steinhardt, Aug 14, 2024
  145. 21/22 diff: free state populated via optionsPatrick Steinhardt, Aug 14, 2024
  146. 22/22 builtin/diff: free symmetric diff membersPatrick Steinhardt, Aug 14, 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.