fix tsearch, tfind, tdelete to handle null pointer input
authorSzabolcs Nagy <nsz@port70.net>
Sat, 5 Dec 2015 20:53:59 +0000 (21:53 +0100)
committerRich Felker <dalias@aerifal.cx>
Tue, 8 Dec 2015 23:53:18 +0000 (18:53 -0500)
POSIX specifies the behaviour for null rootp input, but it
was not implemented correctly.

src/search/tsearch_avl.c

index e4fb1316dad5e58120719fd3d23115d311f86bba..57194c843dcaa99952f3cecef8dc472e16dc9c3d 100644 (file)
@@ -151,6 +151,8 @@ static struct node *remove(struct node **n, const void *k,
 void *tdelete(const void *restrict key, void **restrict rootp,
        int(*compar)(const void *, const void *))
 {
+       if (!rootp)
+               return 0;
        struct node *n = *rootp;
        struct node *ret;
        /* last argument is arbitrary non-null pointer
@@ -163,6 +165,8 @@ void *tdelete(const void *restrict key, void **restrict rootp,
 void *tfind(const void *key, void *const *rootp,
        int(*compar)(const void *, const void *))
 {
+       if (!rootp)
+               return 0;
        return find(*rootp, key, compar);
 }
 
@@ -171,6 +175,8 @@ void *tsearch(const void *key, void **rootp,
 {
        struct node *update;
        struct node *ret;
+       if (!rootp)
+               return 0;
        update = insert(*rootp, key, compar, &ret);
        if (update)
                *rootp = update;