Skip to content

Commit b4ff12c

Browse files
pks-tgitster
authored andcommitted
reftable: introduce macros to allocate arrays
Similar to the preceding commit, let's carry over macros to allocate arrays with `REFTABLE_ALLOC_ARRAY()` and `REFTABLE_CALLOC_ARRAY()`. This requires us to change the signature of `reftable_calloc()`, which only takes a single argument right now and thus puts the burden on the caller to calculate the final array's size. This is a net improvement though as it means that we can now provide proper overflow checks when multiplying the array size with the member size. Convert callsites of `reftable_calloc()` to the new signature and start using the new macros where possible. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent f6b58c1 commit b4ff12c

16 files changed

+68
-61
lines changed

reftable/basics.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@ int names_length(char **names);
5151
void *reftable_malloc(size_t sz);
5252
void *reftable_realloc(void *p, size_t sz);
5353
void reftable_free(void *p);
54-
void *reftable_calloc(size_t sz);
54+
void *reftable_calloc(size_t nelem, size_t elsize);
5555

56+
#define REFTABLE_ALLOC_ARRAY(x, alloc) (x) = reftable_malloc(st_mult(sizeof(*(x)), (alloc)))
57+
#define REFTABLE_CALLOC_ARRAY(x, alloc) (x) = reftable_calloc((alloc), sizeof(*(x)))
5658
#define REFTABLE_REALLOC_ARRAY(x, alloc) (x) = reftable_realloc((x), st_mult(sizeof(*(x)), (alloc)))
5759
#define REFTABLE_ALLOC_GROW(x, nr, alloc) \
5860
do { \

reftable/block.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,10 @@ int block_writer_finish(struct block_writer *w)
143143
int block_header_skip = 4 + w->header_off;
144144
uLongf src_len = w->next - block_header_skip;
145145
uLongf dest_cap = src_len * 1.001 + 12;
146+
uint8_t *compressed;
147+
148+
REFTABLE_ALLOC_ARRAY(compressed, dest_cap);
146149

147-
uint8_t *compressed = reftable_malloc(dest_cap);
148150
while (1) {
149151
uLongf out_dest_len = dest_cap;
150152
int zresult = compress2(compressed, &out_dest_len,
@@ -201,9 +203,9 @@ int block_reader_init(struct block_reader *br, struct reftable_block *block,
201203
uLongf dst_len = sz - block_header_skip; /* total size of dest
202204
buffer. */
203205
uLongf src_len = block->len - block_header_skip;
204-
/* Log blocks specify the *uncompressed* size in their header.
205-
*/
206-
uncompressed = reftable_malloc(sz);
206+
207+
/* Log blocks specify the *uncompressed* size in their header. */
208+
REFTABLE_ALLOC_ARRAY(uncompressed, sz);
207209

208210
/* Copy over the block header verbatim. It's not compressed. */
209211
memcpy(uncompressed, block->data, block_header_skip);

reftable/block_test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ static void test_block_read_write(void)
3636
int j = 0;
3737
struct strbuf want = STRBUF_INIT;
3838

39-
block.data = reftable_calloc(block_size);
39+
REFTABLE_CALLOC_ARRAY(block.data, block_size);
4040
block.len = block_size;
4141
block.source = malloc_block_source();
4242
block_writer_init(&bw, BLOCK_TYPE_REF, block.data, block_size,

reftable/blocksource.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ static int strbuf_read_block(void *v, struct reftable_block *dest, uint64_t off,
2929
{
3030
struct strbuf *b = v;
3131
assert(off + size <= b->len);
32-
dest->data = reftable_calloc(size);
32+
REFTABLE_CALLOC_ARRAY(dest->data, size);
3333
memcpy(dest->data, b->buf + off, size);
3434
dest->len = size;
3535
return size;
@@ -132,7 +132,7 @@ int reftable_block_source_from_file(struct reftable_block_source *bs,
132132
return REFTABLE_IO_ERROR;
133133
}
134134

135-
p = reftable_calloc(sizeof(*p));
135+
REFTABLE_CALLOC_ARRAY(p, 1);
136136
p->size = st.st_size;
137137
p->data = xmmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
138138
close(fd);

reftable/iter.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,7 @@ int new_indexed_table_ref_iter(struct indexed_table_ref_iter **dest,
160160
int oid_len, uint64_t *offsets, int offset_len)
161161
{
162162
struct indexed_table_ref_iter empty = INDEXED_TABLE_REF_ITER_INIT;
163-
struct indexed_table_ref_iter *itr =
164-
reftable_calloc(sizeof(struct indexed_table_ref_iter));
163+
struct indexed_table_ref_iter *itr = reftable_calloc(1, sizeof(*itr));
165164
int err = 0;
166165

167166
*itr = empty;

reftable/merged.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ int reftable_new_merged_table(struct reftable_merged_table **dest,
190190
}
191191
}
192192

193-
m = reftable_calloc(sizeof(struct reftable_merged_table));
193+
REFTABLE_CALLOC_ARRAY(m, 1);
194194
m->stack = stack;
195195
m->stack_len = n;
196196
m->min = first_min;
@@ -240,7 +240,7 @@ static int merged_table_seek_record(struct reftable_merged_table *mt,
240240
struct reftable_record *rec)
241241
{
242242
struct reftable_iterator *iters = reftable_calloc(
243-
sizeof(struct reftable_iterator) * mt->stack_len);
243+
mt->stack_len, sizeof(*iters));
244244
struct merged_iter merged = {
245245
.stack = iters,
246246
.typ = reftable_record_type(rec),

reftable/merged_test.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,12 @@ merged_table_from_records(struct reftable_ref_record **refs,
9393
int i = 0;
9494
struct reftable_merged_table *mt = NULL;
9595
int err;
96-
struct reftable_table *tabs =
97-
reftable_calloc(n * sizeof(struct reftable_table));
98-
*readers = reftable_calloc(n * sizeof(struct reftable_reader *));
99-
*source = reftable_calloc(n * sizeof(**source));
96+
struct reftable_table *tabs;
97+
98+
REFTABLE_CALLOC_ARRAY(tabs, n);
99+
REFTABLE_CALLOC_ARRAY(*readers, n);
100+
REFTABLE_CALLOC_ARRAY(*source, n);
101+
100102
for (i = 0; i < n; i++) {
101103
write_test_table(&buf[i], refs[i], sizes[i]);
102104
block_source_from_strbuf(&(*source)[i], &buf[i]);
@@ -266,10 +268,12 @@ merged_table_from_log_records(struct reftable_log_record **logs,
266268
int i = 0;
267269
struct reftable_merged_table *mt = NULL;
268270
int err;
269-
struct reftable_table *tabs =
270-
reftable_calloc(n * sizeof(struct reftable_table));
271-
*readers = reftable_calloc(n * sizeof(struct reftable_reader *));
272-
*source = reftable_calloc(n * sizeof(**source));
271+
struct reftable_table *tabs;
272+
273+
REFTABLE_CALLOC_ARRAY(tabs, n);
274+
REFTABLE_CALLOC_ARRAY(*readers, n);
275+
REFTABLE_CALLOC_ARRAY(*source, n);
276+
273277
for (i = 0; i < n; i++) {
274278
write_test_log_table(&buf[i], logs[i], sizes[i], i + 1);
275279
block_source_from_strbuf(&(*source)[i], &buf[i]);
@@ -412,7 +416,7 @@ static void test_default_write_opts(void)
412416
};
413417
int err;
414418
struct reftable_block_source source = { NULL };
415-
struct reftable_table *tab = reftable_calloc(sizeof(*tab) * 1);
419+
struct reftable_table *tab = reftable_calloc(1, sizeof(*tab));
416420
uint32_t hash_id;
417421
struct reftable_reader *rd = NULL;
418422
struct reftable_merged_table *merged = NULL;

reftable/publicbasics.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ void reftable_free(void *p)
3737
free(p);
3838
}
3939

40-
void *reftable_calloc(size_t sz)
40+
void *reftable_calloc(size_t nelem, size_t elsize)
4141
{
42+
size_t sz = st_mult(nelem, elsize);
4243
void *p = reftable_malloc(sz);
4344
memset(p, 0, sz);
4445
return p;

reftable/reader.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -539,8 +539,7 @@ static int reader_seek_indexed(struct reftable_reader *r,
539539

540540
if (err == 0) {
541541
struct table_iter empty = TABLE_ITER_INIT;
542-
struct table_iter *malloced =
543-
reftable_calloc(sizeof(struct table_iter));
542+
struct table_iter *malloced = reftable_calloc(1, sizeof(*malloced));
544543
*malloced = empty;
545544
table_iter_copy_from(malloced, &next);
546545
iterator_from_table_iter(it, malloced);
@@ -635,8 +634,7 @@ void reader_close(struct reftable_reader *r)
635634
int reftable_new_reader(struct reftable_reader **p,
636635
struct reftable_block_source *src, char const *name)
637636
{
638-
struct reftable_reader *rd =
639-
reftable_calloc(sizeof(struct reftable_reader));
637+
struct reftable_reader *rd = reftable_calloc(1, sizeof(*rd));
640638
int err = init_reader(rd, src, name);
641639
if (err == 0) {
642640
*p = rd;
@@ -711,7 +709,7 @@ static int reftable_reader_refs_for_unindexed(struct reftable_reader *r,
711709
uint8_t *oid)
712710
{
713711
struct table_iter ti_empty = TABLE_ITER_INIT;
714-
struct table_iter *ti = reftable_calloc(sizeof(struct table_iter));
712+
struct table_iter *ti = reftable_calloc(1, sizeof(*ti));
715713
struct filtering_ref_iterator *filter = NULL;
716714
struct filtering_ref_iterator empty = FILTERING_REF_ITERATOR_INIT;
717715
int oid_len = hash_size(r->hash_id);

reftable/readwrite_test.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ static void write_table(char ***names, struct strbuf *buf, int N,
5656
int i = 0, n;
5757
struct reftable_log_record log = { NULL };
5858
const struct reftable_stats *stats = NULL;
59-
*names = reftable_calloc(sizeof(char *) * (N + 1));
59+
60+
REFTABLE_CALLOC_ARRAY(*names, N + 1);
61+
6062
reftable_writer_set_limits(w, update_index, update_index);
6163
for (i = 0; i < N; i++) {
6264
char name[100];
@@ -188,7 +190,7 @@ static void test_log_overflow(void)
188190
static void test_log_write_read(void)
189191
{
190192
int N = 2;
191-
char **names = reftable_calloc(sizeof(char *) * (N + 1));
193+
char **names = reftable_calloc(N + 1, sizeof(*names));
192194
int err;
193195
struct reftable_write_options opts = {
194196
.block_size = 256,
@@ -519,7 +521,7 @@ static void test_table_read_write_seek_index(void)
519521
static void test_table_refs_for(int indexed)
520522
{
521523
int N = 50;
522-
char **want_names = reftable_calloc(sizeof(char *) * (N + 1));
524+
char **want_names = reftable_calloc(N + 1, sizeof(*want_names));
523525
int want_names_len = 0;
524526
uint8_t want_hash[GIT_SHA1_RAWSZ];
525527

0 commit comments

Comments
 (0)