@@ -51,21 +51,23 @@ char *longlong2str(longlong val,char *dst,int radix)
5151 char buffer [65 ];
5252 register char * p ;
5353 long long_val ;
54+ ulonglong uval = (ulonglong ) val ;
5455
5556 if (radix < 0 )
5657 {
5758 if (radix < -36 || radix > -2 ) return (char * ) 0 ;
5859 if (val < 0 ) {
5960 * dst ++ = '-' ;
60- val = - val ;
61+ /* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
62+ uval = (ulonglong )0 - uval ;
6163 }
6264 radix = - radix ;
6365 }
6466 else
6567 {
6668 if (radix > 36 || radix < 2 ) return (char * ) 0 ;
6769 }
68- if (val == 0 )
70+ if (uval == 0 )
6971 {
7072 * dst ++ = '0' ;
7173 * dst = '\0' ;
@@ -74,14 +76,14 @@ char *longlong2str(longlong val,char *dst,int radix)
7476 p = & buffer [sizeof (buffer )- 1 ];
7577 * p = '\0' ;
7678
77- while (( ulonglong ) val > (ulonglong ) LONG_MAX )
79+ while (uval > (ulonglong ) LONG_MAX )
7880 {
79- ulonglong quo = ( ulonglong ) val /(uint ) radix ;
80- uint rem = (uint ) (val - quo * (uint ) radix );
81+ ulonglong quo = uval /(uint ) radix ;
82+ uint rem = (uint ) (uval - quo * (uint ) radix );
8183 * -- p = _dig_vec_upper [rem ];
82- val = quo ;
84+ uval = quo ;
8385 }
84- long_val = (long ) val ;
86+ long_val = (long ) uval ;
8587 while (long_val != 0 )
8688 {
8789 long quo = long_val /radix ;
@@ -100,17 +102,19 @@ char *longlong10_to_str(longlong val,char *dst,int radix)
100102 char buffer [65 ];
101103 register char * p ;
102104 long long_val ;
105+ ulonglong uval = (ulonglong ) val ;
103106
104107 if (radix < 0 )
105108 {
106109 if (val < 0 )
107110 {
108111 * dst ++ = '-' ;
109- val = - val ;
112+ /* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
113+ uval = (ulonglong )0 - uval ;
110114 }
111115 }
112116
113- if (val == 0 )
117+ if (uval == 0 )
114118 {
115119 * dst ++ = '0' ;
116120 * dst = '\0' ;
@@ -119,14 +123,14 @@ char *longlong10_to_str(longlong val,char *dst,int radix)
119123 p = & buffer [sizeof (buffer )- 1 ];
120124 * p = '\0' ;
121125
122- while (( ulonglong ) val > (ulonglong ) LONG_MAX )
126+ while (uval > (ulonglong ) LONG_MAX )
123127 {
124- ulonglong quo = ( ulonglong ) val /(uint ) 10 ;
125- uint rem = (uint ) (val - quo * (uint ) 10 );
128+ ulonglong quo = uval /(uint ) 10 ;
129+ uint rem = (uint ) (uval - quo * (uint ) 10 );
126130 * -- p = _dig_vec_upper [rem ];
127- val = quo ;
131+ uval = quo ;
128132 }
129- long_val = (long ) val ;
133+ long_val = (long ) uval ;
130134 while (long_val != 0 )
131135 {
132136 long quo = long_val /10 ;
0 commit comments