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

[PATCH] server-info: avoid calling fclose(3) twice in update_info_file()

From
René Scharfe <l.s.r@web.de>
Date
Apr 16, 2017, 16:55 UTC
Message-ID
<137d732f-7a23-8a8a-9f2b-7f16bb361c5a@web.de>

If an error occurs when or after closing the stream we call fclose(3) again in the error handler. The second call can exhibit undefined behavior, so make sure to call fclose(3) at most once. Also avoid calling close(2) after fd has been successfully associated with the stream, as fclose(3) has become responsible for doing that beyond this point.

Found with Cppcheck.
Signed-off-by: Rene Scharfe <l.s.r@web.de>
---
 server-info.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/server-info.c b/server-info.c
index 7bc4e75d22..f6c1a3dfb0 100644
--- a/server-info.c
+++ b/server-info.c
@@ -14,19 +14,21 @@ static int update_info_file(char *path, int (*generate)(FILE *))
 	char *tmp = mkpathdup("%s_XXXXXX", path);
 	int ret = -1;
 	int fd = -1;
-	FILE *fp = NULL;
+	FILE *fp = NULL, *to_close;
 
 	safe_create_leading_directories(path);
 	fd = git_mkstemp_mode(tmp, 0666);
 	if (fd < 0)
 		goto out;
-	fp = fdopen(fd, "w");
+	to_close = fp = fdopen(fd, "w");
 	if (!fp)
 		goto out;
+	fd = -1;
 	ret = generate(fp);
 	if (ret)
 		goto out;
-	if (fclose(fp))
+	fp = NULL;
+	if (fclose(to_close))
 		goto out;
 	if (adjust_shared_perm(tmp) < 0)
 		goto out;
-- 
2.12.2
Next: Jeff King
Message 1 of 2 in “server-info: avoid calling fclose(3) twice in update_info_file()”
  1. server-info: avoid calling fclose(3) twice in update_info_file()René Scharfe, Apr 16, 2017
  2. Jeff KingApr 17, 2017

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.