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

[PATCH 1/5] grep: stop modifying buffer in strip_timestamp

From
Jeff King <peff@peff.net>
Date
Sep 21, 2021, 03:46 UTC
Message-ID
<YUlVsLkFGRfRqpKG@coredump.intra.peff.net>
In-Reply-To
<YUlVZk1xXulAqdef@coredump.intra.peff.net>

When grepping for headers in commit objects, we receive individual lines (e.g., "author Name <email> 1234 -0000"), and then strip off the timestamp to do our match. We do so by writing a NUL byte over the whitespace separator, and then remembering to restore it later.

We had to do it this way when this was added back in a4d7d2c6db (log --author/--committer: really match only with name part, 2008-09-04), because we fed the result directly to regexec(), which expects a NUL-terminated string. But since b7d36ffca0 (regex: use regexec_buf(), 2016-09-21), we have a function which can match part of a buffer.

So instead of modifying the string, we can instead just move the "eol" pointer, and the rest of the code will do the right thing. This will let further patches mark more buffers as "const".

Signed-off-by: Jeff King <peff@peff.net>
---
 grep.c | 13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)
diff --git a/grep.c b/grep.c
index 79598f245f..5b1f2da4d3 100644
--- a/grep.c
+++ b/grep.c
@@ -922,20 +922,16 @@ static int patmatch(struct grep_pat *p, char *line, char *eol,
 	return hit;
 }
 
-static int strip_timestamp(char *bol, char **eol_p)
+static void strip_timestamp(char *bol, char **eol_p)
 {
 	char *eol = *eol_p;
-	int ch;
 
 	while (bol < --eol) {
 		if (*eol != '>')
 			continue;
 		*eol_p = ++eol;
-		ch = *eol;
-		*eol = '\0';
-		return ch;
+		break;
 	}
-	return 0;
 }
 
 static struct {
@@ -952,7 +948,6 @@ static int match_one_pattern(struct grep_pat *p, char *bol, char *eol,
 			     regmatch_t *pmatch, int eflags)
 {
 	int hit = 0;
-	int saved_ch = 0;
 	const char *start = bol;
 
 	if ((p->token != GREP_PATTERN) &&
@@ -971,7 +966,7 @@ static int match_one_pattern(struct grep_pat *p, char *bol, char *eol,
 		switch (p->field) {
 		case GREP_HEADER_AUTHOR:
 		case GREP_HEADER_COMMITTER:
-			saved_ch = strip_timestamp(bol, &eol);
+			strip_timestamp(bol, &eol);
 			break;
 		default:
 			break;
@@ -1021,8 +1016,6 @@ static int match_one_pattern(struct grep_pat *p, char *bol, char *eol,
 				goto again;
 		}
 	}
-	if (p->token == GREP_PATTERN_HEAD && saved_ch)
-		*eol = saved_ch;
 	if (hit) {
 		pmatch[0].rm_so += bol - start;
 		pmatch[0].rm_eo += bol - start;
-- 
2.33.0.1023.gc687d0d3c8
Previous: Jeff KingNext: Carlo Arenas
Message 2 of 32 in “const-correctness in grep.c”
  1. 0/5 const-correctness in grep.cJeff King, Sep 21, 2021
  2. 1/5 grep: stop modifying buffer in strip_timestampJeff King, Sep 21, 2021
  3. Carlo ArenasSep 21, 2021
  4. Eric SunshineSep 21, 2021
  5. Carlo ArenasSep 21, 2021
  6. Jeff KingSep 21, 2021
  7. Carlo Marcelo Arenas BelónSep 21, 2021
  8. René ScharfeSep 21, 2021
  9. Jeff KingSep 21, 2021
  10. Ævar Arnfjörð BjarmasonSep 21, 2021
  11. Jeff KingSep 22, 2021
  12. Ævar Arnfjörð BjarmasonSep 23, 2021
  13. 2/5 grep: stop modifying buffer in show_line()Jeff King, Sep 21, 2021
  14. Taylor BlauSep 21, 2021
  15. Jeff KingSep 21, 2021
  16. Taylor BlauSep 21, 2021
  17. 3/5 grep: stop modifying buffer in grep_source_1()Jeff King, Sep 21, 2021
  18. 4/5 grep: mark "haystack" buffers as constJeff King, Sep 21, 2021
  19. Ævar Arnfjörð BjarmasonSep 21, 2021
  20. Jeff KingSep 21, 2021
  21. 5/5 grep: store grep_source buffer as constJeff King, Sep 21, 2021
  22. Taylor BlauSep 21, 2021
  23. Ævar Arnfjörð BjarmasonSep 21, 2021
  24. Jeff KingSep 21, 2021
  25. 6/5 grep.c: mark eol/bol and derived as "const char * const"Ævar Arnfjörð Bjarmason, Sep 21, 2021
  26. Jeff KingSep 21, 2021
  27. Ævar Arnfjörð BjarmasonSep 21, 2021
  28. Jeff KingSep 21, 2021
  29. Ævar Arnfjörð BjarmasonSep 23, 2021
  30. Junio C HamanoSep 24, 2021
  31. Junio C HamanoSep 22, 2021
  32. Junio C HamanoSep 22, 2021

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.