• unknown's avatar
    Bug #27383: Crash in test "mysql_client_test" · fe036d98
    unknown authored
    The C optimizer may decide that data access operations
    through pointer of different type are not related to 
    the original data (strict aliasing).
    This is what happens in fetch_long_with_conversion(),
    when called as part of mysql_stmt_fetch() : it tries 
    to check for truncation errors by first storing float
    (and other types of data) into a char * buffer and then 
    accesses them through a float pointer.
    This is done to prevent the effects of excess precision
    when using FPU registers.
    However the doublestore() macro converts a double pointer
    to an union pointer. This violates the strict aliasing rule.
    Fixed by making the intermediary variables volatile (
    to not re-introduce the excess precision bug) and using
    the intermediary value instead of the char * buffer.
    Note that there can be loss of precision for both signed
    and unsigned 64 bit integers converted to double and back,
    so the check must stay there (even for compatibility 
    reasons).
    Based on the excellent analysis in bug 28400.
    
    
    libmysql/libmysql.c:
      Bug #27383: avoid pointer aliasing problems while 
      not re-violating the Intel FPU gcc bug.
    fe036d98
libmysql.c 143 KB