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

[PATCH 3/3] untracked-cache: simplify parsing by dropping "len"

From
Jeff King <peff@peff.net>
Date
Apr 18, 2019, 21:18 UTC
Message-ID
<20190418211835.GC18520@sigill.intra.peff.net>
In-Reply-To
<20190418211408.GA18011@sigill.intra.peff.net>

The code which parses untracked-cache extensions from disk keeps a "len" variable, which is the size of the string we are parsing. But since we now have an "end of string" variable, we can just use that to get the length when we need it. This eliminates the need to keep "len" up to date (and removes the possibility of any errors where "len" and "eos" get out of sync).

As a bonus, it means we are not storing a string length in an "int", which is a potential source of overflows (though in this case it seems fairly unlikely for that to cause any memory problems).

Signed-off-by: Jeff King <peff@peff.net>
---
 dir.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/dir.c b/dir.c
index 17865f44df..60438b2cdc 100644
--- a/dir.c
+++ b/dir.c
@@ -2735,7 +2735,7 @@ static int read_one_dir(struct untracked_cache_dir **untracked_,
 	const unsigned char *data = rd->data, *end = rd->end;
 	const unsigned char *eos;
 	unsigned int value;
-	int i, len;
+	int i;
 
 	memset(&ud, 0, sizeof(ud));
 
@@ -2756,28 +2756,25 @@ static int read_one_dir(struct untracked_cache_dir **untracked_,
 	eos = memchr(data, '\0', end - data);
 	if (!eos || eos == end)
 		return -1;
-	len = eos - data;
 
-	*untracked_ = untracked = xmalloc(st_add3(sizeof(*untracked), len, 1));
+	*untracked_ = untracked = xmalloc(st_add3(sizeof(*untracked), eos - data, 1));
 	memcpy(untracked, &ud, sizeof(ud));
-	memcpy(untracked->name, data, len + 1);
+	memcpy(untracked->name, data, eos - data + 1);
 	data = eos + 1;
 
 	for (i = 0; i < untracked->untracked_nr; i++) {
 		eos = memchr(data, '\0', end - data);
 		if (!eos || eos == end)
 			return -1;
-		len = eos - data;
-		untracked->untracked[i] = xmemdupz(data, len);
+		untracked->untracked[i] = xmemdupz(data, eos - data);
 		data = eos + 1;
 	}
 
 	rd->ucd[rd->index++] = untracked;
 	rd->data = data;
 
 	for (i = 0; i < untracked->dirs_nr; i++) {
-		len = read_one_dir(untracked->dirs + i, rd);
-		if (len < 0)
+		if (read_one_dir(untracked->dirs + i, rd) < 0)
 			return -1;
 	}
 	return 0;
-- 
2.21.0.1092.g8b0302e9c4
Previous: Junio C HamanoNext: Jeff King
Message 10 of 13 in “Fix an off-by-one bug in the untracked cache code”
  1. 0/1 Fix an off-by-one bug in the untracked cache codeJohannes Schindelin via GitGitGadget, Apr 10, 2019
  2. 1/1 untracked cache: fix off-by-oneJohannes Schindelin via GitGitGadget, Apr 10, 2019
  3. Jeff KingApr 10, 2019
  4. Junio C HamanoApr 12, 2019
  5. 0/3 untracked cache parsing fixupsJeff King, Apr 18, 2019
  6. 1/3 untracked-cache: be defensive about missing NULs in indexJeff King, Apr 18, 2019
  7. Junio C HamanoApr 19, 2019
  8. 2/3 untracked-cache: simplify parsing by dropping "next"Jeff King, Apr 18, 2019
  9. Junio C HamanoApr 19, 2019
  10. 3/3 untracked-cache: simplify parsing by dropping "len"Jeff King, Apr 18, 2019
  11. 4/3 untracked-cache: use FLEX_ALLOC to create internal structsJeff King, Apr 18, 2019
  12. Duy NguyenApr 19, 2019
  13. Jeff KingApr 19, 2019

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.