Bug #34431 valgrind warning in 5.1: Relay_log_info.event_relay_log_pos uninitialized
Submitted: 8 Feb 2008 20:12 Modified: 8 Feb 2008 20:35
Reporter: Sven Sandberg Email Updates:
Status: Can't repeat Impact on me:
None 
Category:MySQL Server: Replication Severity:S3 (Non-critical)
Version:5.1 OS:Any
Assigned to: Sven Sandberg CPU Architecture:Any
Tags: apply_event_and_update_pos, Relay_log_info, valgrind

[8 Feb 2008 20:12] Sven Sandberg
Description:
Pushbuild fails on pb-valgrind, here: https://intranet.mysql.com/secure/pushbuild/showpush.pl?dir=mysql-5.1&order=1603

Valgrind log:

VALGRIND: 'Conditional jump or move depends on uninitialised value(s)'
    COUNT: 18
    FUNCTION: int10_to_str    FILES:    master.err
    TESTS:    binlog.binlog_old_versions binlog.binlog_start_comment main.mysqlbinlog rpl.rpl_bug31076
    STACK: at 0xA27EF9: int10_to_str (int2str.c:142)
             by 0xA2859D: llstr (llstr.c:32)
             by 0x78C77C: apply_event_and_update_pos(Log_event*, THD*, Relay_log_info*, bool) (slave.cc:1900)
             by 0x7E3FC9: mysql_client_binlog_statement(THD*) (sql_binlog.cc:207)
             by 0x63F241: mysql_execute_command(THD*) (sql_parse.cc:4583)
             by 0x643765: mysql_parse(THD*, char const*, unsigned, char const**) (sql_parse.cc:5622)
             by 0x643D36: dispatch_command(enum_server_command, THD*, char*, unsigned) (sql_parse.cc:1121)
             by 0x64508A: do_command(THD*) (sql_parse.cc:781)
             by 0x63558B: handle_one_connection (sql_connect.cc:1120)
             by 0x4B2A192: start_thread (in /lib64/libpthread-2.4.so)
             by 0x51A145C: clone (in /lib64/libc-2.4.so)

The failing line is in slave.cc, apply_event_and_update_pos(), where it does:

    DBUG_PRINT("info", ("event %s %s",
                        llstr(rli->event_relay_log_pos, buf),
                        rli->event_relay_log_name));

If apply_event_and_update_pos() is called from a BINLOG statement (instead of from the SQL thread), then rli->event_relay_log_pos is uninitialized at this point.

The root of the error is that rli->event_relay_log_pos is not initialized to 0 in Relay_log_info() constructor.

How to repeat:
Issue a BINLOG statement with valgrind on.

Suggested fix:
===== sql/rpl_rli.cc 1.17 vs edited =====
--- 1.17/sql/rpl_rli.cc 2008-02-05 08:22:17 +01:00
+++ edited/sql/rpl_rli.cc       2008-02-08 21:03:06 +01:00
@@ -32,8 +32,9 @@ int init_strvar_from_file(char *var, int
 Relay_log_info::Relay_log_info()
   :Slave_reporting_capability("SQL"),
    no_storage(FALSE), replicate_same_server_id(::replicate_same_server_id),
-   info_fd(-1), cur_log_fd(-1), save_temporary_tables(0),
+   info_fd(-1), cur_log_fd(-1), cur_log(0), save_temporary_tables(0),
    group_relay_log_pos(0),
+   event_relay_log_pos(0), future_event_relay_log_pos(0),
    cur_log_old_open_count(0), group_master_log_pos(0), log_space_total(0),
    ignore_log_space_limit(0), last_master_timestamp(0), slave_skip_counter(0),
    abort_pos_wait(0), slave_run_id(0), sql_thd(0),
[8 Feb 2008 20:35] Sven Sandberg
Already fixed in 5.1-new-rpl