Skip to content

Commit 1e66871

Browse files
peffgitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 1a845fb commit 1e66871

File tree

2 files changed

+8
-5
lines changed

2 files changed

+8
-5
lines changed

grep.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1821,7 +1821,8 @@ int grep_source(struct grep_opt *opt, struct grep_source *gs)
18211821
return grep_source_1(opt, gs, 0);
18221822
}
18231823

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,
18251826
unsigned long size)
18261827
{
18271828
gs->type = GREP_SOURCE_BUF;
@@ -1833,7 +1834,7 @@ static void grep_source_init_buf(struct grep_source *gs, char *buf,
18331834
gs->identifier = NULL;
18341835
}
18351836

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)
18371838
{
18381839
struct grep_source gs;
18391840
int r;
@@ -1885,7 +1886,9 @@ void grep_source_clear_data(struct grep_source *gs)
18851886
switch (gs->type) {
18861887
case GREP_SOURCE_FILE:
18871888
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;
18891892
gs->size = 0;
18901893
break;
18911894
case GREP_SOURCE_BUF:

grep.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ void append_grep_pattern(struct grep_opt *opt, const char *pat, const char *orig
189189
void append_header_grep_pattern(struct grep_opt *, enum grep_header_field, const char *);
190190
void compile_grep_patterns(struct grep_opt *opt);
191191
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);
193193

194194
struct grep_source {
195195
char *name;
@@ -202,7 +202,7 @@ struct grep_source {
202202
void *identifier;
203203
struct repository *repo; /* if GREP_SOURCE_OID */
204204

205-
char *buf;
205+
const char *buf;
206206
unsigned long size;
207207

208208
char *path; /* for attribute lookups */

0 commit comments

Comments
 (0)