Committer : entrope
CVSROOT : /cvsroot/undernet-ircu
Module : ircu2.10
Commit time: 2004-10-13 15:03:05 UTC
Modified files:
ChangeLog ircd/ircd_parser.y
Log message:
Clear information leaks from one conf block to another.
---------------------- diff included ----------------------
Index: ircu2.10/ChangeLog
diff -u ircu2.10/ChangeLog:1.487 ircu2.10/ChangeLog:1.488
--- ircu2.10/ChangeLog:1.487 Wed Oct 13 05:29:31 2004
+++ ircu2.10/ChangeLog Wed Oct 13 08:02:54 2004
@@ -1,3 +1,8 @@
+2004-10-13 Michael Poole <[EMAIL PROTECTED]>
+
+ * ircd/ircd_parser.y: Consistently zero out global variables after
+ they are used (prevents double frees and other problems).
+
2004-10-12 Michael Poole <[EMAIL PROTECTED]>
* include/client.h: Rename FLAGSET_ISSET, _SET, _CLEAR to FlagHas,
Index: ircu2.10/ircd/ircd_parser.y
diff -u ircu2.10/ircd/ircd_parser.y:1.28 ircu2.10/ircd/ircd_parser.y:1.29
--- ircu2.10/ircd/ircd_parser.y:1.28 Wed Oct 13 05:29:33 2004
+++ ircu2.10/ircd/ircd_parser.y Wed Oct 13 08:02:54 2004
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
- * $Id: ircd_parser.y,v 1.28 2004/10/13 12:29:33 entrope Exp $
+ * $Id: ircd_parser.y,v 1.29 2004/10/13 15:02:54 entrope Exp $
*/
%{
@@ -328,14 +328,7 @@
};
classblock: CLASS {
- name = NULL;
tping = 90;
- tconn = 0;
- maxlinks = 0;
- sendq = 0;
- pass = NULL;
- memset(&privs, 0, sizeof(privs));
- memset(&privs_dirty, 0, sizeof(privs_dirty));
} '{' classitems '}'
{
if (name != NULL)
@@ -350,7 +343,13 @@
else {
parse_error("Missing name in class block");
}
+ name = NULL;
pass = NULL;
+ tconn = 0;
+ maxlinks = 0;
+ sendq = 0;
+ memset(&privs, 0, sizeof(privs));
+ memset(&privs_dirty, 0, sizeof(privs_dirty));
} ';';
classitems: classitem classitems | classitem;
classitem: classname | classpingfreq | classconnfreq | classmaxlinks |
@@ -378,16 +377,12 @@
};
classusermode: USERMODE '=' QSTRING ';'
{
- if (pass)
- MyFree(pass);
+ MyFree(pass);
DupString(pass, $3);
};
connectblock: CONNECT
{
- name = pass = host = origin = hub_limit = NULL;
- c_class = NULL;
- port = 0;
maxlinks = 65535;
} '{' connectitems '}'
{
@@ -414,6 +409,9 @@
MyFree(hub_limit);
parse_error("Bad connect block");
}
+ name = pass = host = origin = hub_limit = NULL;
+ c_class = NULL;
+ port = 0;
}';';
connectitems: connectitem connectitems | connectitem;
connectitem: connectname | connectpass | connectclass | connecthost
@@ -478,6 +476,7 @@
MyFree(name);
parse_error("Bad UWorld block");
}
+ name = NULL;
};
uworlditems: uworlditem uworlditems | uworlditem;
uworlditem: uworldname | error;
@@ -487,13 +486,7 @@
DupString(name, $3);
};
-operblock: OPER
-{
- name = pass = host = NULL;
- c_class = NULL;
- memset(&privs, 0, sizeof(privs));
- memset(&privs_dirty, 0, sizeof(privs_dirty));
-} '{' operitems '}' ';'
+operblock: OPER '{' operitems '}' ';'
{
if (name && pass && host && c_class)
{
@@ -515,6 +508,10 @@
MyFree(pass);
MyFree(host);
}
+ name = pass = host = NULL;
+ c_class = NULL;
+ memset(&privs, 0, sizeof(privs));
+ memset(&privs_dirty, 0, sizeof(privs_dirty));
};
operitems: operitem | operitems operitem;
operitem: opername | operpass | operhost | operclass | priv | error;
@@ -590,15 +587,7 @@
yesorno: YES { $$ = 1; } | NO { $$ = 0; };
/* The port block... */
-portblock: PORT {
- port = 0;
- host = NULL;
- /* Hijack these for is_server, is_hidden to cut down on globals... */
- tconn = 0;
- tping = 0;
- /* and this for mask... */
- pass = NULL;
-} '{' portitems '}' ';'
+portblock: PORT '{' portitems '}' ';'
{
if (port > 0 && port <= 0xFFFF)
{
@@ -611,6 +600,7 @@
MyFree(host);
MyFree(pass);
host = pass = NULL;
+ port = tconn = tping = 0;
};
portitems: portitem portitems | portitem;
portitem: portnumber | portvhost | portmask | portserver | porthidden | error;
@@ -649,8 +639,6 @@
clientblock: CLIENT
{
- host = name = NULL;
- c_class = NULL;
maxlinks = 65535;
}
'{' clientitems '}' ';'
@@ -669,6 +657,8 @@
MyFree(name);
parse_error("Bad client block");
}
+ host = name = NULL;
+ c_class = NULL;
};
clientitems: clientitem clientitems | clientitem;
clientitem: clienthost | clientclass | clientpass | clientip
@@ -699,8 +689,7 @@
killblock: KILL
{
- dconf = (struct DenyConf*) MyMalloc(sizeof(*dconf));
- memset(dconf, 0, sizeof(*dconf));
+ dconf = (struct DenyConf*) MyCalloc(1, sizeof(*dconf));
} '{' killitems '}'
{
if (dconf->hostmask != NULL)
@@ -709,16 +698,15 @@
DupString(dconf->usermask, "*");
dconf->next = denyConfList;
denyConfList = dconf;
- dconf = NULL;
}
else
{
MyFree(dconf->hostmask);
MyFree(dconf->message);
MyFree(dconf);
- dconf = NULL;
parse_error("Bad kill block");
}
+ dconf = NULL;
} ';';
killitems: killitem killitems | killitem;
killitem: killuhost | killreal | killreasonfile | killreason | error;
@@ -768,9 +756,8 @@
cruleblock: CRULE
{
- host = pass = NULL;
tconn = CRULE_AUTO;
-} '{' cruleitems '}'
+} '{' cruleitems '}' ';'
{
struct CRuleNode *node;
if (host != NULL && pass != NULL && (node=crule_parse(pass)) != NULL)
@@ -789,7 +776,8 @@
MyFree(pass);
parse_error("Bad CRule block");
}
-} ';';
+ host = pass = NULL;
+};
cruleitems: cruleitem cruleitems | cruleitem;
cruleitem: cruleserver | crulerule | cruleall | error;
@@ -815,16 +803,14 @@
tconn = CRULE_AUTO;
};
-motdblock: MOTD {
- pass = host = NULL;
-} '{' motditems '}'
+motdblock: MOTD '{' motditems '}' ';'
{
if (host != NULL && pass != NULL)
motd_add(host, pass);
MyFree(host);
MyFree(pass);
host = pass = NULL;
-} ';';
+};
motditems: motditem motditems | motditem;
motditem: motdhost | motdfile | error;
@@ -865,16 +851,7 @@
quarantineblock: QUARANTINE '{'
{
- if (qconf != NULL)
- qconf = (struct qline*) MyMalloc(sizeof(*qconf));
- else
- {
- if (qconf->chname != NULL)
- MyFree(qconf->chname);
- if (qconf->reason != NULL)
- MyFree(qconf->reason);
- }
- memset(qconf, 0, sizeof(*qconf));
+ qconf = (struct qline*) MyCalloc(1, sizeof(*qconf));
} quarantineitems '}' ';'
{
if (qconf->chname == NULL || qconf->reason == NULL)
@@ -955,8 +932,6 @@
iauthblock: IAUTH '{'
{
- pass = host = NULL;
- port = 0;
tconn = 60;
tping = 60;
} iauthitems '}' ';'
@@ -969,6 +944,7 @@
MyFree(pass);
MyFree(host);
pass = host = NULL;
+ port = 0;
};
iauthitems: iauthitem iauthitems | iauthitem;
----------------------- End of diff -----------------------