summaryrefslogtreecommitdiff
path: root/grep.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2021-09-21 03:51:28 (GMT)
committerJunio C Hamano <gitster@pobox.com>2021-09-22 18:59:50 (GMT)
commit1e66871608d1f6f4cd66e899ee33755bbf6deafa (patch)
treea49ccba002c03112965e659fe84d197869abab53 /grep.c
parent1a845fbc48f2613c0daab717ee934e066e65723d (diff)
downloadgit-1e66871608d1f6f4cd66e899ee33755bbf6deafa.zip
git-1e66871608d1f6f4cd66e899ee33755bbf6deafa.tar.gz
git-1e66871608d1f6f4cd66e899ee33755bbf6deafa.tar.bz2
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>
Diffstat (limited to 'grep.c')
-rw-r--r--grep.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/grep.c b/grep.c
index 9603ac1..14fe8a0 100644
--- a/grep.c
+++ b/grep.c
@@ -1821,7 +1821,8 @@ int grep_source(struct grep_opt *opt, struct grep_source *gs)
return grep_source_1(opt, gs, 0);
}
-static void grep_source_init_buf(struct grep_source *gs, char *buf,
+static void grep_source_init_buf(struct grep_source *gs,
+ const char *buf,
unsigned long size)
{
gs->type = GREP_SOURCE_BUF;
@@ -1833,7 +1834,7 @@ static void grep_source_init_buf(struct grep_source *gs, char *buf,
gs->identifier = NULL;
}
-int grep_buffer(struct grep_opt *opt, char *buf, unsigned long size)
+int grep_buffer(struct grep_opt *opt, const char *buf, unsigned long size)
{
struct grep_source gs;
int r;
@@ -1885,7 +1886,9 @@ void grep_source_clear_data(struct grep_source *gs)
switch (gs->type) {
case GREP_SOURCE_FILE:
case GREP_SOURCE_OID:
- FREE_AND_NULL(gs->buf);
+ /* these types own the buffer */
+ free((char *)gs->buf);
+ gs->buf = NULL;
gs->size = 0;
break;
case GREP_SOURCE_BUF: