From b94e8e4b25e039b5f165339b8ee0fd4af856459c Mon Sep 17 00:00:00 2001 From: Varun Gupta Date: Fri, 23 Oct 2020 12:32:49 +0530 Subject: 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. --- include/my_sys.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'include/my_sys.h') diff --git a/include/my_sys.h b/include/my_sys.h index fe66aeef48c..08b06951d0d 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -476,18 +476,19 @@ typedef struct st_io_cache /* Used when cacheing files */ partial. */ int seek_not_done,error; - /* buffer_length is memory size allocated for buffer or write_buffer */ + /* length of the buffer used for storing un-encrypted data */ size_t buffer_length; /* read_length is the same as buffer_length except when we use async io */ size_t read_length; myf myflags; /* Flags used to my_read/my_write */ /* - alloced_buffer is 1 if the buffer was allocated by init_io_cache() and - 0 if it was supplied by the user. + alloced_buffer is set to the size of the buffer allocated for the IO_CACHE. + Includes the overhead(storing key to ecnrypt and decrypt) for encryption. + Set to 0 if nothing is allocated. Currently READ_NET is the only one that will use a buffer allocated somewhere else */ - my_bool alloced_buffer; + size_t alloced_buffer; #ifdef HAVE_AIOWAIT /* As inidicated by ifdef, this is for async I/O, which is not currently -- cgit v1.2.1