threads / patch / 63816

patch, 4 partsFix resource leaks in various helpers and builtin commands

Subject: [PATCH 0/4] Fix resource leaks in various helpers and builtin commands

## tl;dr

5 messages between Jul 22, 2025 and Jul 22, 2025. Diffs are folded; open one to read it.

replies: 4people: 1as markdown or json

Hoyoung Lee· Jul 22, 2025, 07:36 UTC · lore

This patch series fixes several cases where file descriptors were not properly closed on error paths. The changes affect helper programs and a builtin command, and ensure that system resources are correctly released before returning from the function.

Each fix is minimal and follows the existing style of the surrounding code. These changes help improve the robustness of the code by avoiding potential file descriptor leaks.

Hoyoung Lee (4):
  t/helper/test-truncate: close file descriptor after truncation
  builtin/archive: close file descriptor on dup2() failure
  t/helper/test-delta: close fd if fstat() fails after open()
  t/helper/test-delta: close fd if fstat() fails after second open()
 builtin/archive.c        | 1 +
 t/helper/test-delta.c    | 3 +++
 t/helper/test-truncate.c | 3 +++
 3 files changed, 7 insertions(+)
-- 
2.34.1
Hoyoung Lee· Jul 22, 2025, 07:36 UTC · re: Hoyoung Lee · lore

[PATCH 1/4] t/helper/test-truncate: close file descriptor after truncation

Fix a resource leak where the file descriptor was not closed after truncating a file in t/helper/test-truncate.c.

Signed-off-by: Hoyoung Lee <lhywkd22@gmail.com>
---
 t/helper/test-truncate.c | 3 +++
 1 file changed, 3 insertions(+)
Show changes to t/helper/test-truncate.c +3 −0
diff --git a/t/helper/test-truncate.c b/t/helper/test-truncate.c
index 3931deaec7..104bc36cc0 100644
--- a/t/helper/test-truncate.c
+++ b/t/helper/test-truncate.c
@@ -21,5 +21,8 @@ int cmd__truncate(int argc, const char **argv)
 
 	if (ftruncate(fd, (off_t) sz) < 0)
 		die_errno("failed to truncate file");
+	
+	close(fd);
+
 	return 0;
 }
-- 
2.34.1
Hoyoung Lee· Jul 22, 2025, 07:36 UTC · re: Hoyoung Lee · lore

[PATCH 2/4] builtin/archive: close file descriptor on dup2() failure

In create_output_file(), the file descriptor returned by xopen() was not closed if dup2() failed. This leads to a potential resource leak. Ensure the file descriptor is closed regardless of whether dup2() succeeds or fails.

Signed-off-by: Hoyoung Lee <lhywkd22@gmail.com>
---
 builtin/archive.c | 1 +
 1 file changed, 1 insertion(+)
Show changes to builtin/archive.c +1 −0
diff --git a/builtin/archive.c b/builtin/archive.c
index 13ea7308c8..c919a39f90 100644
--- a/builtin/archive.c
+++ b/builtin/archive.c
@@ -14,6 +14,7 @@ static void create_output_file(const char *output_file)
 	int output_fd = xopen(output_file, O_CREAT | O_WRONLY | O_TRUNC, 0666);
 	if (output_fd != 1) {
 		if (dup2(output_fd, 1) < 0)
+			close(output_fd);
 			die_errno(_("could not redirect output"));
 		else
 			close(output_fd);
-- 
2.34.1
Hoyoung Lee· Jul 22, 2025, 07:36 UTC · re: Hoyoung Lee · lore

[PATCH 3/4] t/helper/test-delta: close fd if fstat() fails after open()

If open() succeeds but fstat() fails, the file descriptor is not closed, causing a resource leak. This patch adds a close(fd) call in the failure path after fstat() to ensure proper resource cleanup.

Signed-off-by: Hoyoung Lee <lhywkd22@gmail.com>
---
 t/helper/test-delta.c | 1 +
 1 file changed, 1 insertion(+)
Show changes to t/helper/test-delta.c +1 −0
diff --git a/t/helper/test-delta.c b/t/helper/test-delta.c
index 6bc787a474..103bf7f3e9 100644
--- a/t/helper/test-delta.c
+++ b/t/helper/test-delta.c
@@ -31,6 +31,7 @@ int cmd__delta(int argc, const char **argv)
 	fd = open(argv[2], O_RDONLY);
 	if (fd < 0 || fstat(fd, &st)) {
 		perror(argv[2]);
+		close(fd);
 		return 1;
 	}
 	from_size = st.st_size;
-- 
2.34.1
Hoyoung Lee· Jul 22, 2025, 07:36 UTC · re: Hoyoung Lee · lore

[PATCH 4/4] t/helper/test-delta: close fd if fstat() fails after second open()

When opening argv[3], if open() succeeds but fstat() fails, the file descriptor is not closed, resulting in a resource leak. This patch ensures that the descriptor is closed on failure.

Signed-off-by: Hoyoung Lee <lhywkd22@gmail.com>
---
 t/helper/test-delta.c | 2 ++
 1 file changed, 2 insertions(+)
Show changes to t/helper/test-delta.c +2 −0
diff --git a/t/helper/test-delta.c b/t/helper/test-delta.c
index 103bf7f3e9..ba2d897aa3 100644
--- a/t/helper/test-delta.c
+++ b/t/helper/test-delta.c
@@ -46,6 +46,8 @@ int cmd__delta(int argc, const char **argv)
 	fd = open(argv[3], O_RDONLY);
 	if (fd < 0 || fstat(fd, &st)) {
 		perror(argv[3]);
+		if (fd >= 0)
+			close(fd);
 		goto cleanup;
 	}
 	data_size = st.st_size;
-- 
2.34.1

← back to recent threads