Browse Source

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@
OPENBSD_5_1
guenther 12 years ago
parent
commit
b9eb8d7d32
1 changed files with 3 additions and 5 deletions
  1. +3
    -5
      src/lib/libc/stdlib/tsearch.c

+ 3
- 5
src/lib/libc/stdlib/tsearch.c View File

@ -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 * 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; node **rootp = (node **)vrootp;
char *key = (char *)vkey; char *key = (char *)vkey;
node *p;
node *p = (node *)1;
node *q; node *q;
node *r; node *r;
int cmp; 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); return ((struct node_t *)0);
while ((cmp = (*compar)(key, (*rootp)->key)) != 0) { while ((cmp = (*compar)(key, (*rootp)->key)) != 0) {
p = *rootp; p = *rootp;
@ -86,8 +86,6 @@ tdelete(const void *vkey, void **vrootp,
q->right = (*rootp)->right; q->right = (*rootp)->right;
} }
} }
if (p == *rootp)
p = q;
free((struct node_t *) *rootp); /* D4: Free node */ free((struct node_t *) *rootp); /* D4: Free node */
*rootp = q; /* link parent to new node */ *rootp = q; /* link parent to new node */
return(p); return(p);


Loading…
Cancel
Save