Bug #81675 mysqlbinlog does not free the existing connection before opening new remote one
Submitted: 1 Jun 2016 11:26 Modified: 5 Sep 2016 11:41
Reporter: Laurynas Biveinis (OCA) Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Command-line Clients Severity:S3 (Non-critical)
Version:5.5+ OS:Any
Assigned to: CPU Architecture:Any
Tags: asan, lsan, mysqlbinlog

[1 Jun 2016 11:26] Laurynas Biveinis
Description:
"mysqlbinlog --read-from-remote-server log1 log2" opens a new connection to read log2 without freeing the one used for reading log1.

How to repeat:
On 5.7, with LeakSanitizer-enabled AddressSanitizer:
cmake ... -DWITH_ASAN=ON ...
...
$ ./mtr --debug-server binlog_mysqlbinlog_start_stop
...
binlog.binlog_mysqlbinlog_start_stop 'mix' [ fail ]
        Test ended at 2016-06-01 14:17:00

CURRENT_TEST: binlog.binlog_mysqlbinlog_start_stop

=================================================================
==5002==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 1336 byte(s) in 1 object(s) allocated from:
    #0 0x7fd39899e6e9 in __interceptor_calloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x986e9)
    #1 0x4e939f in my_raw_malloc /home/laurynas/mysql-server/mysys/my_malloc.c:189
    #2 0x4e939f in my_malloc /home/laurynas/mysql-server/mysys/my_malloc.c:54
    #3 0x46a62e in mysql_init /home/laurynas/mysql-server/sql-common/client.c:2446
    #4 0x448569 in safe_connect /home/laurynas/mysql-server/client/mysqlbinlog.cc:2260
    #5 0x448569 in dump_remote_log_entries /home/laurynas/mysql-server/client/mysqlbinlog.cc:2539
    #6 0x448569 in dump_single_log /home/laurynas/mysql-server/client/mysqlbinlog.cc:2328
    #7 0x448569 in dump_multiple_logs /home/laurynas/mysql-server/client/mysqlbinlog.cc:2368
    #8 0x44a6de in main /home/laurynas/mysql-server/client/mysqlbinlog.cc:3430
    #9 0x7fd39789b82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)

(...other connection and SSL-related leaks)

Suggested fix:
At the start of safe_connect(), if mysql != NULL, call mysql_close for it, before mysql_init
[1 Jun 2016 11:35] Laurynas Biveinis
The same issue exists on 5.5 and 5.6, but there it's masked by other LSan/client Valgrind bugs: bug 80014, bug 81674, bug 78223
[7 Jun 2016 8:40] MySQL Verification Team
Hello Laurynas,

Thank you for the report.
Observed this with 5.7.13 source build.

Thanks,
Umesh
[7 Jun 2016 8:41] MySQL Verification Team
Build log and test results

Attachment: 81675_5.7.13.build_log (application/octet-stream, text), 282.12 KiB.

[14 Jul 2016 11:31] Laurynas Biveinis
Bug 81675 fix for 5.5/5.6/5.7

(*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.

Contribution: bug81675.patch (application/octet-stream, text), 1.11 KiB.

[14 Jul 2016 11:32] Laurynas Biveinis
I have submitted a Percona Server version of the fix, which strives to be minimal. For a proper fix I would try to restructure mysqlbinlog.cc code so that connection lifetime is managed more naturally.
[5 Sep 2016 11:41] David Moss
Posted by developer:
 
Thank you for your feedback, this has been fixed in upcoming versions and the following was added to the 5.5.52 / 5.6.33 /5.7.15  change logs:
mysqlbinlog --read-from-remote-server log1 log2 was opening a new connection for log2 without freeing the connection used for log1. Thanks to Laurynas Biveinis for the contribution.