]> jfr.im git - irc/quakenet/newserv.git/commitdiff
Stopped parser from writing to sstrings
authorsplidge <redacted>
Fri, 4 Apr 2008 18:26:13 +0000 (19:26 +0100)
committersplidge <redacted>
Fri, 4 Apr 2008 18:26:13 +0000 (19:26 +0100)
parser/parser.c

index 476d6a87574bd1ce4d8258dbe92217303230ee51..d4b062b323ad6404e29e7383bcc7a29b7beecc75 100644 (file)
@@ -73,6 +73,32 @@ int countcommandtree(CommandTree *ct) {
   return sum;
 }
 
+/* sanitisecommandname:
+ *
+ * Converts the given command name to uppercase and checks for bad chars.
+ * 
+ * Returns 1 if bad chars were found
+ */
+static int sanitisecommandname(char *cmdname, char *cmdbuf) {
+  int len,i;
+
+  strncpy(cmdbuf,cmdname,MAX_COMMAND_LEN);
+  cmdbuf[MAX_COMMAND_LEN-1]='\0';
+  
+  len=strlen(cmdbuf);
+  
+  /* Sanity check the string */
+  for (i=0;i<len;i++) {
+    cmdbuf[i]=toupper(cmdbuf[i]);
+    if (cmdbuf[i]<'A' || cmdbuf[i]>'Z') {
+      /* Someone tried to register an invalid command name */
+      return 1;    
+    }
+  }
+  
+  return 0;
+}
+
 /* 
  * addcommandhelptotree:
  *
@@ -85,10 +111,14 @@ int countcommandtree(CommandTree *ct) {
 Command *addcommandhelptotree(CommandTree *ct, const char *cmdname, int level, int maxparams, CommandHandler handler, const char *help) {
   Command *nc, *c;
   int i;
-  
+  char cmdbuf[MAX_COMMAND_LEN];
+
+  if (sanitisecommandname(cmdname, cmdbuf))
+    return NULL;
+
   /* Generate the struct.. */
   nc=(void *)malloc(sizeof(Command));
-  nc->command=getsstring(cmdname, MAX_COMMAND_LEN);
+  nc->command=getsstring(cmdbuf, MAX_COMMAND_LEN);
   nc->level=level;
   nc->maxparams=maxparams;
   nc->handler=handler;
@@ -105,19 +135,6 @@ Command *addcommandhelptotree(CommandTree *ct, const char *cmdname, int level, i
     nc->help=NULL;
   }
 
-  /* Sanity check the string */
-  for (i=0;i<nc->command->length;i++) {
-    nc->command->content[i]=toupper(nc->command->content[i]);
-    if (nc->command->content[i]<'A' || nc->command->content[i]>'Z') {
-      /* Someone tried to register an invalid command name */
-      freesstring(nc->command);
-      if(nc->help)
-        free(nc->help);
-      free(nc);
-      return NULL;    
-    }
-  }
-
   if ((c=findcommandintree(ct,cmdname,1))!=NULL) {
     /* Found something already.  Append our entry to the end */
     while (c->next!=NULL) 
@@ -190,21 +207,16 @@ int insertcommand(Command *c, CommandTree *ct, int depth) {
 
 int deletecommandfromtree(CommandTree *ct, const char *cmdname, CommandHandler handler) {
   int i;
+  char cmdbuf[MAX_COMMAND_LEN+1];
   sstring *tmpstr;
   
-  tmpstr=getsstring(cmdname,MAX_COMMAND_LEN);
+  if (sanitisecommandname(cmdname, cmdbuf))
+    return 1;
   
-  /* Sanity check input string */
-  for (i=0;i<tmpstr->length;i++) {
-    tmpstr->content[i]=toupper(tmpstr->content[i]);
-    if (tmpstr->content[i]<'A' || tmpstr->content[i]>'Z') {
-      /* Someone tried to delete an invalid command name */
-      freesstring(tmpstr);
-      return 1;
-    }
-  }
+  tmpstr=getsstring(cmdbuf, MAX_COMMAND_LEN);
   i=deletecommand(tmpstr,ct,0,handler);
   freesstring(tmpstr);
+
   return i;
 }