summaryrefslogtreecommitdiff
path: root/sql/field.cc
diff options
context:
space:
mode:
authorTor Didriksen <tor.didriksen@oracle.com>2012-04-12 15:04:22 +0200
committerTor Didriksen <tor.didriksen@oracle.com>2012-04-12 15:04:22 +0200
commit582b7283472a43af5d7fb51386df055ea9d44a96 (patch)
tree3a272d304a40e4f35352c9eff016ee04b0d5cc08 /sql/field.cc
parentd59986d97418d588ed193d01284a21676d208f1a (diff)
downloadmariadb-git-582b7283472a43af5d7fb51386df055ea9d44a96.tar.gz
Bug#13871079 RQG_MYISAM_DML_ALTER_VALGRIND FAILS ON VALGRIND PN PB2
The class Copy_field contains a String tmp, which may allocate memory on the heap. That means that all instances of Copy_field must be properly destroyed. Alas they are not. Solution: don't use Copy_field::tmp for copying from_field => tmp => to_field in do_field_string()
Diffstat (limited to 'sql/field.cc')
-rw-r--r--sql/field.cc14
1 files changed, 13 insertions, 1 deletions
diff --git a/sql/field.cc b/sql/field.cc
index 59eb83da5fa..c7f19976260 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -8257,7 +8257,19 @@ String *Field_set::val_str(String *val_buffer,
ulonglong tmp=(ulonglong) Field_enum::val_int();
uint bitnr=0;
- val_buffer->set("", 0, field_charset);
+ if (tmp == 0)
+ {
+ /*
+ Some callers expect *val_buffer to contain the result,
+ so we assign to it, rather than doing 'return &empty_set_string.
+ */
+ *val_buffer= empty_set_string;
+ return val_buffer;
+ }
+
+ val_buffer->set_charset(field_charset);
+ val_buffer->length(0);
+
while (tmp && bitnr < (uint) typelib->count)
{
if (tmp & 1)