@@ -333,7 +333,7 @@ static int git_parse_file(config_fn_t fn, void *data)
333
333
die ("bad config file line %d in %s" , cf -> linenr , cf -> name );
334
334
}
335
335
336
- static int parse_unit_factor (const char * end , unsigned long * val )
336
+ static int parse_unit_factor (const char * end , uintmax_t * val )
337
337
{
338
338
if (!* end )
339
339
return 1 ;
@@ -356,11 +356,23 @@ static int git_parse_long(const char *value, long *ret)
356
356
{
357
357
if (value && * value ) {
358
358
char * end ;
359
- long val = strtol (value , & end , 0 );
360
- unsigned long factor = 1 ;
359
+ intmax_t val ;
360
+ uintmax_t uval ;
361
+ uintmax_t factor = 1 ;
362
+
363
+ errno = 0 ;
364
+ val = strtoimax (value , & end , 0 );
365
+ if (errno == ERANGE )
366
+ return 0 ;
361
367
if (!parse_unit_factor (end , & factor ))
362
368
return 0 ;
363
- * ret = val * factor ;
369
+ uval = abs (val );
370
+ uval *= factor ;
371
+ if ((uval > maximum_signed_value_of_type (long )) ||
372
+ (abs (val ) > uval ))
373
+ return 0 ;
374
+ val *= factor ;
375
+ * ret = val ;
364
376
return 1 ;
365
377
}
366
378
return 0 ;
@@ -370,9 +382,19 @@ int git_parse_ulong(const char *value, unsigned long *ret)
370
382
{
371
383
if (value && * value ) {
372
384
char * end ;
373
- unsigned long val = strtoul (value , & end , 0 );
385
+ uintmax_t val ;
386
+ uintmax_t oldval ;
387
+
388
+ errno = 0 ;
389
+ val = strtoumax (value , & end , 0 );
390
+ if (errno == ERANGE )
391
+ return 0 ;
392
+ oldval = val ;
374
393
if (!parse_unit_factor (end , & val ))
375
394
return 0 ;
395
+ if ((val > maximum_unsigned_value_of_type (long )) ||
396
+ (oldval > val ))
397
+ return 0 ;
376
398
* ret = val ;
377
399
return 1 ;
378
400
}
@@ -553,7 +575,7 @@ static int git_default_core_config(const char *var, const char *value)
553
575
554
576
if (!strcmp (var , "core.packedgitwindowsize" )) {
555
577
int pgsz_x2 = getpagesize () * 2 ;
556
- packed_git_window_size = git_config_int (var , value );
578
+ packed_git_window_size = git_config_ulong (var , value );
557
579
558
580
/* This value must be multiple of (pagesize * 2) */
559
581
packed_git_window_size /= pgsz_x2 ;
@@ -564,18 +586,17 @@ static int git_default_core_config(const char *var, const char *value)
564
586
}
565
587
566
588
if (!strcmp (var , "core.bigfilethreshold" )) {
567
- long n = git_config_int (var , value );
568
- big_file_threshold = 0 < n ? n : 0 ;
589
+ big_file_threshold = git_config_ulong (var , value );
569
590
return 0 ;
570
591
}
571
592
572
593
if (!strcmp (var , "core.packedgitlimit" )) {
573
- packed_git_limit = git_config_int (var , value );
594
+ packed_git_limit = git_config_ulong (var , value );
574
595
return 0 ;
575
596
}
576
597
577
598
if (!strcmp (var , "core.deltabasecachelimit" )) {
578
- delta_base_cache_limit = git_config_int (var , value );
599
+ delta_base_cache_limit = git_config_ulong (var , value );
579
600
return 0 ;
580
601
}
581
602
0 commit comments