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:
None 
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

[7 May 2010 15:13] Mark Callaghan
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.
[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.