Bug #12925 | GET_LL in my_getopt.c is buggy | ||
---|---|---|---|
Submitted: | 1 Sep 2005 7:45 | Modified: | 31 Oct 2005 19:31 |
Reporter: | Osku Salerma | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server | Severity: | S2 (Serious) |
Version: | 4.1, 5.0 | OS: | Any 32-bit target |
Assigned to: | Jim Winstead | CPU Architecture: | Any |
[1 Sep 2005 7:45]
Osku Salerma
[1 Sep 2005 12:18]
Hartmut Holzgraefe
the double cast (ulonglong) (ulong) optp->max_value clearly looks like some sort of copy/paste bug to me
[2 Sep 2005 23:13]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/internals/29261
[2 Sep 2005 23:14]
Jim Winstead
problem is in 4.1, too.
[5 Sep 2005 7:55]
Osku Salerma
The patch is woefully inadequate. After applying it to my tree and having innodb_buffer_pool_size=25600M in my ~/.my.cnf, and adding a printf to getopt_ll so I know what it's returning I get this: getopt_ll: '25600M', 9223372036853727232 i.e. it's returning optp->max_value - 1 MB, probably because the patch still leaves one ulong cast, in the if condition. I can't believe the test case added: DIE_UNLESS(opt_getopt_ll_test > LL(4*1024*1024*1024)); It's checking that the value parsed is bigger than 4GB, but not checking that it's actually the correct value? What's up with that? Now, if I modify the code like this: num= eval_num_suffix(arg, err, (char*) optp->name); - if (num > 0 && (ulonglong) num > (ulonglong) (ulong) optp->max_value && + if (num > 0 && (ulonglong) num > (ulonglong) optp->max_value && optp->max_value) /* if max value is not set -> no upper limit */ - num= (longlong) (ulong) optp->max_value; + num= optp->max_value; num= ((num - (longlong) optp->sub_size) / block_size); num= (longlong) (num * block_size); it seems to work: getopt_ll: '25600M', 26843545600 However, I'm not sure what those ulonglong casts are doing there since this is dealing only with values that fit in a longlong, and also, why a max_value of 0 is special-cased as "no max value" instead of simply requiring every config value to supply correct max values. That's a way bigger change than I'm prepared to make, however.
[12 Sep 2005 17:09]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/internals/29677
[14 Sep 2005 1:44]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/internals/29781
[23 Sep 2005 11:40]
Osku Salerma
Jim, any ETA on this? This is blocking bug #12701, and proper support for 64-bit Windows would be nice to have.
[28 Oct 2005 1:56]
Jim Winstead
Fixed in 4.1.16 and 5.0.16.
[31 Oct 2005 19:31]
Paul DuBois
Noted in 4.1.16, 5.0.16 changelogs.