Skip to content

Commit 9cdff98

Browse files
author
knielsen@loke.(none)
committed
Merge loke.(none):/home/knielsen/devel/mysql-5.0-maint
into loke.(none):/home/knielsen/devel/mysql-5.1-new-maint
2 parents 1d2f73e + 5dc5fc8 commit 9cdff98

4 files changed

Lines changed: 56 additions & 40 deletions

File tree

strings/ctype-simple.c

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,7 @@ size_t my_long10_to_str_8bit(CHARSET_INFO *cs __attribute__((unused)),
845845
register char *p, *e;
846846
long int new_val;
847847
uint sign=0;
848+
unsigned long int uval = (unsigned long int) val;
848849

849850
e = p = &buffer[sizeof(buffer)-1];
850851
*p= 0;
@@ -853,15 +854,16 @@ size_t my_long10_to_str_8bit(CHARSET_INFO *cs __attribute__((unused)),
853854
{
854855
if (val < 0)
855856
{
856-
val= -val;
857+
/* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
858+
uval= (unsigned long int)0 - uval;
857859
*dst++= '-';
858860
len--;
859861
sign= 1;
860862
}
861863
}
862864

863-
new_val = (long) ((unsigned long int) val / 10);
864-
*--p = '0'+ (char) ((unsigned long int) val - (unsigned long) new_val * 10);
865+
new_val = (long) (uval / 10);
866+
*--p = '0'+ (char) (uval - (unsigned long) new_val * 10);
865867
val = new_val;
866868

867869
while (val != 0)
@@ -885,12 +887,14 @@ size_t my_longlong10_to_str_8bit(CHARSET_INFO *cs __attribute__((unused)),
885887
register char *p, *e;
886888
long long_val;
887889
uint sign= 0;
890+
ulonglong uval = (ulonglong)val;
888891

889892
if (radix < 0)
890893
{
891894
if (val < 0)
892895
{
893-
val = -val;
896+
/* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
897+
uval = (ulonglong)0 - uval;
894898
*dst++= '-';
895899
len--;
896900
sign= 1;
@@ -900,22 +904,22 @@ size_t my_longlong10_to_str_8bit(CHARSET_INFO *cs __attribute__((unused)),
900904
e = p = &buffer[sizeof(buffer)-1];
901905
*p= 0;
902906

903-
if (val == 0)
907+
if (uval == 0)
904908
{
905909
*--p= '0';
906910
len= 1;
907911
goto cnv;
908912
}
909913

910-
while ((ulonglong) val > (ulonglong) LONG_MAX)
914+
while (uval > (ulonglong) LONG_MAX)
911915
{
912-
ulonglong quo=(ulonglong) val/(uint) 10;
913-
uint rem= (uint) (val- quo* (uint) 10);
916+
ulonglong quo= uval/(uint) 10;
917+
uint rem= (uint) (uval- quo* (uint) 10);
914918
*--p = '0' + rem;
915-
val= quo;
919+
uval= quo;
916920
}
917921

918-
long_val= (long) val;
922+
long_val= (long) uval;
919923
while (long_val != 0)
920924
{
921925
long quo= long_val/10;

strings/ctype-ucs2.c

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,6 +1019,7 @@ size_t my_l10tostr_ucs2(CHARSET_INFO *cs,
10191019
register char *p, *db, *de;
10201020
long int new_val;
10211021
int sl=0;
1022+
unsigned long int uval = (unsigned long int) val;
10221023

10231024
p = &buffer[sizeof(buffer)-1];
10241025
*p='\0';
@@ -1028,12 +1029,13 @@ size_t my_l10tostr_ucs2(CHARSET_INFO *cs,
10281029
if (val < 0)
10291030
{
10301031
sl = 1;
1031-
val = -val;
1032+
/* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
1033+
uval = (unsigned long int)0 - uval;
10321034
}
10331035
}
10341036

1035-
new_val = (long) ((unsigned long int) val / 10);
1036-
*--p = '0'+ (char) ((unsigned long int) val - (unsigned long) new_val * 10);
1037+
new_val = (long) (uval / 10);
1038+
*--p = '0'+ (char) (uval - (unsigned long) new_val * 10);
10371039
val = new_val;
10381040

10391041
while (val != 0)
@@ -1067,34 +1069,36 @@ size_t my_ll10tostr_ucs2(CHARSET_INFO *cs __attribute__((unused)),
10671069
register char *p, *db, *de;
10681070
long long_val;
10691071
int sl=0;
1072+
ulonglong uval= (ulonglong) val;
10701073

10711074
if (radix < 0)
10721075
{
10731076
if (val < 0)
10741077
{
10751078
sl=1;
1076-
val = -val;
1079+
/* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
1080+
uval = (ulonglong)0 - uval;
10771081
}
10781082
}
10791083

10801084
p = &buffer[sizeof(buffer)-1];
10811085
*p='\0';
10821086

1083-
if (val == 0)
1087+
if (uval == 0)
10841088
{
10851089
*--p='0';
10861090
goto cnv;
10871091
}
10881092

1089-
while ((ulonglong) val > (ulonglong) LONG_MAX)
1093+
while (uval > (ulonglong) LONG_MAX)
10901094
{
1091-
ulonglong quo=(ulonglong) val/(size_t) 10;
1092-
uint rem= (uint) (val- quo* (uint) 10);
1095+
ulonglong quo= uval/(uint) 10;
1096+
uint rem= (uint) (uval- quo* (uint) 10);
10931097
*--p = '0' + rem;
1094-
val= quo;
1098+
uval= quo;
10951099
}
10961100

1097-
long_val= (long) val;
1101+
long_val= (long) uval;
10981102
while (long_val != 0)
10991103
{
11001104
long quo= long_val/10;

strings/int2str.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ int2str(register long int val, register char *dst, register int radix,
5757
register char *p;
5858
long int new_val;
5959
char *dig_vec= upcase ? _dig_vec_upper : _dig_vec_lower;
60+
ulong uval= (ulong) val;
6061

6162
if (radix < 0)
6263
{
@@ -65,7 +66,8 @@ int2str(register long int val, register char *dst, register int radix,
6566
if (val < 0)
6667
{
6768
*dst++ = '-';
68-
val = -val;
69+
/* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
70+
uval = (ulong)0 - uval;
6971
}
7072
radix = -radix;
7173
}
@@ -86,8 +88,8 @@ int2str(register long int val, register char *dst, register int radix,
8688
*/
8789
p = &buffer[sizeof(buffer)-1];
8890
*p = '\0';
89-
new_val=(ulong) val / (ulong) radix;
90-
*--p = dig_vec[(uchar) ((ulong) val- (ulong) new_val*(ulong) radix)];
91+
new_val= uval / (ulong) radix;
92+
*--p = dig_vec[(uchar) (uval- (ulong) new_val*(ulong) radix)];
9193
val = new_val;
9294
#ifdef HAVE_LDIV
9395
while (val != 0)
@@ -133,20 +135,22 @@ char *int10_to_str(long int val,char *dst,int radix)
133135
char buffer[65];
134136
register char *p;
135137
long int new_val;
138+
unsigned long int uval = (unsigned long int) val;
136139

137140
if (radix < 0) /* -10 */
138141
{
139142
if (val < 0)
140143
{
141144
*dst++ = '-';
142-
val = -val;
145+
/* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
146+
uval = (unsigned long int)0 - uval;
143147
}
144148
}
145149

146150
p = &buffer[sizeof(buffer)-1];
147151
*p = '\0';
148-
new_val= (long) ((unsigned long int) val / 10);
149-
*--p = '0'+ (char) ((unsigned long int) val - (unsigned long) new_val * 10);
152+
new_val= (long) (uval / 10);
153+
*--p = '0'+ (char) (uval - (unsigned long) new_val * 10);
150154
val = new_val;
151155

152156
while (val != 0)

strings/longlong2str.c

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)