summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordsl <dsl@NetBSD.org>2006-03-30 20:32:10 +0000
committerdsl <dsl@NetBSD.org>2006-03-30 20:32:10 +0000
commit3db763ccc3bbc058e909d2c8d3dca7e105717724 (patch)
treedc439d6b19daa610831d8fef39d38bd757dd0826
parente4573e12e3538a2d73cf9932221e567dda9ba7c4 (diff)
MCDelSet() contains an infinite loop!
I suspect it has never, ever, ever been asked to delete anything that exists. Also neither it, nor MCDelMsg() below free() the set and msg structures. Found by Coverty SID:54
-rw-r--r--usr.bin/gencat/gencat.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/usr.bin/gencat/gencat.c b/usr.bin/gencat/gencat.c
index 9504fcfaf71..89cb1261f14 100644
--- a/usr.bin/gencat/gencat.c
+++ b/usr.bin/gencat/gencat.c
@@ -1,4 +1,4 @@
-/* $NetBSD: gencat.c,v 1.19 2004/01/05 23:23:34 jmmv Exp $ */
+/* $NetBSD: gencat.c,v 1.20 2006/03/30 20:32:10 dsl Exp $ */
/*
* Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: gencat.c,v 1.19 2004/01/05 23:23:34 jmmv Exp $");
+__RCSID("$NetBSD: gencat.c,v 1.20 2006/03/30 20:32:10 dsl Exp $");
#endif
/***********************************************************
@@ -799,14 +799,13 @@ MCDelSet(setId)
for (; set != NULL && set->setId < setId; set = set->entries.le_next);
if (set && set->setId == setId) {
-
- msg = set->msghead.lh_first;
- while (msg) {
- free(msg->str);
+ LIST_REMOVE(set, entries);
+ while ((msg = set->msghead.lh_first) != NULL) {
LIST_REMOVE(msg, entries);
+ free(msg->str);
+ free(msg);
}
-
- LIST_REMOVE(set, entries);
+ free(set);
return;
}
warning(NULL, "specified set doesn't exist");
@@ -825,8 +824,9 @@ MCDelMsg(msgId)
for (; msg != NULL && msg->msgId < msgId; msg = msg->entries.le_next);
if (msg && msg->msgId == msgId) {
- free(msg->str);
LIST_REMOVE(msg, entries);
+ free(msg->str);
+ free(msg);
return;
}
warning(NULL, "specified msg doesn't exist");