Skip to content

Commit 20590cd

Browse files
pks-tttaylorr
authored andcommitted
reftable: handle trivial reftable_buf errors
Convert the reftable library such that we handle failures with the new `reftable_buf` interfaces. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Taylor Blau <[email protected]>
1 parent 591c6a6 commit 20590cd

File tree

6 files changed

+107
-41
lines changed

6 files changed

+107
-41
lines changed

reftable/block.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ int footer_size(int version)
4040
static int block_writer_register_restart(struct block_writer *w, int n,
4141
int is_restart, struct reftable_buf *key)
4242
{
43-
int rlen = w->restart_len;
43+
int rlen, err;
44+
45+
rlen = w->restart_len;
4446
if (rlen >= MAX_RESTARTS) {
4547
is_restart = 0;
4648
}
@@ -60,7 +62,10 @@ static int block_writer_register_restart(struct block_writer *w, int n,
6062
w->next += n;
6163

6264
reftable_buf_reset(&w->last_key);
63-
reftable_buf_add(&w->last_key, key->buf, key->len);
65+
err = reftable_buf_add(&w->last_key, key->buf, key->len);
66+
if (err < 0)
67+
return err;
68+
6469
w->entries++;
6570
return 0;
6671
}

reftable/iter.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,10 @@ int indexed_table_ref_iter_new(struct indexed_table_ref_iter **dest,
197197

198198
*itr = empty;
199199
itr->r = r;
200-
reftable_buf_add(&itr->oid, oid, oid_len);
200+
201+
err = reftable_buf_add(&itr->oid, oid, oid_len);
202+
if (err < 0)
203+
goto out;
201204

202205
itr->offsets = offsets;
203206
itr->offset_len = offset_len;

reftable/reader.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,10 @@ static int reftable_reader_refs_for_unindexed(struct reftable_reader *r,
769769
}
770770
*filter = empty;
771771

772-
reftable_buf_add(&filter->oid, oid, oid_len);
772+
err = reftable_buf_add(&filter->oid, oid, oid_len);
773+
if (err < 0)
774+
goto out;
775+
773776
iterator_from_table_iter(&filter->it, ti);
774777

775778
iterator_from_filtering_ref_iterator(it, filter);

reftable/record.c

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,20 @@ static int decode_string(struct reftable_buf *dest, struct string_view in)
102102
{
103103
int start_len = in.len;
104104
uint64_t tsize = 0;
105-
int n = get_var_int(&tsize, &in);
105+
int n, err;
106+
107+
n = get_var_int(&tsize, &in);
106108
if (n <= 0)
107109
return -1;
108110
string_view_consume(&in, n);
109111
if (in.len < tsize)
110112
return -1;
111113

112114
reftable_buf_reset(dest);
113-
reftable_buf_add(dest, in.buf, tsize);
115+
err = reftable_buf_add(dest, in.buf, tsize);
116+
if (err < 0)
117+
return err;
118+
114119
string_view_consume(&in, tsize);
115120

116121
return start_len - in.len;
@@ -189,7 +194,7 @@ int reftable_decode_key(struct reftable_buf *last_key, uint8_t *extra,
189194
int start_len = in.len;
190195
uint64_t prefix_len = 0;
191196
uint64_t suffix_len = 0;
192-
int n;
197+
int err, n;
193198

194199
n = reftable_decode_keylen(in, &prefix_len, &suffix_len, extra);
195200
if (n < 0)
@@ -200,8 +205,14 @@ int reftable_decode_key(struct reftable_buf *last_key, uint8_t *extra,
200205
prefix_len > last_key->len)
201206
return -1;
202207

203-
reftable_buf_setlen(last_key, prefix_len);
204-
reftable_buf_add(last_key, in.buf, suffix_len);
208+
err = reftable_buf_setlen(last_key, prefix_len);
209+
if (err < 0)
210+
return err;
211+
212+
err = reftable_buf_add(last_key, in.buf, suffix_len);
213+
if (err < 0)
214+
return err;
215+
205216
string_view_consume(&in, suffix_len);
206217

207218
return start_len - in.len;
@@ -1047,9 +1058,12 @@ static int reftable_index_record_copy_from(void *rec, const void *src_rec,
10471058
{
10481059
struct reftable_index_record *dst = rec;
10491060
const struct reftable_index_record *src = src_rec;
1061+
int err;
10501062

10511063
reftable_buf_reset(&dst->last_key);
1052-
reftable_buf_add(&dst->last_key, src->last_key.buf, src->last_key.len);
1064+
err = reftable_buf_add(&dst->last_key, src->last_key.buf, src->last_key.len);
1065+
if (err < 0)
1066+
return err;
10531067
dst->offset = src->offset;
10541068

10551069
return 0;
@@ -1090,10 +1104,12 @@ static int reftable_index_record_decode(void *rec, struct reftable_buf key,
10901104
{
10911105
struct string_view start = in;
10921106
struct reftable_index_record *r = rec;
1093-
int n = 0;
1107+
int err, n = 0;
10941108

10951109
reftable_buf_reset(&r->last_key);
1096-
reftable_buf_add(&r->last_key, key.buf, key.len);
1110+
err = reftable_buf_add(&r->last_key, key.buf, key.len);
1111+
if (err < 0)
1112+
return err;
10971113

10981114
n = get_var_int(&r->offset, &in);
10991115
if (n < 0)

reftable/stack.c

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,9 @@ int reftable_new_stack(struct reftable_stack **dest, const char *dir,
7878
*dest = NULL;
7979

8080
reftable_buf_reset(&list_file_name);
81-
reftable_buf_addstr(&list_file_name, dir);
82-
reftable_buf_addstr(&list_file_name, "/tables.list");
81+
if ((err = reftable_buf_addstr(&list_file_name, dir)) < 0 ||
82+
(err = reftable_buf_addstr(&list_file_name, "/tables.list")) < 0)
83+
goto out;
8384

8485
p->list_file = reftable_buf_detach(&list_file_name);
8586
p->list_fd = -1;
@@ -747,12 +748,14 @@ int reftable_addition_commit(struct reftable_addition *add)
747748
goto done;
748749

749750
for (i = 0; i < add->stack->merged->readers_len; i++) {
750-
reftable_buf_addstr(&table_list, add->stack->readers[i]->name);
751-
reftable_buf_addstr(&table_list, "\n");
751+
if ((err = reftable_buf_addstr(&table_list, add->stack->readers[i]->name)) < 0 ||
752+
(err = reftable_buf_addstr(&table_list, "\n")) < 0)
753+
goto done;
752754
}
753755
for (i = 0; i < add->new_tables_len; i++) {
754-
reftable_buf_addstr(&table_list, add->new_tables[i]);
755-
reftable_buf_addstr(&table_list, "\n");
756+
if ((err = reftable_buf_addstr(&table_list, add->new_tables[i])) < 0 ||
757+
(err = reftable_buf_addstr(&table_list, "\n")) < 0)
758+
goto done;
756759
}
757760

758761
err = write_in_full(lock_file_fd, table_list.buf, table_list.len);
@@ -867,7 +870,10 @@ int reftable_addition_add(struct reftable_addition *add,
867870
err = stack_filename(&temp_tab_file_name, add->stack, next_name.buf);
868871
if (err < 0)
869872
goto done;
870-
reftable_buf_addstr(&temp_tab_file_name, ".temp.XXXXXX");
873+
874+
err = reftable_buf_addstr(&temp_tab_file_name, ".temp.XXXXXX");
875+
if (err < 0)
876+
goto done;
871877

872878
tab_file = mks_tempfile(temp_tab_file_name.buf);
873879
if (!tab_file) {
@@ -914,7 +920,10 @@ int reftable_addition_add(struct reftable_addition *add,
914920
err = format_name(&next_name, wr->min_update_index, wr->max_update_index);
915921
if (err < 0)
916922
goto done;
917-
reftable_buf_addstr(&next_name, ".ref");
923+
924+
err = reftable_buf_addstr(&next_name, ".ref");
925+
if (err < 0)
926+
goto done;
918927

919928
err = stack_filename(&tab_file_name, add->stack, next_name.buf);
920929
if (err < 0)
@@ -975,7 +984,10 @@ static int stack_compact_locked(struct reftable_stack *st,
975984
err = stack_filename(&tab_file_path, st, next_name.buf);
976985
if (err < 0)
977986
goto done;
978-
reftable_buf_addstr(&tab_file_path, ".temp.XXXXXX");
987+
988+
err = reftable_buf_addstr(&tab_file_path, ".temp.XXXXXX");
989+
if (err < 0)
990+
goto done;
979991

980992
tab_file = mks_tempfile(tab_file_path.buf);
981993
if (!tab_file) {
@@ -1404,7 +1416,9 @@ static int stack_compact_range(struct reftable_stack *st,
14041416
if (err < 0)
14051417
goto done;
14061418

1407-
reftable_buf_addstr(&new_table_name, ".ref");
1419+
err = reftable_buf_addstr(&new_table_name, ".ref");
1420+
if (err < 0)
1421+
goto done;
14081422

14091423
err = stack_filename(&new_table_path, st, new_table_name.buf);
14101424
if (err < 0)
@@ -1423,16 +1437,19 @@ static int stack_compact_range(struct reftable_stack *st,
14231437
* simply skip writing it.
14241438
*/
14251439
for (i = 0; i < first_to_replace; i++) {
1426-
reftable_buf_addstr(&tables_list_buf, names[i]);
1427-
reftable_buf_addstr(&tables_list_buf, "\n");
1440+
if ((err = reftable_buf_addstr(&tables_list_buf, names[i])) < 0 ||
1441+
(err = reftable_buf_addstr(&tables_list_buf, "\n")) < 0)
1442+
goto done;
14281443
}
14291444
if (!is_empty_table) {
1430-
reftable_buf_addstr(&tables_list_buf, new_table_name.buf);
1431-
reftable_buf_addstr(&tables_list_buf, "\n");
1445+
if ((err = reftable_buf_addstr(&tables_list_buf, new_table_name.buf)) < 0 ||
1446+
(err = reftable_buf_addstr(&tables_list_buf, "\n")) < 0)
1447+
goto done;
14321448
}
14331449
for (i = last_to_replace + 1; names[i]; i++) {
1434-
reftable_buf_addstr(&tables_list_buf, names[i]);
1435-
reftable_buf_addstr(&tables_list_buf, "\n");
1450+
if ((err = reftable_buf_addstr(&tables_list_buf, names[i])) < 0 ||
1451+
(err = reftable_buf_addstr(&tables_list_buf, "\n")) < 0)
1452+
goto done;
14361453
}
14371454

14381455
err = write_in_full(get_lock_file_fd(&tables_list_lock),

reftable/writer.c

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ static int writer_index_hash(struct reftable_writer *w, struct reftable_buf *has
217217
node = tree_search(w->obj_index_tree, &want, &obj_index_tree_node_compare);
218218
if (!node) {
219219
struct obj_index_tree_node empty = OBJ_INDEX_TREE_NODE_INIT;
220+
int err;
220221

221222
key = reftable_malloc(sizeof(*key));
222223
if (!key)
@@ -225,7 +226,9 @@ static int writer_index_hash(struct reftable_writer *w, struct reftable_buf *has
225226
*key = empty;
226227

227228
reftable_buf_reset(&key->hash);
228-
reftable_buf_add(&key->hash, hash->buf, hash->len);
229+
err = reftable_buf_add(&key->hash, hash->buf, hash->len);
230+
if (err < 0)
231+
return err;
229232
tree_insert(&w->obj_index_tree, key,
230233
&obj_index_tree_node_compare);
231234
} else {
@@ -259,7 +262,10 @@ static int writer_add_record(struct reftable_writer *w,
259262
}
260263

261264
reftable_buf_reset(&w->last_key);
262-
reftable_buf_add(&w->last_key, key.buf, key.len);
265+
err = reftable_buf_add(&w->last_key, key.buf, key.len);
266+
if (err < 0)
267+
goto done;
268+
263269
if (!w->block_writer) {
264270
err = writer_reinit_block_writer(w, reftable_record_type(rec));
265271
if (err < 0)
@@ -334,8 +340,10 @@ int reftable_writer_add_ref(struct reftable_writer *w,
334340
goto out;
335341

336342
if (!w->opts.skip_index_objects && reftable_ref_record_val1(ref)) {
337-
reftable_buf_add(&buf, (char *)reftable_ref_record_val1(ref),
338-
hash_size(w->opts.hash_id));
343+
err = reftable_buf_add(&buf, (char *)reftable_ref_record_val1(ref),
344+
hash_size(w->opts.hash_id));
345+
if (err < 0)
346+
goto out;
339347

340348
err = writer_index_hash(w, &buf);
341349
if (err < 0)
@@ -344,8 +352,10 @@ int reftable_writer_add_ref(struct reftable_writer *w,
344352

345353
if (!w->opts.skip_index_objects && reftable_ref_record_val2(ref)) {
346354
reftable_buf_reset(&buf);
347-
reftable_buf_add(&buf, reftable_ref_record_val2(ref),
348-
hash_size(w->opts.hash_id));
355+
err = reftable_buf_add(&buf, reftable_ref_record_val2(ref),
356+
hash_size(w->opts.hash_id));
357+
if (err < 0)
358+
goto out;
349359

350360
err = writer_index_hash(w, &buf);
351361
if (err < 0)
@@ -407,17 +417,27 @@ int reftable_writer_add_log(struct reftable_writer *w,
407417

408418
input_log_message = log->value.update.message;
409419
if (!w->opts.exact_log_message && log->value.update.message) {
410-
reftable_buf_addstr(&cleaned_message, log->value.update.message);
420+
err = reftable_buf_addstr(&cleaned_message, log->value.update.message);
421+
if (err < 0)
422+
goto done;
423+
411424
while (cleaned_message.len &&
412-
cleaned_message.buf[cleaned_message.len - 1] == '\n')
413-
reftable_buf_setlen(&cleaned_message,
414-
cleaned_message.len - 1);
425+
cleaned_message.buf[cleaned_message.len - 1] == '\n') {
426+
err = reftable_buf_setlen(&cleaned_message,
427+
cleaned_message.len - 1);
428+
if (err < 0)
429+
goto done;
430+
}
415431
if (strchr(cleaned_message.buf, '\n')) {
416432
/* multiple lines not allowed. */
417433
err = REFTABLE_API_ERROR;
418434
goto done;
419435
}
420-
reftable_buf_addstr(&cleaned_message, "\n");
436+
437+
err = reftable_buf_addstr(&cleaned_message, "\n");
438+
if (err < 0)
439+
goto done;
440+
421441
log->value.update.message = cleaned_message.buf;
422442
}
423443

@@ -781,8 +801,10 @@ static int writer_flush_nonempty_block(struct reftable_writer *w)
781801

782802
index_record.offset = w->next;
783803
reftable_buf_reset(&index_record.last_key);
784-
reftable_buf_add(&index_record.last_key, w->block_writer->last_key.buf,
785-
w->block_writer->last_key.len);
804+
err = reftable_buf_add(&index_record.last_key, w->block_writer->last_key.buf,
805+
w->block_writer->last_key.len);
806+
if (err < 0)
807+
return err;
786808
w->index[w->index_len] = index_record;
787809
w->index_len++;
788810

0 commit comments

Comments
 (0)