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 | 6ce7d81e7a780c967d62e69e2607a30c2501be42 (patch) | |
tree | 3a272d304a40e4f35352c9eff016ee04b0d5cc08 /sql/field.cc | |
parent | 04cb9980e5a915fe1109334ddbe6c08463ca51d3 (diff) | |
download | mariadb-git-clone-5.5.24-build.tar.gz |
Bug#13871079 RQG_MYISAM_DML_ALTER_VALGRIND FAILS ON VALGRIND PN PB2mysql-5.5.24clone-5.5.24-build
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()
sql/field.cc:
In Field_set::val_str
return empty string (of appropriate character set) for an empty set.
sql/field.h:
New private member in Field_enum: empty_set_string.
sql/field_conv.cc:
In do_field_string, use an auto variable for copying
from_field => tmp => to_field
rather than copy->tmp.
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) |