@@ -808,7 +808,7 @@ ___printf_fp (FILE *fp,
808
808
{
809
809
int width = info -> width ;
810
810
wchar_t * wstartp , * wcp ;
811
- int chars_needed ;
811
+ size_t chars_needed ;
812
812
int expscale ;
813
813
int intdig_max , intdig_no = 0 ;
814
814
int fracdig_min ;
@@ -823,7 +823,7 @@ ___printf_fp (FILE *fp,
823
823
type = info -> spec ;
824
824
intdig_max = 1 ;
825
825
fracdig_min = fracdig_max = info -> prec < 0 ? 6 : info -> prec ;
826
- chars_needed = 1 + 1 + fracdig_max + 1 + 1 + 4 ;
826
+ chars_needed = 1 + 1 + ( size_t ) fracdig_max + 1 + 1 + 4 ;
827
827
/* d . ddd e +- ddd */
828
828
dig_max = INT_MAX ; /* Unlimited. */
829
829
significant = 1 ; /* Does not matter here. */
@@ -838,12 +838,12 @@ ___printf_fp (FILE *fp,
838
838
{
839
839
intdig_max = exponent + 1 ;
840
840
/* This can be really big! */ /* XXX Maybe malloc if too big? */
841
- chars_needed = exponent + 1 + 1 + fracdig_max ;
841
+ chars_needed = ( size_t ) exponent + 1 + 1 + ( size_t ) fracdig_max ;
842
842
}
843
843
else
844
844
{
845
845
intdig_max = 1 ;
846
- chars_needed = 1 + 1 + fracdig_max ;
846
+ chars_needed = 1 + 1 + ( size_t ) fracdig_max ;
847
847
}
848
848
}
849
849
else
@@ -858,7 +858,7 @@ ___printf_fp (FILE *fp,
858
858
type = isupper (info -> spec ) ? 'E' : 'e' ;
859
859
fracdig_max = dig_max - 1 ;
860
860
intdig_max = 1 ;
861
- chars_needed = 1 + 1 + fracdig_max + 1 + 1 + 4 ;
861
+ chars_needed = 1 + 1 + ( size_t ) fracdig_max + 1 + 1 + 4 ;
862
862
}
863
863
else
864
864
{
@@ -870,7 +870,7 @@ ___printf_fp (FILE *fp,
870
870
zeros can be as many as would be required for
871
871
exponential notation with a negative two-digit
872
872
exponent, which is 4. */
873
- chars_needed = dig_max + 1 + 4 ;
873
+ chars_needed = ( size_t ) dig_max + 1 + 4 ;
874
874
}
875
875
fracdig_min = info -> alt ? fracdig_max : 0 ;
876
876
significant = 0 ; /* We count significant digits. */
@@ -888,16 +888,17 @@ ___printf_fp (FILE *fp,
888
888
it is possible that we need two more characters in front of all the
889
889
other output. If the amount of memory we have to allocate is too
890
890
large use `malloc' instead of `alloca'. */
891
+ size_t wbuffer_to_alloc = (2 + (size_t ) chars_needed ) * sizeof (wchar_t );
891
892
buffer_malloced = ! __libc_use_alloca (chars_needed * 2 * sizeof (wchar_t ));
892
893
if (__builtin_expect (buffer_malloced , 0 ))
893
894
{
894
- wbuffer = (wchar_t * ) malloc (( 2 + chars_needed ) * sizeof ( wchar_t ) );
895
+ wbuffer = (wchar_t * ) malloc (wbuffer_to_alloc );
895
896
if (wbuffer == NULL )
896
897
/* Signal an error to the caller. */
897
898
return -1 ;
898
899
}
899
900
else
900
- wbuffer = (wchar_t * ) alloca (( 2 + chars_needed ) * sizeof ( wchar_t ) );
901
+ wbuffer = (wchar_t * ) alloca (wbuffer_to_alloc );
901
902
wcp = wstartp = wbuffer + 2 ; /* Let room for rounding. */
902
903
903
904
/* Do the real work: put digits in allocated buffer. */
0 commit comments