← Back to team overview

maria-developers team mailing list archive

bzr commit into MariaDB 5.1, with Maria 1.5:maria branch (knielsen:2716)

 

#At lp:maria

 2716 knielsen@xxxxxxxxxxxxxxx	2009-06-23
      Fix memory leak in mysql_ssl_set() when called more than once.
      Fix sleep() synchronisation in innodb_information_schema test case.
      modified:
        mysql-test/t/innodb_information_schema.test
        sql-common/client.c

per-file messages:
  mysql-test/t/innodb_information_schema.test
    Using sleep for synchronisation does not work!!!
    Replace by looping until the required condition is met.
  sql-common/client.c
    mysql_ssl_set() did not free old pointers before overwriting with new ones (happens when
    mysql_ssl_set() is called twice without calling mysql_close() in-between).
    
    This sometimes caused memory leaks in the slave depending on exact timing of
    master/slave shutdown.
    
    Fixed by freeing old pointers before installing new ones in mysql_ssl_set(), just like
    mysql_options() does.
=== modified file 'mysql-test/t/innodb_information_schema.test'
--- a/mysql-test/t/innodb_information_schema.test	2009-06-09 13:19:13 +0000
+++ b/mysql-test/t/innodb_information_schema.test	2009-06-23 12:00:24 +0000
@@ -109,14 +109,19 @@ SELECT * FROM ```t'\"_str` WHERE c1 = '3
 -- send
 SELECT * FROM ```t'\"_str` WHERE c1 = '4' FOR UPDATE;
 
-# Give time to the above 2 queries to execute before continuing.
-# Without this sleep it sometimes happens that the SELECT from innodb_locks
+-- connection con_verify_innodb_locks
+
+# Loop, giving time for the above 2 queries to execute before continuing.
+# Without this, it sometimes happens that the SELECT FROM innodb_locks
 # executes before some of them, resulting in less than expected number
 # of rows being selected from innodb_locks.
--- sleep 0.1
+SET @counter := 0;
+while (`SELECT (@counter := @counter + 1) <= 50 AND COUNT(*) != 14 FROM INFORMATION_SCHEMA.INNODB_LOCKS`)
+{
+  sleep 0.1;
+}
 
 -- enable_result_log
--- connection con_verify_innodb_locks
 SELECT lock_mode, lock_type, lock_table, lock_index, lock_rec, lock_data
 FROM INFORMATION_SCHEMA.INNODB_LOCKS ORDER BY lock_data;
 

=== modified file 'sql-common/client.c'
--- a/sql-common/client.c	2009-04-25 10:05:32 +0000
+++ b/sql-common/client.c	2009-06-23 12:00:24 +0000
@@ -1585,6 +1585,11 @@ mysql_ssl_set(MYSQL *mysql __attribute__
 {
   DBUG_ENTER("mysql_ssl_set");
 #ifdef HAVE_OPENSSL
+  my_free(mysql->options.ssl_key, MYF(MY_ALLOW_ZERO_PTR));
+  my_free(mysql->options.ssl_cert, MYF(MY_ALLOW_ZERO_PTR));
+  my_free(mysql->options.ssl_ca, MYF(MY_ALLOW_ZERO_PTR));
+  my_free(mysql->options.ssl_capath, MYF(MY_ALLOW_ZERO_PTR));
+  my_free(mysql->options.ssl_cipher, MYF(MY_ALLOW_ZERO_PTR));
   mysql->options.ssl_key=    strdup_if_not_null(key);
   mysql->options.ssl_cert=   strdup_if_not_null(cert);
   mysql->options.ssl_ca=     strdup_if_not_null(ca);