summaryrefslogtreecommitdiff
path: root/tables
diff options
context:
space:
mode:
authorYann Ylavic <ylavic@apache.org>2014-07-16 18:21:33 +0000
committerYann Ylavic <ylavic@apache.org>2014-07-16 18:21:33 +0000
commit77dbfec39b6e1d7a89faa63cd34df29c08949a6d (patch)
tree9ed4cba6e829441a778891eb48c76cbe3f7420e8 /tables
parent3f0154e42ccd2fa81bec7e8b5449519a23eee2b4 (diff)
downloadapr-77dbfec39b6e1d7a89faa63cd34df29c08949a6d.tar.gz
Let apr_skiplist_find_compare() handle given NULL iterator, and be safe
from NULL returns. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1611125 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'tables')
-rw-r--r--tables/apr_skiplist.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/tables/apr_skiplist.c b/tables/apr_skiplist.c
index 25d20e309..c671cd833 100644
--- a/tables/apr_skiplist.c
+++ b/tables/apr_skiplist.c
@@ -154,6 +154,9 @@ static apr_status_t skiplisti_init(apr_skiplist **s, apr_pool_t *p)
}
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_skiplist_getlist(apr_skiplist *sl)
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_skiplist *sl, void *data,
*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_compare(apr_skiplist *sli, void *data,
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_compare(apr_skiplist *sli,
}
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);