@@ -861,22 +861,16 @@ static int git_parse_source(config_fn_t fn, void *data,
861
861
return error_return ;
862
862
}
863
863
864
- static int parse_unit_factor (const char * end , uintmax_t * val )
864
+ static uintmax_t get_unit_factor (const char * end )
865
865
{
866
866
if (!* end )
867
867
return 1 ;
868
- else if (!strcasecmp (end , "k" )) {
869
- * val *= 1024 ;
870
- return 1 ;
871
- }
872
- else if (!strcasecmp (end , "m" )) {
873
- * val *= 1024 * 1024 ;
874
- return 1 ;
875
- }
876
- else if (!strcasecmp (end , "g" )) {
877
- * val *= 1024 * 1024 * 1024 ;
878
- return 1 ;
879
- }
868
+ else if (!strcasecmp (end , "k" ))
869
+ return 1024 ;
870
+ else if (!strcasecmp (end , "m" ))
871
+ return 1024 * 1024 ;
872
+ else if (!strcasecmp (end , "g" ))
873
+ return 1024 * 1024 * 1024 ;
880
874
return 0 ;
881
875
}
882
876
@@ -886,19 +880,20 @@ static int git_parse_signed(const char *value, intmax_t *ret, intmax_t max)
886
880
char * end ;
887
881
intmax_t val ;
888
882
uintmax_t uval ;
889
- uintmax_t factor = 1 ;
883
+ uintmax_t factor ;
890
884
891
885
errno = 0 ;
892
886
val = strtoimax (value , & end , 0 );
893
887
if (errno == ERANGE )
894
888
return 0 ;
895
- if (!parse_unit_factor (end , & factor )) {
889
+ factor = get_unit_factor (end );
890
+ if (!factor ) {
896
891
errno = EINVAL ;
897
892
return 0 ;
898
893
}
899
894
uval = val < 0 ? - val : val ;
900
- uval *= factor ;
901
- if ( uval > max || ( val < 0 ? - val : val ) > uval ) {
895
+ if ( unsigned_mult_overflows ( factor , uval ) ||
896
+ factor * uval > max ) {
902
897
errno = ERANGE ;
903
898
return 0 ;
904
899
}
@@ -915,21 +910,23 @@ static int git_parse_unsigned(const char *value, uintmax_t *ret, uintmax_t max)
915
910
if (value && * value ) {
916
911
char * end ;
917
912
uintmax_t val ;
918
- uintmax_t oldval ;
913
+ uintmax_t factor ;
919
914
920
915
errno = 0 ;
921
916
val = strtoumax (value , & end , 0 );
922
917
if (errno == ERANGE )
923
918
return 0 ;
924
- oldval = val ;
925
- if (!parse_unit_factor ( end , & val ) ) {
919
+ factor = get_unit_factor ( end ) ;
920
+ if (!factor ) {
926
921
errno = EINVAL ;
927
922
return 0 ;
928
923
}
929
- if (val > max || oldval > val ) {
924
+ if (unsigned_mult_overflows (factor , val ) ||
925
+ factor * val > max ) {
930
926
errno = ERANGE ;
931
927
return 0 ;
932
928
}
929
+ val *= factor ;
933
930
* ret = val ;
934
931
return 1 ;
935
932
}
0 commit comments