From: pk910 Date: Mon, 17 Oct 2011 21:52:17 +0000 (+0200) Subject: modified modcmd parameter pattern parser. X-Git-Tag: v5.3~292 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=bc5b1df5a60a730aec70c11f5042ce27e0b9c270 modified modcmd parameter pattern parser. we need to copy the full argument string into it's own buffer and reference to this one.. this is necessary to prevent problems with functions like merge_args. --- diff --git a/src/modcmd.c b/src/modcmd.c index eeaee94..15b85ea 100644 --- a/src/modcmd.c +++ b/src/modcmd.c @@ -41,7 +41,7 @@ struct command_check_user_cache { struct ChanNode *chan, *sent_chan; char **argv; int argc; - char *message; + char *message, *args_buffer; struct cmd_binding *cbind; }; @@ -116,6 +116,9 @@ static USERAUTH_CALLBACK(command_checked_auth) { tmp_text_client = cache->textclient; handle_command_async(cache->client, user, cache->chan, cache->sent_chan, cache->cbind, cache->argv, cache->argc); free(cache->message); + if(cache->args_buffer) + free(cache->args_buffer); + free(cache->argv); free(cache); } @@ -134,6 +137,7 @@ static void handle_command(struct ClientSocket *client, struct UserNode *user, s message = strdup(message); int bind_index = get_binds_index(message[0]); char *args = strstr(message, " "); + char *args_buffer = NULL; //we need this to save a possible pointer to a allocation we need to free if(args) { *args = '\0'; args++; @@ -170,6 +174,8 @@ static void handle_command(struct ClientSocket *client, struct UserNode *user, s } if(cbind->paramcount) { //userdefined parameters... + args_buffer = malloc(MAXLEN * 2 * sizeof(*args_buffer)); + int args_pos = 0; char *uargs[MAXNUMPARAMS]; int uargc = 0; char *b; @@ -185,25 +191,48 @@ static void handle_command(struct ClientSocket *client, struct UserNode *user, s argi = atoi(b); b[allargs] = '-'; allargs = 1; + } else if(b[strlen(b)-1] == '+') { + allargs = strlen(b)-1; + b[allargs] = '\0'; + argi = atoi(b); + b[allargs] = '+'; + allargs = 2; } else { allargs = 0; argi = atoi(b); } if(argi > 0) { if(argi <= argc) { - uargs[uargc++] = argv[argi-1]; - if(allargs) { - for(argi++; argi <= argc; argi++) - uargs[uargc++] = argv[argi-1]; + uargs[uargc++] = args_buffer + args_pos; + if(allargs == 0) { + args_pos += sprintf(args_buffer + args_pos, "%s", argv[argi-1]) + 1; + } else if(allargs == 1) { + args_pos += sprintf(args_buffer + args_pos, "%s", argv[argi-1]) + 1; + for(argi++; argi <= argc; argi++) { + uargs[uargc++] = args_buffer + args_pos; + args_pos += sprintf(args_buffer + args_pos, "%s", argv[argi-1]) + 1; + } + } else if(allargs == 2) { + for(;argi <= argc; argi++) { + args_pos += sprintf(args_buffer + args_pos, (allargs ? "%s" : " %s"), argv[argi-1]); + allargs = 0; + } + args_pos++; } + } else if((cbind->func->flags & CMDFLAG_EMPTY_ARGS)) { + uargs[uargc++] = args_buffer + args_pos; + args_buffer[args_pos++] = '\0'; } } else if(!strcmp(b, "c")) { - uargs[uargc++] = (chan ? chan->name : NULL); + uargs[uargc++] = args_buffer + args_pos; + args_pos += sprintf(args_buffer + args_pos, "%s", (chan ? chan->name : "")) + 1; } else if(!strcmp(b, "n")) { - uargs[uargc++] = user->nick; + uargs[uargc++] = args_buffer + args_pos; + args_pos += sprintf(args_buffer + args_pos, "%s", user->nick) + 1; } } else { - uargs[uargc++] = b; + uargs[uargc++] = args_buffer + args_pos; + args_pos += sprintf(args_buffer + args_pos, "%s", b) + 1; } } argv = uargs; @@ -233,6 +262,7 @@ static void handle_command(struct ClientSocket *client, struct UserNode *user, s data->chan = chan; data->sent_chan = sent_chan; data->message = message; + data->args_buffer = args_buffer; data->cbind = cbind; data->textclient = tmp_text_client; get_userauth(user, command_checked_auth, data); @@ -243,6 +273,8 @@ static void handle_command(struct ClientSocket *client, struct UserNode *user, s } } free(message); + if(args_buffer) + free(args_buffer); } static void handle_command_async(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, struct ChanNode *sent_chan, struct cmd_binding *cbind, char **argv, int argc) { diff --git a/src/modcmd.h b/src/modcmd.h index 4717dad..21f5b37 100644 --- a/src/modcmd.h +++ b/src/modcmd.h @@ -30,6 +30,7 @@ #define CMDFLAG_CHAN_PARAM 0x0080 #define CMDFLAG_LOG 0x0100 #define CMDFLAG_OPLOG 0x0200 +#define CMDFLAG_EMPTY_ARGS 0x0400 struct ClientSocket; struct UserNode;