@@ -834,22 +834,16 @@ static int git_parse_source(config_fn_t fn, void *data,
834
834
return error_return ;
835
835
}
836
836
837
- static int parse_unit_factor (const char * end , uintmax_t * val )
837
+ static uintmax_t get_unit_factor (const char * end )
838
838
{
839
839
if (!* end )
840
840
return 1 ;
841
- else if (!strcasecmp (end , "k" )) {
842
- * val *= 1024 ;
843
- return 1 ;
844
- }
845
- else if (!strcasecmp (end , "m" )) {
846
- * val *= 1024 * 1024 ;
847
- return 1 ;
848
- }
849
- else if (!strcasecmp (end , "g" )) {
850
- * val *= 1024 * 1024 * 1024 ;
851
- return 1 ;
852
- }
841
+ else if (!strcasecmp (end , "k" ))
842
+ return 1024 ;
843
+ else if (!strcasecmp (end , "m" ))
844
+ return 1024 * 1024 ;
845
+ else if (!strcasecmp (end , "g" ))
846
+ return 1024 * 1024 * 1024 ;
853
847
return 0 ;
854
848
}
855
849
@@ -859,19 +853,20 @@ static int git_parse_signed(const char *value, intmax_t *ret, intmax_t max)
859
853
char * end ;
860
854
intmax_t val ;
861
855
uintmax_t uval ;
862
- uintmax_t factor = 1 ;
856
+ uintmax_t factor ;
863
857
864
858
errno = 0 ;
865
859
val = strtoimax (value , & end , 0 );
866
860
if (errno == ERANGE )
867
861
return 0 ;
868
- if (!parse_unit_factor (end , & factor )) {
862
+ factor = get_unit_factor (end );
863
+ if (!factor ) {
869
864
errno = EINVAL ;
870
865
return 0 ;
871
866
}
872
867
uval = val < 0 ? - val : val ;
873
- uval *= factor ;
874
- if ( uval > max || ( val < 0 ? - val : val ) > uval ) {
868
+ if ( unsigned_mult_overflows ( factor , uval ) ||
869
+ factor * uval > max ) {
875
870
errno = ERANGE ;
876
871
return 0 ;
877
872
}
@@ -888,21 +883,23 @@ static int git_parse_unsigned(const char *value, uintmax_t *ret, uintmax_t max)
888
883
if (value && * value ) {
889
884
char * end ;
890
885
uintmax_t val ;
891
- uintmax_t oldval ;
886
+ uintmax_t factor ;
892
887
893
888
errno = 0 ;
894
889
val = strtoumax (value , & end , 0 );
895
890
if (errno == ERANGE )
896
891
return 0 ;
897
- oldval = val ;
898
- if (!parse_unit_factor ( end , & val ) ) {
892
+ factor = get_unit_factor ( end ) ;
893
+ if (!factor ) {
899
894
errno = EINVAL ;
900
895
return 0 ;
901
896
}
902
- if (val > max || oldval > val ) {
897
+ if (unsigned_mult_overflows (factor , val ) ||
898
+ factor * val > max ) {
903
899
errno = ERANGE ;
904
900
return 0 ;
905
901
}
902
+ val *= factor ;
906
903
* ret = val ;
907
904
return 1 ;
908
905
}
0 commit comments