Details
-
Bug
-
Status: Closed (View Workflow)
-
Critical
-
Resolution: Fixed
-
10.0.4, 5.5.33a
-
None
Description
On INSTALL SONAME 'ha_tokudb.so' when TokuDB cannot be installed (for example, because transparent hugepages are enabled), MariaDB hangs.
The reason is the remove_status_vars() function that has incorrectly implemented binary search to remove plugin variables from the all-variables list. The code
for (; b-a > 0; c= (a+b)/2)
|
{
|
res= show_var_cmp(list, all+c);
|
if (res < 0)
|
b= c;
|
else if (res > 0)
|
a= c;
|
else
|
break;
|
}
|
in my test, a=129, b=130. So, c=129, in comparison I get res > 0, and the loop continues till infinity.
I came up with something like this:
— sql/sql_show.cc 2013-07-16 17:09:54 +0000
+++ sql/sql_show.cc 2013-11-05 21:59:41 +0000
@@ -2550,17 +2550,18 @@
for (; list->name; list++)
{
+ int res= 0, a= 0, b= all_status_vars.elements, c;
+ do { + c= (a+b)/2; res= show_var_cmp(list, all+c); if (res < 0) - b= c; + b= c - 1; else if (res > 0) - a= c; + a= c + 1; else break; - }
+ } while (b >= a && a < all_status_vars.elements);
if (res == 0)
all[c].type= SHOW_UNDEF;
}