@@ -214,13 +214,13 @@ void reftable_stack_destroy(struct reftable_stack *st)
214
214
}
215
215
216
216
static struct reftable_reader * * stack_copy_readers (struct reftable_stack * st ,
217
- int cur_len )
217
+ size_t cur_len )
218
218
{
219
219
struct reftable_reader * * cur = reftable_calloc (cur_len , sizeof (* cur ));
220
- int i = 0 ;
221
- for (i = 0 ; i < cur_len ; i ++ ) {
220
+ if (!cur )
221
+ return NULL ;
222
+ for (size_t i = 0 ; i < cur_len ; i ++ )
222
223
cur [i ] = st -> readers [i ];
223
- }
224
224
return cur ;
225
225
}
226
226
@@ -229,18 +229,30 @@ static int reftable_stack_reload_once(struct reftable_stack *st,
229
229
int reuse_open )
230
230
{
231
231
size_t cur_len = !st -> merged ? 0 : st -> merged -> readers_len ;
232
- struct reftable_reader * * cur = stack_copy_readers ( st , cur_len ) ;
232
+ struct reftable_reader * * cur ;
233
233
struct reftable_reader * * reused = NULL ;
234
- size_t reused_len = 0 , reused_alloc = 0 ;
235
- size_t names_len = names_length (names );
236
- struct reftable_reader * * new_readers =
237
- reftable_calloc (names_len , sizeof (* new_readers ));
234
+ struct reftable_reader * * new_readers ;
235
+ size_t reused_len = 0 , reused_alloc = 0 , names_len ;
238
236
size_t new_readers_len = 0 ;
239
237
struct reftable_merged_table * new_merged = NULL ;
240
238
struct strbuf table_path = STRBUF_INIT ;
241
239
int err = 0 ;
242
240
size_t i ;
243
241
242
+ cur = stack_copy_readers (st , cur_len );
243
+ if (!cur ) {
244
+ err = REFTABLE_OUT_OF_MEMORY_ERROR ;
245
+ goto done ;
246
+ }
247
+
248
+ names_len = names_length (names );
249
+
250
+ new_readers = reftable_calloc (names_len , sizeof (* new_readers ));
251
+ if (!new_readers ) {
252
+ err = REFTABLE_OUT_OF_MEMORY_ERROR ;
253
+ goto done ;
254
+ }
255
+
244
256
while (* names ) {
245
257
struct reftable_reader * rd = NULL ;
246
258
const char * name = * names ++ ;
@@ -261,6 +273,10 @@ static int reftable_stack_reload_once(struct reftable_stack *st,
261
273
* do by bumping their refcount.
262
274
*/
263
275
REFTABLE_ALLOC_GROW (reused , reused_len + 1 , reused_alloc );
276
+ if (!reused ) {
277
+ err = REFTABLE_OUT_OF_MEMORY_ERROR ;
278
+ goto done ;
279
+ }
264
280
reused [reused_len ++ ] = rd ;
265
281
reftable_reader_incref (rd );
266
282
break ;
0 commit comments