From 747351836c524cb15dfb0c5ed735921ab98acb6b Mon Sep 17 00:00:00 2001 From: Georgi Kodinov Date: Wed, 15 Oct 2008 16:55:52 +0300 Subject: [PATCH] Bug #38693: leaked memory with blobs! If delayed insert fails to upgrade the lock it was not freeing the temporary memory storage used to keep newly constructed blob values in memory. Fixed by iterating over the remaining rows in the delayed insert rowset and freeing the blob storage for each row. No test suite because it involves concurrent delayed inserts on a table and cannot easily be made deterministic. Added a correct valgrind suppression for Fedora 9. mysql-test/valgrind.supp: Added a vagrind suppression for Fedora 9 sql/sql_insert.cc: Bug #38693: free the blobs temp storage on error. --- mysql-test/valgrind.supp | 8 ++++++++ sql/sql_insert.cc | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/mysql-test/valgrind.supp b/mysql-test/valgrind.supp index e71f4541cfd..d7ac6bc6c88 100644 --- a/mysql-test/valgrind.supp +++ b/mysql-test/valgrind.supp @@ -319,6 +319,14 @@ fun:_dl_map_object } +{ + libc pthread_exit 8 + Memcheck:Leak + fun:malloc + fun:local_strdup + fun:_dl_map_object + fun:dl_open_worker +} # diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 3f43c902faa..4eddcd17df1 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -2585,6 +2585,11 @@ bool Delayed_insert::handle_inserts(void) /* Remove all not used rows */ while ((row=rows.get())) { + if (table->s->blob_fields) + { + memcpy(table->record[0],row->record,table->s->reclength); + free_delayed_insert_blobs(table); + } delete row; thread_safe_increment(delayed_insert_errors,&LOCK_delayed_status); stacked_inserts--;