diff options
author | Sreeharsha Ramanavarapu <sreeharsha.ramanavarapu@oracle.com> | 2015-03-11 11:18:52 +0530 |
---|---|---|
committer | Sreeharsha Ramanavarapu <sreeharsha.ramanavarapu@oracle.com> | 2015-03-11 11:18:52 +0530 |
commit | 54d23eceb704af2e56ee5d8d2bbfe1beba462ce9 (patch) | |
tree | d57d94d33fdac66e1153f2ca5fd226ff5cf8eacd /storage/myisam | |
parent | 98b18c5971c78ecb18ad90e7d1a71d7108ce4074 (diff) | |
download | mariadb-git-54d23eceb704af2e56ee5d8d2bbfe1beba462ce9.tar.gz |
Bug #19573096: LOADING CORRUPTED GEOMETRY DATA INTO A
MYISAM TABLE CAUSES THE SERVER TO CRASH
Issue:
-----
During index maintanence, R-tree node might need a split.
In some cases the square of mbr could be calculated to
infinite (as in this case) or to NaN. This is currently
not handled. This is specific to MyISAM.
SOLUTION:
---------
If the calculated value in "mbr_join_square" is infinite or
NaN, set it to max double value.
Initialization of output parameters of "pick_seeds" is
required if calculation is infinite (or negative infinite).
Similar to the fix made for INNODB as part of Bug#19533996.
Diffstat (limited to 'storage/myisam')
-rw-r--r-- | storage/myisam/rt_split.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/storage/myisam/rt_split.c b/storage/myisam/rt_split.c index 48f9b82a0b5..d37084f79b8 100644 --- a/storage/myisam/rt_split.c +++ b/storage/myisam/rt_split.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -68,6 +68,10 @@ static double mbr_join_square(const double *a, const double *b, int n_dim) b += 2; }while (a != end); + /* Check for infinity or NaN */ + if (my_isinf(square) || isnan(square)) + square = DBL_MAX; + return square; } @@ -102,6 +106,9 @@ static void pick_seeds(SplitStruct *node, int n_entries, double max_d = -DBL_MAX; double d; + *seed_a = node; + *seed_b = node + 1; + for (cur1 = node; cur1 < lim1; ++cur1) { for (cur2=cur1 + 1; cur2 < lim2; ++cur2) |