Commit a4dc526f authored by Alexander Barkov's avatar Alexander Barkov

MDEV-5181 incorrect binary search in remove_status_vars()

The loop in the binary search in remove_status_vars() was
incorrectly implemented and could continue infinitely in some cases.
Rewrote the binary search code.
parent 11d14100
...@@ -2202,19 +2202,20 @@ void remove_status_vars(SHOW_VAR *list) ...@@ -2202,19 +2202,20 @@ void remove_status_vars(SHOW_VAR *list)
for (; list->name; list++) for (; list->name; list++)
{ {
int res= 0, a= 0, b= all_status_vars.elements, c= (a+b)/2; int first= 0, last= ((int) all_status_vars.elements) - 1;
for (; b-a > 0; c= (a+b)/2) for ( ; first <= last; )
{ {
res= show_var_cmp(list, all+c); int res, middle= (first + last) / 2;
if (res < 0) if ((res= show_var_cmp(list, all + middle)) < 0)
b= c; last= middle - 1;
else if (res > 0) else if (res > 0)
a= c; first= middle + 1;
else else
{
all[middle].type= SHOW_UNDEF;
break; break;
}
} }
if (res == 0)
all[c].type= SHOW_UNDEF;
} }
shrink_var_array(&all_status_vars); shrink_var_array(&all_status_vars);
pthread_mutex_unlock(&LOCK_status); pthread_mutex_unlock(&LOCK_status);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment