diff options
author | Tor Didriksen <tor.didriksen@oracle.com> | 2012-04-12 15:04:22 +0200 |
---|---|---|
committer | Tor Didriksen <tor.didriksen@oracle.com> | 2012-04-12 15:04:22 +0200 |
commit | 582b7283472a43af5d7fb51386df055ea9d44a96 (patch) | |
tree | 3a272d304a40e4f35352c9eff016ee04b0d5cc08 /sql/field.cc | |
parent | d59986d97418d588ed193d01284a21676d208f1a (diff) | |
download | mariadb-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.cc | 14 |
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) |