summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Francois Brousseau <jfb@cvs.openbsd.org>2005-01-14 16:39:22 +0000
committerJean-Francois Brousseau <jfb@cvs.openbsd.org>2005-01-14 16:39:22 +0000
commit79f835d30a8a64ebb3144136f34457e0b1aee8d0 (patch)
tree3bcc7232cfad23e446717ab9d1d9d52832bef34d
parentc701ddbb28f0bb41673c135f6cfe5280e7f341a3 (diff)
when removing the last entry from the tail queue, reinitialize the
queue for sanity, and make sure that the current pointer is set to the next item if it points to the item being removed. fixes a crash reported by brad@, tested by joris and brad@
-rw-r--r--usr.bin/cvs/entries.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/usr.bin/cvs/entries.c b/usr.bin/cvs/entries.c
index 82315e71610..167ddaf6ff4 100644
--- a/usr.bin/cvs/entries.c
+++ b/usr.bin/cvs/entries.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: entries.c,v 1.21 2004/12/14 21:23:44 jfb Exp $ */
+/* $OpenBSD: entries.c,v 1.22 2005/01/14 16:39:21 jfb Exp $ */
/*
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org>
* All rights reserved.
@@ -246,9 +246,19 @@ cvs_ent_remove(CVSENTRIES *ef, const char *name)
if (ent == NULL)
return (-1);
+ if (ef->cef_cur == ent) {
+ /* if this element was the last one retrieved through a
+ * call to cvs_ent_next(), point to the next element to avoid
+ * keeping an invalid reference.
+ */
+ ef->cef_cur = TAILQ_NEXT(ef->cef_cur, ce_list);
+ }
TAILQ_REMOVE(&(ef->cef_ent), ent, ce_list);
cvs_ent_free(ent);
+ if (TAILQ_EMPTY(&(ef->cef_ent))) /* reset */
+ TAILQ_INIT(&(ef->cef_ent));
+
ef->cef_flags &= ~CVS_ENTF_SYNC;
return (0);