diff options
author | Varun Gupta <varun.gupta@mariadb.com> | 2020-10-23 12:32:49 +0530 |
---|---|---|
committer | Varun Gupta <varun.gupta@mariadb.com> | 2020-10-23 22:36:47 +0530 |
commit | b94e8e4b25e039b5f165339b8ee0fd4af856459c (patch) | |
tree | 95f0e9b6fe4603d9df2b198b2895d245fa4d284d /sql | |
parent | 5a9df1550f256b7be7aaffbf4cbce13d0ca22566 (diff) | |
download | mariadb-git-b94e8e4b25e039b5f165339b8ee0fd4af856459c.tar.gz |
MDEV-23867: insert... select crash in compute_window_func
There are 2 issues here:
Issue #1: memory allocation.
An IO_CACHE that uses encryption uses a larger buffer (it needs space for the encrypted data,
decrypted data, IO_CACHE_CRYPT struct to describe encryption parameters etc).
Issue #2: IO_CACHE::seek_not_done
When IO_CACHE objects are cloned, they still share the file descriptor.
This means, operation on one IO_CACHE may change the file read position
which will confuse other IO_CACHEs using it.
The fix of these issues would be:
Allocate the buffer to also include the extra size needed for encryption.
Perform seek again after one IO_CACHE reads the file.
Diffstat (limited to 'sql')
-rw-r--r-- | sql/mf_iocache_encr.cc | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/sql/mf_iocache_encr.cc b/sql/mf_iocache_encr.cc index d741cf8b837..29d7074aeb1 100644 --- a/sql/mf_iocache_encr.cc +++ b/sql/mf_iocache_encr.cc @@ -71,6 +71,16 @@ static int my_b_encr_read(IO_CACHE *info, uchar *Buffer, size_t Count) DBUG_RETURN(1); } info->seek_not_done= 0; + if (info->next_file_user) + { + IO_CACHE *c; + for (c= info->next_file_user; + c!= info; + c= c->next_file_user) + { + c->seek_not_done= 1; + } + } } do |