X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/bdb8b1471a6c9b2438328c810785a2de668d5530..440cd7e63ac2b059ea1a467a2e4e2244faf92cb3:/parser/parser.c?ds=sidebyside diff --git a/parser/parser.c b/parser/parser.c index 476d6a87..2a814761 100644 --- a/parser/parser.c +++ b/parser/parser.c @@ -45,7 +45,14 @@ void destroycommandtree(CommandTree *ct) { destroycommandtree((CommandTree *)ct->next[i]); } } - + + if(ct->cmd) { + if(ct->cmd->command) + freesstring(ct->cmd->command); + if(ct->cmd->ext && ct->cmd->destroyext) + (ct->cmd->destroyext)(ct->cmd->ext); + free(ct->cmd); + } free(ct); } @@ -73,6 +80,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(const 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'Z') { + /* Someone tried to register an invalid command name */ + return 1; + } + } + + return 0; +} + /* * addcommandhelptotree: * @@ -82,41 +115,23 @@ int countcommandtree(CommandTree *ct) { * installing it in the tree */ -Command *addcommandhelptotree(CommandTree *ct, const char *cmdname, int level, int maxparams, CommandHandler handler, const char *help) { +Command *addcommandexttotree(CommandTree *ct, const char *cmdname, int level, int maxparams, CommandHandler handler, void *ext) { 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; nc->ext=NULL; nc->next=NULL; - if (help) { - int len=strlen(help); - nc->help=(char *)malloc(len+1); - if(nc->help) { - strncpy(nc->help, help, len); - nc->help[len] = '\0'; - } - } else { - nc->help=NULL; - } - - /* Sanity check the string */ - for (i=0;icommand->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; - } - } + nc->calls=0; + nc->destroyext=NULL; if ((c=findcommandintree(ct,cmdname,1))!=NULL) { /* Found something already. Append our entry to the end */ @@ -126,11 +141,12 @@ Command *addcommandhelptotree(CommandTree *ct, const char *cmdname, int level, i } else if (insertcommand(nc,ct,0)) { /* Erk, that didn't work.. */ freesstring(nc->command); - if(nc->help) - free(nc->help); free(nc); return NULL; } + + if (ext) + nc->ext=(void *)ext; return nc; } @@ -190,21 +206,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;ilength;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; } @@ -225,8 +236,8 @@ int deletecommand(sstring *cmdname, CommandTree *ct, int depth, CommandHandler h c=*ch; (*ch)=(Command *)((*ch)->next); freesstring(c->command); - if(c->help) - free(c->help); + if(c->ext && c->destroyext) + (c->destroyext)(c->ext); free(c); return 0; } @@ -244,8 +255,8 @@ int deletecommand(sstring *cmdname, CommandTree *ct, int depth, CommandHandler h c=*ch; (*ch)=(Command *)((*ch)->next); freesstring(c->command); - if(c->help) - free(c->help); + if(c->ext && c->destroyext) + (c->destroyext)(c->ext); free(c); /* We need to regenerate the final pointer if needed;