Skip to content

Commit a72a981

Browse files
author
Tor Didriksen
committed
merge 5.0-security => 5.1-security
2 parents 9827d4a + cfe3489 commit a72a981

6 files changed

Lines changed: 44 additions & 5 deletions

File tree

client/sql_string.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ bool String::set(ulonglong num, CHARSET_INFO *cs)
118118

119119
bool String::set(double num,uint decimals, CHARSET_INFO *cs)
120120
{
121-
char buff[331];
121+
char buff[FLOATING_POINT_BUFFER];
122122
uint dummy_errors;
123123

124124
str_charset=cs;
@@ -188,7 +188,9 @@ bool String::set(double num,uint decimals, CHARSET_INFO *cs)
188188
#else
189189
#ifdef HAVE_SNPRINTF
190190
buff[sizeof(buff)-1]=0; // Safety
191-
snprintf(buff,sizeof(buff)-1, "%.*f",(int) decimals,num);
191+
int num_chars= snprintf(buff, sizeof(buff)-1, "%.*f",(int) decimals, num);
192+
DBUG_ASSERT(num_chars > 0);
193+
DBUG_ASSERT(num_chars < (int) sizeof(buff));
192194
#else
193195
sprintf(buff,"%.*f",(int) decimals,num);
194196
#endif

include/m_string.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,15 @@ extern int is_prefix(const char *, const char *);
179179
double my_strtod(const char *str, char **end, int *error);
180180
double my_atof(const char *nptr);
181181

182+
#ifndef NOT_FIXED_DEC
183+
#define NOT_FIXED_DEC 31
184+
#endif
185+
186+
/*
187+
Max length of a floating point number.
188+
*/
189+
#define FLOATING_POINT_BUFFER (311 + NOT_FIXED_DEC)
190+
182191
extern char *llstr(longlong value,char *buff);
183192
extern char *ullstr(longlong value,char *buff);
184193
#ifndef HAVE_STRTOUL

mysql-test/r/type_float.result

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,4 +407,16 @@ SELECT f1 FROM t1;
407407
f1
408408
-1.79769313486231e+308
409409
DROP TABLE t1;
410+
#
411+
# Bug#12406055 BUFFER OVERFLOW OF VARIABLE 'BUFF' IN STRING::SET_REAL
412+
#
413+
select format(-1.7976931348623157E+307,256) as foo;
414+
foo
415+
ignore_float_result
416+
select least(-1.1111111111111111111111111,
417+
- group_concat(1.7976931348623157E+308)) as foo;
418+
foo
419+
ignore_float_result
420+
select concat((truncate((-1.7976931348623157E+307),(0x1e))),
421+
(99999999999999999999999999999999999999999999999999999999999999999)) into @a;
410422
End of 5.0 tests

mysql-test/t/type_float.test

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,4 +276,19 @@ INSERT INTO t1 VALUES(-1.79769313486231e+308);
276276
SELECT f1 FROM t1;
277277
DROP TABLE t1;
278278

279+
--echo #
280+
--echo # Bug#12406055 BUFFER OVERFLOW OF VARIABLE 'BUFF' IN STRING::SET_REAL
281+
--echo #
282+
283+
let $nine_65=
284+
99999999999999999999999999999999999999999999999999999999999999999;
285+
286+
--replace_column 1 ignore_float_result
287+
select format(-1.7976931348623157E+307,256) as foo;
288+
--replace_column 1 ignore_float_result
289+
select least(-1.1111111111111111111111111,
290+
- group_concat(1.7976931348623157E+308)) as foo;
291+
eval select concat((truncate((-1.7976931348623157E+307),(0x1e))),
292+
($nine_65)) into @a;
293+
279294
--echo End of 5.0 tests

sql/sql_string.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ bool String::set_int(longlong num, bool unsigned_flag, CHARSET_INFO *cs)
130130

131131
bool String::set_real(double num,uint decimals, CHARSET_INFO *cs)
132132
{
133-
char buff[331];
133+
char buff[FLOATING_POINT_BUFFER];
134134
uint dummy_errors;
135135

136136
str_charset=cs;
@@ -200,7 +200,9 @@ bool String::set_real(double num,uint decimals, CHARSET_INFO *cs)
200200
#else
201201
#ifdef HAVE_SNPRINTF
202202
buff[sizeof(buff)-1]=0; // Safety
203-
snprintf(buff,sizeof(buff)-1, "%.*f",(int) decimals,num);
203+
int num_chars= snprintf(buff, sizeof(buff)-1, "%.*f",(int) decimals, num);
204+
DBUG_ASSERT(num_chars > 0);
205+
DBUG_ASSERT(num_chars < (int) sizeof(buff));
204206
#else
205207
sprintf(buff,"%.*f",(int) decimals,num);
206208
#endif

sql/unireg.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,6 @@
210210
*/
211211

212212
#define BIN_LOG_HEADER_SIZE 4
213-
#define FLOATING_POINT_BUFFER 331
214213

215214
#define DEFAULT_KEY_CACHE_NAME "default"
216215

0 commit comments

Comments
 (0)