grep: store grep_source buffer as const

Our grep_buffer() function takes a non-const buffer, which is confusing: we don't take ownership of nor write to the buffer. This mostly comes from the fact that the underlying grep_source struct in which we store the buffer uses non-const pointer. The memory pointed to by the struct is sometimes owned by us (for FILE or OID sources), and sometimes not (for BUF sources). Let's store it as const, which lets us err on the side of caution (i.e., the compiler will warn us if any of our code writes to or tries to free it). As a result, we must annotate the one place where we do free it by casting away the constness. But that's a small price to pay for the extra safety and clarity elsewhere (and indeed, it already had a comment explaining why GREP_SOURCE_BUF _didn't_ free it). And then we can mark grep_buffer() as taking a const buffer. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Sep 20, 2021 at 23:51 UTC 1e66871608d1f6f4cd66e899ee33755bbf6deafa
2 files changed +8 -5
grep.c
+6 -3
@@ -1821,7 +1821,8 @@ int grep_source(struct grep_opt *opt, struct grep_source *gs)
1821 return grep_source_1(opt, gs, 0);
1822 }
1823
1824 -static void grep_source_init_buf(struct grep_source *gs, char *buf,
1824 +static void grep_source_init_buf(struct grep_source *gs,
1825 + const char *buf,
1826 unsigned long size)
1827 {
1828 gs->type = GREP_SOURCE_BUF;
@@ -1833,7 +1834,7 @@ static void grep_source_init_buf(struct grep_source *gs, char *buf,
1834 gs->identifier = NULL;
1835 }
1836
1836 -int grep_buffer(struct grep_opt *opt, char *buf, unsigned long size)
1837 +int grep_buffer(struct grep_opt *opt, const char *buf, unsigned long size)
1838 {
1839 struct grep_source gs;
1840 int r;
@@ -1885,7 +1886,9 @@ void grep_source_clear_data(struct grep_source *gs)
1886 switch (gs->type) {
1887 case GREP_SOURCE_FILE:
1888 case GREP_SOURCE_OID:
1888 - FREE_AND_NULL(gs->buf);
1889 + /* these types own the buffer */
1890 + free((char *)gs->buf);
1891 + gs->buf = NULL;
1892 gs->size = 0;
1893 break;
1894 case GREP_SOURCE_BUF:
grep.h
+2 -2
@@ -189,7 +189,7 @@ void append_grep_pattern(struct grep_opt *opt, const char *pat, const char *orig
189 void append_header_grep_pattern(struct grep_opt *, enum grep_header_field, const char *);
190 void compile_grep_patterns(struct grep_opt *opt);
191 void free_grep_patterns(struct grep_opt *opt);
192 -int grep_buffer(struct grep_opt *opt, char *buf, unsigned long size);
192 +int grep_buffer(struct grep_opt *opt, const char *buf, unsigned long size);
193
194 struct grep_source {
195 char *name;
@@ -202,7 +202,7 @@ struct grep_source {
202 void *identifier;
203 struct repository *repo; /* if GREP_SOURCE_OID */
204
205 - char *buf;
205 + const char *buf;
206 unsigned long size;
207
208 char *path; /* for attribute lookups */