reftable/pq: handle allocation failures when adding entries

Handle allocation failures when adding entries to the pqueue. Adapt its only caller accordingly. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Oct 2, 2024 at 12:56 UTC d0501c8c9d0b67587e112bbe2a85746c7c11a9e8
3 files changed +11 -3
reftable/merged.c
+4 -1
@@ -54,7 +54,10 @@ static int merged_iter_advance_subiter(struct merged_iter *mi, size_t idx)
54 if (err)
55 return err;
56
57 - merged_iter_pqueue_add(&mi->pq, &e);
57 + err = merged_iter_pqueue_add(&mi->pq, &e);
58 + if (err)
59 + return err;
60 +
61 return 0;
62 }
63
reftable/pq.c
+6 -1
@@ -8,6 +8,7 @@ https://developers.google.com/open-source/licenses/bsd
8
9 #include "pq.h"
10
11 +#include "reftable-error.h"
12 #include "reftable-record.h"
13 #include "system.h"
14 #include "basics.h"
@@ -44,11 +45,13 @@ struct pq_entry merged_iter_pqueue_remove(struct merged_iter_pqueue *pq)
45 return e;
46 }
47
47 -void merged_iter_pqueue_add(struct merged_iter_pqueue *pq, const struct pq_entry *e)
48 +int merged_iter_pqueue_add(struct merged_iter_pqueue *pq, const struct pq_entry *e)
49 {
50 size_t i = 0;
51
52 REFTABLE_ALLOC_GROW(pq->heap, pq->len + 1, pq->cap);
53 + if (!pq->heap)
54 + return REFTABLE_OUT_OF_MEMORY_ERROR;
55 pq->heap[pq->len++] = *e;
56
57 i = pq->len - 1;
@@ -59,6 +62,8 @@ void merged_iter_pqueue_add(struct merged_iter_pqueue *pq, const struct pq_entry
62 SWAP(pq->heap[j], pq->heap[i]);
63 i = j;
64 }
65 +
66 + return 0;
67 }
68
69 void merged_iter_pqueue_release(struct merged_iter_pqueue *pq)
reftable/pq.h
+1 -1
@@ -23,7 +23,7 @@ struct merged_iter_pqueue {
23 };
24
25 struct pq_entry merged_iter_pqueue_remove(struct merged_iter_pqueue *pq);
26 -void merged_iter_pqueue_add(struct merged_iter_pqueue *pq, const struct pq_entry *e);
26 +int merged_iter_pqueue_add(struct merged_iter_pqueue *pq, const struct pq_entry *e);
27 void merged_iter_pqueue_release(struct merged_iter_pqueue *pq);
28 int pq_less(struct pq_entry *a, struct pq_entry *b);
29