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

[PATCH 1/3] prune-packed: fix a possible buffer overflow

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Dec 17, 2013, 13:43 UTC
Message-ID
<1387287838-25779-2-git-send-email-mhagger@alum.mit.edu>
In-Reply-To
<1387287838-25779-1-git-send-email-mhagger@alum.mit.edu>
The pathname character array might hold:
    strlen(pathname) -- the pathname argument
    '/'              -- a slash, if not already present in pathname
    %02x/            -- the first two characters of the SHA-1 plus slash
    38 characters    -- the last 38 characters of the SHA-1
    NUL              -- terminator
    ---------------------
    strlen(pathname) + 43

(Actually, the NUL character is not written explicitly to pathname; rather, the code relies on pathname being initialized to zeros and the zero following the pathname still being there after the other characters are written to the array.)

But the old pathname variable was PATH_MAX characters long, whereas the check was (len > PATH_MAX - 42). So there might have been one byte too many stored in pathname. This would have resulted in it's not being NUL-terminated.

So, increase the size of the pathname variable by one byte to avoid this possibility.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 builtin/prune-packed.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/builtin/prune-packed.c b/builtin/prune-packed.c
index fa6ce42..81bc786 100644
--- a/builtin/prune-packed.c
+++ b/builtin/prune-packed.c
@@ -37,7 +37,7 @@ static void prune_dir(int i, DIR *dir, char *pathname, int len, int opts)
 void prune_packed_objects(int opts)
 {
 	int i;
-	static char pathname[PATH_MAX];
+	static char pathname[PATH_MAX + 1];
 	const char *dir = get_object_directory();
 	int len = strlen(dir);
 
@@ -45,7 +45,7 @@ void prune_packed_objects(int opts)
 		progress = start_progress_delay("Removing duplicate objects",
 			256, 95, 2);
 
-	if (len > PATH_MAX - 42)
+	if (len + 42 > PATH_MAX)
 		die("impossible object directory");
 	memcpy(pathname, dir, len);
 	if (len && pathname[len-1] != '/')
-- 
1.8.5.1
Previous: Michael HaggertyNext: Duy Nguyen
Message 2 of 21 in “Fix two buffer overflows and remove a redundant var”
  1. 0/3 Fix two buffer overflows and remove a redundant varMichael Haggerty, Dec 17, 2013
  2. 1/3 prune-packed: fix a possible buffer overflowMichael Haggerty, Dec 17, 2013
  3. Duy NguyenDec 17, 2013
  4. Junio C HamanoDec 17, 2013
  5. Michael HaggertyDec 18, 2013
  6. Jeff KingDec 19, 2013
  7. Michael HaggertyDec 19, 2013
  8. Jeff KingDec 20, 2013
  9. Duy NguyenDec 19, 2013
  10. 2/3 prune_object_dir(): verify that path fits in the temporary bufferMichael Haggerty, Dec 17, 2013
  11. Junio C HamanoDec 17, 2013
  12. Jeff KingDec 17, 2013
  13. Junio C HamanoDec 18, 2013
  14. Jeff KingDec 18, 2013
  15. Junio C HamanoDec 18, 2013
  16. Jeff KingDec 18, 2013
  17. Junio C HamanoDec 18, 2013
  18. Jeff KingDec 18, 2013
  19. Antoine PelisseDec 17, 2013
  20. 3/3 cmd_repack(): remove redundant local variable "nr_packs"Michael Haggerty, Dec 17, 2013
  21. Stefan BellerDec 17, 2013

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.