Skip to content

Commit 6608f84

Browse files
author
Nisha Gopalakrishnan
committed
BUG#22594514: HANDLE_FATAL_SIGNAL (SIG=11) IN
UNIQUE::~UNIQUE | SQL/UNIQUES.CC:355 Analysis ======== Enabling the sort_buffer_size with a large value can cause operations utilizing the sort buffer like DELETE as mentioned in the bug report to fail. 5.5 and 5.6 versions reports OOM error while in 5.7+, the server crashes. While initializing the mem_root for the sort buffer tree, the block size for the mem_root is determined from the 'sort_buffer_size' value. This unsigned long value is typecasted to unsigned int, hence it becomes zero. Further block_size computation while initializing the mem_root results in a very large block_size value. Hence while trying to allocate a block during the DELETE operation, an OOM error is reported. In case of 5.7+, the PFS instrumentation for memory allocation, overshoots the unsigned value and allocates a block of just one byte. While trying to free the block of the mem_root, the original block_size is used. This triggers the crash since the server tries to free unallocated memory. Fix: ==== In order to restrict usage of such unreasonable sort_buffer_size, the typecast of block size to 'unsigned int' is removed and hence reports OOM error across all versions for sizes exceeding unsigned int range.
1 parent 5102a7f commit 6608f84

2 files changed

Lines changed: 5 additions & 5 deletions

File tree

include/my_tree.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
1+
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
22
33
This program is free software; you can redistribute it and/or modify
44
it under the terms of the GNU General Public License as published by
@@ -62,7 +62,7 @@ typedef struct st_tree {
6262
} TREE;
6363

6464
/* Functions on whole tree */
65-
void init_tree(TREE *tree, ulong default_alloc_size, ulong memory_limit,
65+
void init_tree(TREE *tree, size_t default_alloc_size, ulong memory_limit,
6666
int size, qsort_cmp2 compare, my_bool with_delete,
6767
tree_element_free free_element, void *custom_arg);
6868
void delete_tree(TREE*);

mysys/tree.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
1+
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
22
33
This program is free software; you can redistribute it and/or modify
44
it under the terms of the GNU General Public License as published by
@@ -83,7 +83,7 @@ static void rb_delete_fixup(TREE *tree,TREE_ELEMENT ***parent);
8383
static int test_rb_tree(TREE_ELEMENT *element);
8484
#endif
8585

86-
void init_tree(TREE *tree, ulong default_alloc_size, ulong memory_limit,
86+
void init_tree(TREE *tree, size_t default_alloc_size, ulong memory_limit,
8787
int size, qsort_cmp2 compare, my_bool with_delete,
8888
tree_element_free free_element, void *custom_arg)
8989
{
@@ -127,7 +127,7 @@ void init_tree(TREE *tree, ulong default_alloc_size, ulong memory_limit,
127127
}
128128
if (!(tree->with_delete=with_delete))
129129
{
130-
init_alloc_root(&tree->mem_root, (uint) default_alloc_size, 0);
130+
init_alloc_root(&tree->mem_root, default_alloc_size, 0);
131131
tree->mem_root.min_malloc=(sizeof(TREE_ELEMENT)+tree->size_of_element);
132132
}
133133
DBUG_VOID_RETURN;

0 commit comments

Comments
 (0)