Bug #53493 add_to_status does not handle the longlong fields in STATUS_VAR
| Submitted: | 7 May 2010 15:13 | Modified: | 14 Oct 2010 15:03 |
|---|---|---|---|
| Reporter: | Mark Callaghan | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: General | Severity: | S3 (Non-critical) |
| Version: | 5.0, 5.1, mysql-trunk | OS: | Any |
| Assigned to: | Georgi Kodinov | CPU Architecture: | Any |
| Tags: | show, STATUS | ||
[8 May 2010 11:58]
Valeriy Kravchuk
Verified by code review of sql/sql_class.h:
/* per thread status variables */
typedef struct system_status_var
{
ulonglong bytes_received;
ulonglong bytes_sent;
ulong com_other;
ulong com_stat[(uint) SQLCOM_END];
ulong created_tmp_disk_tables;
ulong created_tmp_tables;
...
[5 Jul 2010 13: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/commits/112895 3465 Georgi Kodinov 2010-07-05 Bug #53493 : add_to_status does not handle the longlong fields in STATUS_VAR Done a little code cleanup in struct system_status_var. Although no real wrong data were returned (since the two non-conformingly sized variables were never referenced through add_to_status()/add_diff_to_status()) it's still error-prone and not a good programming style. Fixed by moving the two variables outside of the reach of add_to_status()/add_diff_to_status().
[7 Jul 2010 13:58]
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/commits/113035 3465 Georgi Kodinov 2010-07-07 Bug #53493 : add_to_status does not handle the longlong fields in STATUS_VAR Created a provision to handle correctly a set of ulonglong status variables in addition to the ulong status variables. Moved bytes_received/bytes_sent into the new ulonglong group, so that add_to_status()/add_diff_to_status() can handle them correctly.
[14 Jul 2010 8:50]
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/commits/113521 3465 Georgi Kodinov 2010-07-14 Bug #53493 : add_to_status does not handle the longlong fields in STATUS_VAR bytes_received/bytes_sent are ulonglong so they cannot be handled by the ulong handling code in add_to_status/add_diff_to_status(). Fixed by adding code to handle these two variables in add_to_status()/add_diff_to_status() and making sure they are not a subject to the ulong handling code.
[14 Jul 2010 11:01]
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/commits/113546 3480 Georgi Kodinov 2010-07-14 Bug #53493 : add_to_status does not handle the longlong fields in STATUS_VAR bytes_received/bytes_sent are ulonglong so they cannot be handled by the ulong handling code in add_to_status/add_diff_to_status(). Fixed by adding code to handle these two variables in add_to_status()/add_diff_to_status() and making sure they are not a subject to the ulong handling code.
[23 Jul 2010 12:23]
Bugs System
Pushed into mysql-trunk 5.5.6-m3 (revid:alik@sun.com-20100723121820-jryu2fuw3pc53q9w) (version source revid:vasil.dimov@oracle.com-20100531152341-x2d4hma644icamh1) (merge vers: 5.5.5-m3) (pib:18)
[23 Jul 2010 12:30]
Bugs System
Pushed into mysql-next-mr (revid:alik@sun.com-20100723121929-90e9zemk3jkr2ocy) (version source revid:vasil.dimov@oracle.com-20100531152341-x2d4hma644icamh1) (pib:18)
[3 Aug 2010 17:23]
Paul DuBois
Noted in 5.1.50, 5.5.6 changelogs. Portability problems in SHOW STATUS could lead to incorrect results on some platforms.
[19 Aug 2010 15:41]
Bugs System
Pushed into mysql-5.1 5.1.51 (revid:build@mysql.com-20100819151858-muaaor6jojb5ouzj) (version source revid:build@mysql.com-20100819151858-muaaor6jojb5ouzj) (merge vers: 5.1.51) (pib:20)
[14 Oct 2010 8:31]
Bugs System
Pushed into mysql-5.1-telco-7.0 5.1.51-ndb-7.0.20 (revid:martin.skold@mysql.com-20101014082627-jrmy9xbfbtrebw3c) (version source revid:martin.skold@mysql.com-20101014082627-jrmy9xbfbtrebw3c) (merge vers: 5.1.51-ndb-7.0.20) (pib:21)
[14 Oct 2010 8:47]
Bugs System
Pushed into mysql-5.1-telco-6.3 5.1.51-ndb-6.3.39 (revid:martin.skold@mysql.com-20101014083757-5qo48b86d69zjvzj) (version source revid:martin.skold@mysql.com-20101014083757-5qo48b86d69zjvzj) (merge vers: 5.1.51-ndb-6.3.39) (pib:21)
[14 Oct 2010 9:01]
Bugs System
Pushed into mysql-5.1-telco-6.2 5.1.51-ndb-6.2.19 (revid:martin.skold@mysql.com-20101014084420-y54ecj85j5we27oa) (version source revid:martin.skold@mysql.com-20101014084420-y54ecj85j5we27oa) (merge vers: 5.1.51-ndb-6.2.19) (pib:21)
[14 Oct 2010 15:03]
Jon Stephens
Already documented in the 5.1.50 changelog; no new changelog entries required. setting back to Closed state.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.047 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: add_to_status() and add_diff_to_status() assume all fields in STATUS var from the start to "last_system_status_var" (questions) are long/ulong. Alas, they are not: typedef struct system_status_var { ulonglong bytes_received; ulonglong bytes_sent; ulong com_other; ... The code in add_to_status() and add_diff_to_status() produce incorrect results for bytes_received and bytes_sent when there is overflow in the long/ulong addition done on the low 4 bytes. How to repeat: Read the code. Why are the requirements on the STATUS_VAR struct listed here but not in the declaration of the struct? ----------------- /* Add all status variables to another status variable array SYNOPSIS add_to_status() to_var add to this array from_var from this array NOTES This function assumes that all variables are long/ulong. If this assumption will change, then we have to explictely add the other variables after the while loop */ void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var) { ulong *end= (ulong*) ((uchar*) to_var + offsetof(STATUS_VAR, last_system_status_var) + sizeof(ulong)); ulong *to= (ulong*) to_var, *from= (ulong*) from_var; while (to != end) *(to++)+= *(from++); } Suggested fix: Add a comment to STATUS_VAR to describe the long/ulong field requirement. Move bytes_received, bytes_sent to the end of the struct. Do math on them directly.