@@ -215,13 +215,14 @@ static void reftable_ref_record_key(const void *r, struct strbuf *dest)
215
215
strbuf_addstr (dest , rec -> refname );
216
216
}
217
217
218
- static void reftable_ref_record_copy_from (void * rec , const void * src_rec ,
219
- int hash_size )
218
+ static int reftable_ref_record_copy_from (void * rec , const void * src_rec ,
219
+ int hash_size )
220
220
{
221
221
struct reftable_ref_record * ref = rec ;
222
222
const struct reftable_ref_record * src = src_rec ;
223
223
char * refname = NULL ;
224
224
size_t refname_cap = 0 ;
225
+ int err ;
225
226
226
227
assert (hash_size > 0 );
227
228
@@ -236,6 +237,11 @@ static void reftable_ref_record_copy_from(void *rec, const void *src_rec,
236
237
237
238
REFTABLE_ALLOC_GROW (ref -> refname , refname_len + 1 ,
238
239
ref -> refname_cap );
240
+ if (!ref -> refname ) {
241
+ err = REFTABLE_OUT_OF_MEMORY_ERROR ;
242
+ goto out ;
243
+ }
244
+
239
245
memcpy (ref -> refname , src -> refname , refname_len );
240
246
ref -> refname [refname_len ] = 0 ;
241
247
}
@@ -254,9 +260,17 @@ static void reftable_ref_record_copy_from(void *rec, const void *src_rec,
254
260
src -> value .val2 .target_value , hash_size );
255
261
break ;
256
262
case REFTABLE_REF_SYMREF :
257
- ref -> value .symref = xstrdup (src -> value .symref );
263
+ ref -> value .symref = reftable_strdup (src -> value .symref );
264
+ if (!ref -> value .symref ) {
265
+ err = REFTABLE_OUT_OF_MEMORY_ERROR ;
266
+ goto out ;
267
+ }
258
268
break ;
259
269
}
270
+
271
+ err = 0 ;
272
+ out :
273
+ return err ;
260
274
}
261
275
262
276
static void reftable_ref_record_release_void (void * rec )
@@ -457,23 +471,28 @@ static void reftable_obj_record_release(void *rec)
457
471
memset (obj , 0 , sizeof (struct reftable_obj_record ));
458
472
}
459
473
460
- static void reftable_obj_record_copy_from (void * rec , const void * src_rec ,
461
- int hash_size UNUSED )
474
+ static int reftable_obj_record_copy_from (void * rec , const void * src_rec ,
475
+ int hash_size UNUSED )
462
476
{
463
477
struct reftable_obj_record * obj = rec ;
464
- const struct reftable_obj_record * src =
465
- (const struct reftable_obj_record * )src_rec ;
478
+ const struct reftable_obj_record * src = src_rec ;
466
479
467
480
reftable_obj_record_release (obj );
468
481
469
482
REFTABLE_ALLOC_ARRAY (obj -> hash_prefix , src -> hash_prefix_len );
483
+ if (!obj -> hash_prefix )
484
+ return REFTABLE_OUT_OF_MEMORY_ERROR ;
470
485
obj -> hash_prefix_len = src -> hash_prefix_len ;
471
486
if (src -> hash_prefix_len )
472
487
memcpy (obj -> hash_prefix , src -> hash_prefix , obj -> hash_prefix_len );
473
488
474
489
REFTABLE_ALLOC_ARRAY (obj -> offsets , src -> offset_len );
490
+ if (!obj -> offsets )
491
+ return REFTABLE_OUT_OF_MEMORY_ERROR ;
475
492
obj -> offset_len = src -> offset_len ;
476
493
COPY_ARRAY (obj -> offsets , src -> offsets , src -> offset_len );
494
+
495
+ return 0 ;
477
496
}
478
497
479
498
static uint8_t reftable_obj_record_val_type (const void * rec )
@@ -646,33 +665,44 @@ static void reftable_log_record_key(const void *r, struct strbuf *dest)
646
665
strbuf_add (dest , i64 , sizeof (i64 ));
647
666
}
648
667
649
- static void reftable_log_record_copy_from (void * rec , const void * src_rec ,
650
- int hash_size )
668
+ static int reftable_log_record_copy_from (void * rec , const void * src_rec ,
669
+ int hash_size )
651
670
{
652
671
struct reftable_log_record * dst = rec ;
653
672
const struct reftable_log_record * src =
654
673
(const struct reftable_log_record * )src_rec ;
674
+ int ret ;
655
675
656
676
reftable_log_record_release (dst );
657
677
* dst = * src ;
678
+
658
679
if (dst -> refname ) {
659
- dst -> refname = xstrdup (dst -> refname );
680
+ dst -> refname = reftable_strdup (dst -> refname );
681
+ if (!dst -> refname ) {
682
+ ret = REFTABLE_OUT_OF_MEMORY_ERROR ;
683
+ goto out ;
684
+ }
660
685
}
686
+
661
687
switch (dst -> value_type ) {
662
688
case REFTABLE_LOG_DELETION :
663
689
break ;
664
690
case REFTABLE_LOG_UPDATE :
665
- if (dst -> value .update .email ) {
691
+ if (dst -> value .update .email )
666
692
dst -> value .update .email =
667
- xstrdup (dst -> value .update .email );
668
- }
669
- if (dst -> value .update .name ) {
693
+ reftable_strdup (dst -> value .update .email );
694
+ if (dst -> value .update .name )
670
695
dst -> value .update .name =
671
- xstrdup (dst -> value .update .name );
672
- }
673
- if (dst -> value .update .message ) {
696
+ reftable_strdup (dst -> value .update .name );
697
+ if (dst -> value .update .message )
674
698
dst -> value .update .message =
675
- xstrdup (dst -> value .update .message );
699
+ reftable_strdup (dst -> value .update .message );
700
+
701
+ if (!dst -> value .update .email ||
702
+ !dst -> value .update .name ||
703
+ !dst -> value .update .message ) {
704
+ ret = REFTABLE_OUT_OF_MEMORY_ERROR ;
705
+ goto out ;
676
706
}
677
707
678
708
memcpy (dst -> value .update .new_hash ,
@@ -681,6 +711,10 @@ static void reftable_log_record_copy_from(void *rec, const void *src_rec,
681
711
src -> value .update .old_hash , hash_size );
682
712
break ;
683
713
}
714
+
715
+ ret = 0 ;
716
+ out :
717
+ return ret ;
684
718
}
685
719
686
720
static void reftable_log_record_release_void (void * rec )
@@ -954,15 +988,17 @@ static void reftable_index_record_key(const void *r, struct strbuf *dest)
954
988
strbuf_addbuf (dest , & rec -> last_key );
955
989
}
956
990
957
- static void reftable_index_record_copy_from (void * rec , const void * src_rec ,
958
- int hash_size UNUSED )
991
+ static int reftable_index_record_copy_from (void * rec , const void * src_rec ,
992
+ int hash_size UNUSED )
959
993
{
960
994
struct reftable_index_record * dst = rec ;
961
995
const struct reftable_index_record * src = src_rec ;
962
996
963
997
strbuf_reset (& dst -> last_key );
964
998
strbuf_addbuf (& dst -> last_key , & src -> last_key );
965
999
dst -> offset = src -> offset ;
1000
+
1001
+ return 0 ;
966
1002
}
967
1003
968
1004
static void reftable_index_record_release (void * rec )
@@ -1054,14 +1090,14 @@ int reftable_record_encode(struct reftable_record *rec, struct string_view dest,
1054
1090
dest , hash_size );
1055
1091
}
1056
1092
1057
- void reftable_record_copy_from (struct reftable_record * rec ,
1093
+ int reftable_record_copy_from (struct reftable_record * rec ,
1058
1094
struct reftable_record * src , int hash_size )
1059
1095
{
1060
1096
assert (src -> type == rec -> type );
1061
1097
1062
- reftable_record_vtable (rec )-> copy_from (reftable_record_data (rec ),
1063
- reftable_record_data (src ),
1064
- hash_size );
1098
+ return reftable_record_vtable (rec )-> copy_from (reftable_record_data (rec ),
1099
+ reftable_record_data (src ),
1100
+ hash_size );
1065
1101
}
1066
1102
1067
1103
uint8_t reftable_record_val_type (struct reftable_record * rec )
0 commit comments