[CONC-118] Options get lost and Memory-leak when reconnecting Created: 2014-12-30  Updated: 2015-01-15  Resolved: 2015-01-10

Status: Closed
Project: MariaDB Connector/C
Component/s: None
Affects Version/s: 2.0.0
Fix Version/s: 2.1

Type: Bug Priority: Major
Reporter: Tianhong Assignee: Georg Richter
Resolution: Fixed Votes: 0
Labels: None
Environment:

Linux 32/64 bit


Attachments: File mysql_reconnect_patch.c    

 Description   

Hi Georg,

thanks for fixing the bug CONC-117. But there are still a few bugs which need to be fixed in function "mysql_reconnect" from file "libmariadb.c" :

1. Original options from client would get lost if reconnecting fails, because of the bzero() before function "mysql_real_connect()"

2. The free_me flag in original mysql object is set to 0, which would lead to memory leak. You should store the old value and set it back after cloning from tmp_mysql object.

I wrote the patch with some comment. More details and descriptions can be found in uploaded file.



 Comments   
Comment by Georg Richter [ 2015-01-10 ]

fixed in rev. 192

Comment by Tianhong [ 2015-01-12 ]

Hey Georg,

thanks for the support. I read the new code and thought that the first issue is still there: "Original options from client would get lost if reconnecting fails, because of the bzero() before function "mysql_real_connect()"

It locates on line 2025 in file libmariadb.c from rev.192

If I have understood the code correctly, the "bzero" function which resets the options of mysql object is unnecessary here. Because if the reconnecting fails and enters into the if block below, the original option from mysql object would get lost ( yes it is not freed, but the option field in mysql object is 0 ).

---------------------------------------------------------------------------------------------------------
// Is it a bug?
bzero((char*) &mysql->options,sizeof(mysql->options));
if (!mysql_real_connect(&tmp_mysql,mysql->host,mysql->user,mysql->passwd,
mysql->db, mysql->port, mysql->unix_socket,
mysql->client_flag | CLIENT_REMEMBER_OPTIONS))

{ /* don't free options (CONC-118) */ memset(&tmp_mysql.options, 0, sizeof(struct st_mysql_options)); my_set_error(mysql, tmp_mysql.net.last_errno, tmp_mysql.net.sqlstate, tmp_mysql.net.last_error); mysql_close(&tmp_mysql); DBUG_RETURN(1); }
Comment by Georg Richter [ 2015-01-14 ]

Hi Tanhong,

it's correct bzeroing options should be removed.
I uncommitted and pushed correct ed fix.

Thanks for your help!

Comment by Tianhong [ 2015-01-15 ]

My pleasure!

Generated at Thu Feb 08 03:03:01 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.