summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Guenthe <guenther@cvs.openbsd.org>2012-02-06 20:29:55 +0000
committerPhilip Guenthe <guenther@cvs.openbsd.org>2012-02-06 20:29:55 +0000
commitbffd0af60eb5758b54d725458e29d012003f6f4b (patch)
treec1bcf286eba26b10ccd9707a486cc91e43b85c78
parent6f069af328ca4e5e4f1cec6edef630912fb8dde6 (diff)
Revert previous diff as it resulted in the wrong return code when
the last node is deleted. Instead, resolve the Coverity warning by returning (node *)1 when you delete the root node. based an idea from millert@. ok otto@
-rw-r--r--lib/libc/stdlib/tsearch.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/lib/libc/stdlib/tsearch.c b/lib/libc/stdlib/tsearch.c
index 667c57731bb..2f5e369f6ad 100644
--- a/lib/libc/stdlib/tsearch.c
+++ b/lib/libc/stdlib/tsearch.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tsearch.c,v 1.6 2006/04/04 11:21:50 moritz Exp $ */
+/* $OpenBSD: tsearch.c,v 1.7 2012/02/06 20:29:54 guenther Exp $ */
/*
* Tree search generalized from Knuth (6.2.2) Algorithm T just like
@@ -56,12 +56,12 @@ tdelete(const void *vkey, void **vrootp,
{
node **rootp = (node **)vrootp;
char *key = (char *)vkey;
- node *p;
+ node *p = (node *)1;
node *q;
node *r;
int cmp;
- if (rootp == (struct node_t **)0 || (p = *rootp) == (struct node_t *)0)
+ if (rootp == (struct node_t **)0 || *rootp == (struct node_t *)0)
return ((struct node_t *)0);
while ((cmp = (*compar)(key, (*rootp)->key)) != 0) {
p = *rootp;
@@ -86,8 +86,6 @@ tdelete(const void *vkey, void **vrootp,
q->right = (*rootp)->right;
}
}
- if (p == *rootp)
- p = q;
free((struct node_t *) *rootp); /* D4: Free node */
*rootp = q; /* link parent to new node */
return(p);