From aa0b1d424b2e6787231398f43c68c0a73f267939 Mon Sep 17 00:00:00 2001 From: Thomas Helvey Date: Sat, 11 Jan 2003 11:24:22 +0000 Subject: [PATCH] fix coredump in feature lookup code git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@910 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- ChangeLog | 7 +++++++ ircd/client.c | 4 ++-- ircd/ircd_features.c | 3 +++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6a801dd..0876d1d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2003-01-11 Thomas Helvey + * ircd/client.c, ircd/ircd_feature.c: Bugfix, the feature + table data was in a different order than the feature data + structure, which resulted in a wild index being used in + feature_bool. The feature_bool function didn't check it's + index before indexing the features array resulting in + a core dump on /oper. 2003-01-10 Thomas Helvey * include/client.h, include/res.h, include/s_bsd.h, ircd/ircd.c, ircd/list.c ircd/m_connect.c, ircd/res_adns.c, diff --git a/ircd/client.c b/ircd/client.c index f960a1d..670da3a 100644 --- a/ircd/client.c +++ b/ircd/client.c @@ -104,6 +104,7 @@ void client_add_sendq(struct Connection* con, struct Connection** con_p) static struct { enum Priv priv; + enum Feature feat; enum { FEATFLAG_DISABLES_PRIV, @@ -112,7 +113,6 @@ static struct FEATFLAG_LOCAL_OPERS, FEATFLAG_ALL_OPERS } flag; - enum Feature feat; } feattab[] = { { PRIV_WHOX, FEAT_LAST_F, FEATFLAG_ALL_OPERS }, @@ -201,7 +201,7 @@ client_set_privs(struct Client *client, struct ConfItem *oper) { if (PrivHas(&oper->privs_dirty, feattab[i].priv)) continue; - if (feattab[i].feat != FEAT_LAST_F && !feature_bool(feattab[i].priv)) + if (feattab[i].feat != FEAT_LAST_F && !feature_bool(feattab[i].feat)) continue; switch (feattab[i].flag) { diff --git a/ircd/ircd_features.c b/ircd/ircd_features.c index ccbd9fe..47b6818 100644 --- a/ircd/ircd_features.c +++ b/ircd/ircd_features.c @@ -801,6 +801,9 @@ feature_int(enum Feature feat) int feature_bool(enum Feature feat) { + assert(feat <= FEAT_LAST_F); + if (FEAT_LAST_F < feat) + return 0; assert(features[feat].feat == feat); assert((features[feat].flags & FEAT_MASK) == FEAT_BOOL); -- 2.20.1