• Luis Soares's avatar
    BUG#48357: SHOW BINLOG EVENTS: Wrong offset or I/O error · 46ca22b0
    Luis Soares authored
    In function log_event.cc:Query_log_event::write, there was a cast that
    was triggering undefined behavior. The offending cast is the
    following:
    
      write_str_with_code_and_len((char **)(&start),
                                  catalog, catalog_len, Q_CATALOG_NZ_CODE);
    
    This results in calling write_str_with_code_and_len with first
    argument pointing to a (char **) while "start" is itself a pointer to
    uchar (uchar *). Inside write_str_with_..., the content of start is
    then be updated:
    
      (*dst)+= len;
    
    The instruction above would cause the (*dst) pointer (ie, the "start"
    argument, from the caller point of view, and which actually points to
    uchar instead of pointing to char) to be updated so that it would
    increment catalog_len. However, this seems to break strict-aliasing
    rules ultimately causing the increment and assignment to behave
    unexpectedly.
    
    We fix this by removing the cast and by making the types match.
    46ca22b0
log_event.cc 298 KB