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

[PATCH] parse_object_buffer: Correct freeing the buffer.

From
Stefan Beller <stefanbeller@googlemail.com>
Date
Jul 17, 2013, 22:09 UTC
Message-ID
<1374098982-6962-1-git-send-email-stefanbeller@googlemail.com>
In-Reply-To
<51E715D8.9040307@googlemail.com>

If we exit early in the function parse_object_buffer, we did not write to *eaten_p. Then the calling function parse_object, which looks like the following with respect to the eaten variable, cannot rely on a proper value set in eaten, hence the freeing of the buffer depends on random values in memory.

	struct object *parse_object(const unsigned char *sha1)
	{
		int eaten;
		...
		obj = parse_object_buffer(sha1, type, size, buffer, &eaten);
		if (!eaten)
			free(buffer);
	}
This change makes sure, the buffer freeing condition is deterministic.
Signed-off-by: Stefan Beller <stefanbeller@googlemail.com>
---
 object.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/object.c b/object.c
index cbc7333..d8a4b1f 100644
--- a/object.c
+++ b/object.c
@@ -145,7 +145,7 @@ struct object *lookup_unknown_object(const unsigned char *sha1)
 struct object *parse_object_buffer(const unsigned char *sha1, enum object_type type, unsigned long size, void *buffer, int *eaten_p)
 {
 	struct object *obj;
-	int eaten = 0;
+	*eaten_p = 0;
 
 	obj = NULL;
 	if (type == OBJ_BLOB) {
@@ -164,7 +164,7 @@ struct object *parse_object_buffer(const unsigned char *sha1, enum object_type t
 			if (!tree->object.parsed) {
 				if (parse_tree_buffer(tree, buffer, size))
 					return NULL;
-				eaten = 1;
+				*eaten_p = 1;
 			}
 		}
 	} else if (type == OBJ_COMMIT) {
@@ -174,7 +174,7 @@ struct object *parse_object_buffer(const unsigned char *sha1, enum object_type t
 				return NULL;
 			if (!commit->buffer) {
 				commit->buffer = buffer;
-				eaten = 1;
+				*eaten_p = 1;
 			}
 			obj = &commit->object;
 		}
@@ -191,7 +191,6 @@ struct object *parse_object_buffer(const unsigned char *sha1, enum object_type t
 	}
 	if (obj && obj->type == OBJ_NONE)
 		obj->type = type;
-	*eaten_p = eaten;
 	return obj;
 }
 
-- 
1.8.3.3.754.g9c3c367.dirty
Previous: Stefan BellerNext: Stefan Beller
Message 9 of 12 in “Fix some sparse warnings”
  1. Fix some sparse warningsRamsay Jones, Jul 15, 2013
  2. Johannes SixtJul 16, 2013
  3. Jeff KingJul 16, 2013
  4. Philip OakleyJul 16, 2013
  5. Stefan BellerJul 16, 2013
  6. Philip OakleyJul 16, 2013
  7. Johannes SixtJul 17, 2013
  8. Stefan BellerJul 17, 2013
  9. parse_object_buffer: Correct freeing the buffer.Stefan Beller, Jul 17, 2013
  10. Stefan BellerJul 17, 2013
  11. Junio C HamanoJul 17, 2013
  12. Ramsay JonesJul 18, 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.