@@ -931,7 +931,16 @@ static int git_parse_int64(const char *value, int64_t *ret)
931931int git_parse_ulong (const char * value , unsigned long * ret )
932932{
933933 uintmax_t tmp ;
934- if (!git_parse_unsigned (value , & tmp , maximum_unsigned_value_of_type (long )))
934+ if (!git_parse_unsigned (value , & tmp , maximum_unsigned_value_of_type (unsigned long )))
935+ return 0 ;
936+ * ret = tmp ;
937+ return 1 ;
938+ }
939+
940+ int git_parse_size_t (const char * value , size_t * ret )
941+ {
942+ uintmax_t tmp ;
943+ if (!git_parse_unsigned (value , & tmp , maximum_unsigned_value_of_type (size_t )))
935944 return 0 ;
936945 * ret = tmp ;
937946 return 1 ;
@@ -1004,6 +1013,15 @@ unsigned long git_config_ulong(const char *name, const char *value)
10041013 return ret ;
10051014}
10061015
1016+ /* on Windows we require size_t to cover the 64-bit range */
1017+ size_t git_config_size_t (const char * name , const char * value )
1018+ {
1019+ size_t ret ;
1020+ if (!git_parse_size_t (value , & ret ))
1021+ die_bad_number (name , value );
1022+ return ret ;
1023+ }
1024+
10071025ssize_t git_config_ssize_t (const char * name , const char * value )
10081026{
10091027 ssize_t ret ;
@@ -1218,12 +1236,12 @@ static int git_default_core_config(const char *var, const char *value, void *cb)
12181236 }
12191237
12201238 if (!strcmp (var , "core.bigfilethreshold" )) {
1221- big_file_threshold = git_config_ulong (var , value );
1239+ big_file_threshold = git_config_size_t (var , value );
12221240 return 0 ;
12231241 }
12241242
12251243 if (!strcmp (var , "core.packedgitlimit" )) {
1226- packed_git_limit = git_config_ulong (var , value );
1244+ packed_git_limit = git_config_size_t (var , value );
12271245 return 0 ;
12281246 }
12291247
@@ -1471,7 +1489,7 @@ int git_default_config(const char *var, const char *value, void *cb)
14711489 }
14721490
14731491 if (!strcmp (var , "pack.packsizelimit" )) {
1474- pack_size_limit_cfg = git_config_ulong (var , value );
1492+ pack_size_limit_cfg = git_config_size_t (var , value );
14751493 return 0 ;
14761494 }
14771495
@@ -1655,6 +1673,18 @@ unsigned long git_env_ulong(const char *k, unsigned long val)
16551673 return val ;
16561674}
16571675
1676+ /*
1677+ * Parse environment variable 'k' as ulong with possibly a unit
1678+ * suffix; if missing, use the default value 'val'.
1679+ */
1680+ size_t git_env_size_t (const char * k , size_t val )
1681+ {
1682+ const char * v = getenv (k );
1683+ if (v && !git_parse_size_t (v , & val ))
1684+ die (_ ("failed to parse %s" ), k );
1685+ return val ;
1686+ }
1687+
16581688int git_config_system (void )
16591689{
16601690 return !git_env_bool ("GIT_CONFIG_NOSYSTEM" , 0 );
0 commit comments