Hi,

yep, you are right. But I think it's better to implement our own qsort
instead of moving list elements. List might be very large...

[EMAIL PROTECTED] wrote:

> Hello,
> 
> Nobody uses gwlist_sort() but insect found. So I will describe it and
> propose fix for benefit of future generations.
> 
> Forementioned function uses qsort(3) like this:
> 
>>    qsort(&GET(list, 0), list->len, sizeof(void*), cmp);
> 
> And remember this code:
> 
>> #define INDEX(list, i)  (((list)->start + i) % (list)->tab_size)
>> #define GET(list, i)    ((list)->tab[INDEX(list, i)])
> 
> If tab array is wrapped this produces misbehavior. For example if we have
> tab_size = 7, len = 7, start = 1 qsort() will try to sort 7 elements
> starting from second, which mean it will try to pass into compare function
> bogus element past end of tab array, resulting crash or precious software.
> 
> This probably should fix the problem:
> 
>     // if array is wrapped we need to merge parts into a single chunk
>     if ((list->start + list->len) > list->tab_size) {
>         if (list->len != list->tab_size)
>             memmove(list->tab + INDEX(list, list->len),
>                     list->tab + list->start,
>                     (list->len - INDEX(list, list->len)) * sizeof(void
>                     *));
>         list->start = 0;
>     }
> 
>     qsort(&GET(list, 0), list->len, sizeof(void*), cmp);
> 
> 
> Best regards.

-- 
Thanks,
Alex


Reply via email to