mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-11646 main.myisam, maria.maria, main.mix2_myisam, main.myisampack, main.mrr_icp_extra fail in buildbot with valgrind (Syscall param pwrite64(buf) points to uninitialised byte(s))
If the table has a varchar column and a forced fixed for format (as in varchar.inc), Field_varstring::store() will only store the actual number of bytes, not padded, in the record[0]. That is, on inserts a part of record[0] can be uninitialized. Fix: initialize record[0] when a TABLE is created, it doesn't matter what kind of garbage can be in this unused/invisible part of the record, as long as it's not some random memory contents (that can contain sensitive data).
This commit is contained in:
@ -970,11 +970,6 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
||||
be overwritten by fill_record() anyway (and fill_record() does not
|
||||
use default values in this case).
|
||||
*/
|
||||
#ifdef HAVE_valgrind
|
||||
if (table->file->ha_table_flags() && HA_RECORD_MUST_BE_CLEAN_ON_WRITE)
|
||||
restore_record(table,s->default_values); // Get empty record
|
||||
else
|
||||
#endif
|
||||
table->record[0][0]= share->default_values[0];
|
||||
|
||||
/* Fix undefined null_bits. */
|
||||
|
11
sql/table.cc
11
sql/table.cc
@ -4150,16 +4150,7 @@ void TABLE::init(THD *thd, TABLE_LIST *tl)
|
||||
|
||||
DBUG_ASSERT(key_read == 0);
|
||||
|
||||
/* mark the record[0] uninitialized */
|
||||
TRASH(record[0], s->reclength);
|
||||
|
||||
/*
|
||||
Initialize the null marker bits, to ensure that if we are doing a read
|
||||
of only selected columns (like in keyread), all null markers are
|
||||
initialized.
|
||||
*/
|
||||
memset(record[0], 255, s->null_bytes);
|
||||
memset(record[1], 255, s->null_bytes);
|
||||
restore_record(this, s->default_values);
|
||||
|
||||
/* Tables may be reused in a sub statement. */
|
||||
DBUG_ASSERT(!file->extra(HA_EXTRA_IS_ATTACHED_CHILDREN));
|
||||
|
Reference in New Issue
Block a user