You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by yl...@apache.org on 2014/07/16 20:21:33 UTC
svn commit: r1611125 - /apr/apr/trunk/tables/apr_skiplist.c
Author: ylavic
Date: Wed Jul 16 18:21:33 2014
New Revision: 1611125
URL: http://svn.apache.org/r1611125
Log:
Let apr_skiplist_find_compare() handle given NULL iterator, and be safe
from NULL returns.
Modified:
apr/apr/trunk/tables/apr_skiplist.c
Modified: apr/apr/trunk/tables/apr_skiplist.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/tables/apr_skiplist.c?rev=1611125&r1=1611124&r2=1611125&view=diff
==============================================================================
--- apr/apr/trunk/tables/apr_skiplist.c (original)
+++ apr/apr/trunk/tables/apr_skiplist.c Wed Jul 16 18:21:33 2014
@@ -154,6 +154,9 @@ static apr_status_t skiplisti_init(apr_s
}
else {
sl = calloc(1, sizeof(apr_skiplist));
+ if (!sl) {
+ return APR_ENOMEM;
+ }
}
#if 0
sl->compare = (apr_skiplist_compare) NULL;
@@ -254,26 +257,18 @@ APR_DECLARE(apr_skiplistnode *) apr_skip
APR_DECLARE(void *) apr_skiplist_find(apr_skiplist *sl, void *data, apr_skiplistnode **iter)
{
- void *ret;
- apr_skiplistnode *aiter;
if (!sl->compare) {
return NULL;
}
- if (iter) {
- ret = apr_skiplist_find_compare(sl, data, iter, sl->compare);
- }
- else {
- ret = apr_skiplist_find_compare(sl, data, &aiter, sl->compare);
- }
- return ret;
+ return apr_skiplist_find_compare(sl, data, iter, sl->compare);
}
static int skiplisti_find_compare(apr_skiplist *sl, void *data,
apr_skiplistnode **ret,
apr_skiplist_compare comp)
{
- apr_skiplistnode *m = NULL;
int count = 0;
+ apr_skiplistnode *m;
m = sl->top;
while (m) {
int compared;
@@ -286,7 +281,7 @@ static int skiplisti_find_compare(apr_sk
*ret = m;
return count;
}
- if ((m->next == NULL) || (compared < 0)) {
+ if (compared < 0) {
m = m->down;
count++;
}
@@ -303,17 +298,26 @@ APR_DECLARE(void *) apr_skiplist_find_co
apr_skiplistnode **iter,
apr_skiplist_compare comp)
{
- apr_skiplistnode *m = NULL;
+ apr_skiplistnode *m;
apr_skiplist *sl;
if (comp == sli->compare || !sli->index) {
sl = sli;
}
else {
apr_skiplist_find(sli->index, (void *)comp, &m);
+ if (!m) {
+ if (iter) {
+ *iter = NULL;
+ }
+ return NULL;
+ }
sl = (apr_skiplist *) m->data;
}
- skiplisti_find_compare(sl, data, iter, sl->comparek);
- return (iter && *iter) ? ((*iter)->data) : NULL;
+ skiplisti_find_compare(sl, data, &m, sl->comparek);
+ if (iter) {
+ *iter = m;
+ }
+ return (m) ? m->data : NULL;
}
@@ -558,6 +562,9 @@ APR_DECLARE(int) apr_skiplist_remove_com
}
else {
apr_skiplist_find(sli->index, (void *)comp, &m);
+ if (!m) {
+ return 0;
+ }
sl = (apr_skiplist *) m->data;
}
skiplisti_find_compare(sl, data, &m, comp);