diff options
author | Alexander Barkov <bar@mariadb.com> | 2021-10-09 22:27:31 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2021-10-11 18:03:42 +0400 |
commit | 8f04ec288528fd53efd98e2139e5d22ba229d20b (patch) | |
tree | 9ea889eb32052021c167e6f574c6a1b835089f0f /sql/sql_insert.cc | |
parent | eadd87880887e6ca73e6f292c9d856df7e56c3c0 (diff) | |
download | mariadb-git-bb-10.2-bar-MDEV-25925.tar.gz |
MDEV-25925 Warning: Memory not freed: 32 on INSERT DELAYEDbb-10.2-bar-MDEV-25925
Also fixes MDEV-24467 Memory not freed after failed INSERT DELAYED
Description:
In case of an error (e.g. data truncation) during mysql_insert()
handling an INSERT DELAYED, the data type specific data in
fields (e.g. Field_blob::value) is not taken over by the delayed
writer thread.
All fields in table_list->table are freed by free_root()
immediately after mysql_insert(). To avoid a memory leak,
we need to free the specific data before exiting mysql_insert()
on error.
Diffstat (limited to 'sql/sql_insert.cc')
-rw-r--r-- | sql/sql_insert.cc | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 51b2c84cfea..718682f767e 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1257,7 +1257,18 @@ values_loop_end: abort: #ifndef EMBEDDED_LIBRARY if (lock_type == TL_WRITE_DELAYED) + { end_delayed_insert(thd); + /* + In case of an error (e.g. data truncation), the data type specific data + in fields (e.g. Field_blob::value) was not taken over + by the delayed writer thread. All fields in table_list->table + will be freed by free_root() soon. We need to free the specific + data before free_root() to avoid a memory leak. + */ + for (Field **ptr= table_list->table->field ; *ptr ; ptr++) + (*ptr)->free(); + } #endif if (table != NULL) table->file->ha_release_auto_increment(); |