From a4dc526fc7b33891b6d79d36c5abc198c89a53c8 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Fri, 8 Nov 2013 22:19:24 +0400 Subject: 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. --- sql/sql_show.cc | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 6193085e110..18818ed5e11 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -2202,19 +2202,20 @@ void remove_status_vars(SHOW_VAR *list) for (; list->name; list++) { - int res= 0, a= 0, b= all_status_vars.elements, c= (a+b)/2; - for (; b-a > 0; c= (a+b)/2) + int first= 0, last= ((int) all_status_vars.elements) - 1; + for ( ; first <= last; ) { - res= show_var_cmp(list, all+c); - if (res < 0) - b= c; + int res, middle= (first + last) / 2; + if ((res= show_var_cmp(list, all + middle)) < 0) + last= middle - 1; else if (res > 0) - a= c; + first= middle + 1; else + { + all[middle].type= SHOW_UNDEF; break; + } } - if (res == 0) - all[c].type= SHOW_UNDEF; } shrink_var_array(&all_status_vars); pthread_mutex_unlock(&LOCK_status); -- cgit v1.2.1