Description:
Function 'eval_num_suffix' in mysys_ssl/my_getopt.cc is possibility returing value overflow/underflow at 'K', 'M' or 'G' suffix.
How to repeat:
1. Set the following in my.cnf:
[mysqld]
optimizer_trace_offset = 9223372036854775807K
2. mysqld start
3. mysql -e 'select @@global.optimizer_trace_offset \G'
*************************** 1. row ***************************
@@global.optimizer_trace_offset: -1024
Suggested fix:
overflow/underflow value caps.
at function 'eval_num_suffix' in mysys_ssl/my_getopt.cc
for example, before:
if (*endchar == 'k' || *endchar == 'K')
num*= 1024L;
else if (*endchar == 'm' || *endchar == 'M')
num*= 1024L * 1024L;
else if (*endchar == 'g' || *endchar == 'G')
num*= 1024L * 1024L * 1024L;
after (using strtoll on eval_num_suffix):
if (*endchar == 'k' || *endchar == 'K')
{
if (num > (LLONG_MAX / 1024L))
{
num = LLONG_MAX;
}
else if (num < (LLONG_MIN / 1024L))
{
num = LLONG_MIN;
}
else
{
num*= 1024L;
}
}
else if (*endchar == 'm' || *endchar == 'M')
{
if (num > (LLONG_MAX / (1024L * 1024L)))
{
num = LLONG_MAX;
}
else if (num < (LLONG_MIN / (1024L * 1024L)))
{
num = LLONG_MIN;
}
else
{
num*= 1024L * 1024L;
}
}
else if (*endchar == 'g' || *endchar == 'G')
{
if (num > (LLONG_MAX / (1024L * 1024L * 1024L)))
{
num = LLONG_MAX;
}
else if (num < (LLONG_MIN / (1024L * 1024L * 1024L)))
{
num = LLONG_MIN;
}
else
{
num*= 1024L * 1024L * 1024L;
}
}