1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-07 00:04:31 +03:00

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.
This commit is contained in:
Alexander Barkov
2013-11-08 22:19:24 +04:00
parent 11d141004a
commit a4dc526fc7

View File

@@ -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);