@@ -359,7 +359,7 @@ static int reftable_ref_record_decode(void *rec, struct strbuf key,
359
359
uint64_t update_index = 0 ;
360
360
const char * refname = NULL ;
361
361
size_t refname_cap = 0 ;
362
- int n ;
362
+ int n , err ;
363
363
364
364
assert (hash_size > 0 );
365
365
@@ -375,6 +375,10 @@ static int reftable_ref_record_decode(void *rec, struct strbuf key,
375
375
SWAP (r -> refname_cap , refname_cap );
376
376
377
377
REFTABLE_ALLOC_GROW (r -> refname , key .len + 1 , r -> refname_cap );
378
+ if (!r -> refname ) {
379
+ err = REFTABLE_OUT_OF_MEMORY_ERROR ;
380
+ goto done ;
381
+ }
378
382
memcpy (r -> refname , key .buf , key .len );
379
383
r -> refname [key .len ] = 0 ;
380
384
@@ -383,7 +387,8 @@ static int reftable_ref_record_decode(void *rec, struct strbuf key,
383
387
switch (val_type ) {
384
388
case REFTABLE_REF_VAL1 :
385
389
if (in .len < hash_size ) {
386
- return -1 ;
390
+ err = REFTABLE_FORMAT_ERROR ;
391
+ goto done ;
387
392
}
388
393
389
394
memcpy (r -> value .val1 , in .buf , hash_size );
@@ -392,7 +397,8 @@ static int reftable_ref_record_decode(void *rec, struct strbuf key,
392
397
393
398
case REFTABLE_REF_VAL2 :
394
399
if (in .len < 2 * hash_size ) {
395
- return -1 ;
400
+ err = REFTABLE_FORMAT_ERROR ;
401
+ goto done ;
396
402
}
397
403
398
404
memcpy (r -> value .val2 .value , in .buf , hash_size );
@@ -405,7 +411,8 @@ static int reftable_ref_record_decode(void *rec, struct strbuf key,
405
411
case REFTABLE_REF_SYMREF : {
406
412
int n = decode_string (scratch , in );
407
413
if (n < 0 ) {
408
- return -1 ;
414
+ err = REFTABLE_FORMAT_ERROR ;
415
+ goto done ;
409
416
}
410
417
string_view_consume (& in , n );
411
418
r -> value .symref = strbuf_detach (scratch , NULL );
@@ -419,6 +426,9 @@ static int reftable_ref_record_decode(void *rec, struct strbuf key,
419
426
}
420
427
421
428
return start .len - in .len ;
429
+
430
+ done :
431
+ return err ;
422
432
}
423
433
424
434
static int reftable_ref_record_is_deletion_void (const void * p )
@@ -552,6 +562,8 @@ static int reftable_obj_record_decode(void *rec, struct strbuf key,
552
562
reftable_obj_record_release (r );
553
563
554
564
REFTABLE_ALLOC_ARRAY (r -> hash_prefix , key .len );
565
+ if (!r -> hash_prefix )
566
+ return REFTABLE_OUT_OF_MEMORY_ERROR ;
555
567
memcpy (r -> hash_prefix , key .buf , key .len );
556
568
r -> hash_prefix_len = key .len ;
557
569
@@ -570,6 +582,8 @@ static int reftable_obj_record_decode(void *rec, struct strbuf key,
570
582
return start .len - in .len ;
571
583
572
584
REFTABLE_ALLOC_ARRAY (r -> offsets , count );
585
+ if (!r -> offsets )
586
+ return REFTABLE_OUT_OF_MEMORY_ERROR ;
573
587
r -> offset_len = count ;
574
588
575
589
n = get_var_int (& r -> offsets [0 ], & in );
@@ -801,12 +815,17 @@ static int reftable_log_record_decode(void *rec, struct strbuf key,
801
815
struct reftable_log_record * r = rec ;
802
816
uint64_t max = 0 ;
803
817
uint64_t ts = 0 ;
804
- int n ;
818
+ int err , n ;
805
819
806
820
if (key .len <= 9 || key .buf [key .len - 9 ] != 0 )
807
821
return REFTABLE_FORMAT_ERROR ;
808
822
809
823
REFTABLE_ALLOC_GROW (r -> refname , key .len - 8 , r -> refname_cap );
824
+ if (!r -> refname ) {
825
+ err = REFTABLE_OUT_OF_MEMORY_ERROR ;
826
+ goto done ;
827
+ }
828
+
810
829
memcpy (r -> refname , key .buf , key .len - 8 );
811
830
ts = get_be64 (key .buf + key .len - 8 );
812
831
@@ -829,17 +848,21 @@ static int reftable_log_record_decode(void *rec, struct strbuf key,
829
848
if (val_type == REFTABLE_LOG_DELETION )
830
849
return 0 ;
831
850
832
- if (in .len < 2 * hash_size )
833
- return REFTABLE_FORMAT_ERROR ;
851
+ if (in .len < 2 * hash_size ) {
852
+ err = REFTABLE_FORMAT_ERROR ;
853
+ goto done ;
854
+ }
834
855
835
856
memcpy (r -> value .update .old_hash , in .buf , hash_size );
836
857
memcpy (r -> value .update .new_hash , in .buf + hash_size , hash_size );
837
858
838
859
string_view_consume (& in , 2 * hash_size );
839
860
840
861
n = decode_string (scratch , in );
841
- if (n < 0 )
862
+ if (n < 0 ) {
863
+ err = REFTABLE_FORMAT_ERROR ;
842
864
goto done ;
865
+ }
843
866
string_view_consume (& in , n );
844
867
845
868
/*
@@ -850,52 +873,75 @@ static int reftable_log_record_decode(void *rec, struct strbuf key,
850
873
*/
851
874
if (!r -> value .update .name ||
852
875
strcmp (r -> value .update .name , scratch -> buf )) {
853
- r -> value .update .name =
854
- reftable_realloc (r -> value .update .name , scratch -> len + 1 );
876
+ char * name = reftable_realloc (r -> value .update .name , scratch -> len + 1 );
877
+ if (!name ) {
878
+ err = REFTABLE_OUT_OF_MEMORY_ERROR ;
879
+ goto done ;
880
+ }
881
+
882
+ r -> value .update .name = name ;
855
883
memcpy (r -> value .update .name , scratch -> buf , scratch -> len );
856
884
r -> value .update .name [scratch -> len ] = 0 ;
857
885
}
858
886
859
887
n = decode_string (scratch , in );
860
- if (n < 0 )
888
+ if (n < 0 ) {
889
+ err = REFTABLE_FORMAT_ERROR ;
861
890
goto done ;
891
+ }
862
892
string_view_consume (& in , n );
863
893
864
894
/* Same as above, but for the reflog email. */
865
895
if (!r -> value .update .email ||
866
896
strcmp (r -> value .update .email , scratch -> buf )) {
867
- r -> value .update .email =
868
- reftable_realloc (r -> value .update .email , scratch -> len + 1 );
897
+ char * email = reftable_realloc (r -> value .update .email , scratch -> len + 1 );
898
+ if (!email ) {
899
+ err = REFTABLE_OUT_OF_MEMORY_ERROR ;
900
+ goto done ;
901
+ }
902
+
903
+ r -> value .update .email = email ;
869
904
memcpy (r -> value .update .email , scratch -> buf , scratch -> len );
870
905
r -> value .update .email [scratch -> len ] = 0 ;
871
906
}
872
907
873
908
ts = 0 ;
874
909
n = get_var_int (& ts , & in );
875
- if (n < 0 )
910
+ if (n < 0 ) {
911
+ err = REFTABLE_FORMAT_ERROR ;
876
912
goto done ;
913
+ }
877
914
string_view_consume (& in , n );
878
915
r -> value .update .time = ts ;
879
- if (in .len < 2 )
916
+ if (in .len < 2 ) {
917
+ err = REFTABLE_FORMAT_ERROR ;
880
918
goto done ;
919
+ }
881
920
882
921
r -> value .update .tz_offset = get_be16 (in .buf );
883
922
string_view_consume (& in , 2 );
884
923
885
924
n = decode_string (scratch , in );
886
- if (n < 0 )
925
+ if (n < 0 ) {
926
+ err = REFTABLE_FORMAT_ERROR ;
887
927
goto done ;
928
+ }
888
929
string_view_consume (& in , n );
889
930
890
931
REFTABLE_ALLOC_GROW (r -> value .update .message , scratch -> len + 1 ,
891
932
r -> value .update .message_cap );
933
+ if (!r -> value .update .message ) {
934
+ err = REFTABLE_OUT_OF_MEMORY_ERROR ;
935
+ goto done ;
936
+ }
937
+
892
938
memcpy (r -> value .update .message , scratch -> buf , scratch -> len );
893
939
r -> value .update .message [scratch -> len ] = 0 ;
894
940
895
941
return start .len - in .len ;
896
942
897
943
done :
898
- return REFTABLE_FORMAT_ERROR ;
944
+ return err ;
899
945
}
900
946
901
947
static int null_streq (const char * a , const char * b )
0 commit comments