From: Matt O'Gorman Date: Fri, 13 Jan 2006 18:30:49 +0000 (+0000) Subject: Made chan_agent code parsing more robust and X-Git-Tag: 1.4.0-beta1~2945 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3928ebd74fdf42efcd44eba179d5950c4ccf2ab8;p=thirdparty%2Fasterisk.git Made chan_agent code parsing more robust and implemented new macro code. from 6228. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@8064 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_agent.c b/channels/chan_agent.c index 534b0ee750..5b1679e2be 100644 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -288,17 +288,17 @@ static void agent_unlink(struct agent_pvt *agent) struct agent_pvt *p, *prev; prev = NULL; p = agents; - // Iterate over all agents looking for the one. + /* Iterate over all agents looking for the one. */ while(p) { if (p == agent) { - // Once it wal found, check if it is the first one. + /* Once it was found, check if it is the first one. */ if (prev) - // If it is not, tell the previous agent that the next one is the next one of the current (jumping the current). + /* If it is not, tell the previous agent that the next one is the next one of the current (jumping the current). */ prev->next = agent->next; else - // If it is the first one, just change the general pointer to point to the second one. + /* If it is the first one, just change the general pointer to point to the second one. */ agents = agent->next; - // We are done. + /* We are done. */ break; } prev = p; @@ -316,32 +316,47 @@ static void agent_unlink(struct agent_pvt *agent) */ static struct agent_pvt *add_agent(char *agent, int pending) { - int argc; - char *argv[3]; - char *args; + char *parse; + AST_DECLARE_APP_ARGS(args, + AST_APP_ARG(agt); + AST_APP_ARG(password); + AST_APP_ARG(name); + ); char *password = NULL; char *name = NULL; char *agt = NULL; struct agent_pvt *p, *prev; - args = ast_strdupa(agent); + parse = ast_strdupa(agent); + if (!parse) { + ast_log(LOG_ERROR, "Out of memory!\n"); + return NULL; + } - // Extract username (agt), password and name from agent (args). - if ((argc = ast_app_separate_args(args, ',', argv, sizeof(argv) / sizeof(argv[0])))) { - agt = argv[0]; - if (argc > 1) { - password = argv[1]; - while (*password && *password < 33) password++; - } - if (argc > 2) { - name = argv[2]; - while (*name && *name < 33) name++; - } - } else { + /* Extract username (agt), password and name from agent (args). */ + AST_NONSTANDARD_APP_ARGS(args, parse, ','); + + if(args.argc == 0) { ast_log(LOG_WARNING, "A blank agent line!\n"); + return NULL; + } + + if(ast_strlen_zero(args.agt) ) { + ast_log(LOG_WARNING, "An agent line with no agentid!\n"); + return NULL; + } else + agt = args.agt; + + if(!ast_strlen_zero(args.password)) { + password = args.password; + while (*password && *password < 33) password++; + } + if(!ast_strlen_zero(args.name)) { + name = args.name; + while (*name && *name < 33) name++; } - // Are we searching for the agent here ? to see if it exists already ? + /* Are we searching for the agent here ? To see if it exists already ? */ prev=NULL; p = agents; while(p) { diff --git a/include/asterisk/app.h b/include/asterisk/app.h index 4cae463e8f..ace498286b 100644 --- a/include/asterisk/app.h +++ b/include/asterisk/app.h @@ -228,6 +228,19 @@ int ast_app_group_match_get_count(const char *groupmatch, const char *category); #define AST_STANDARD_APP_ARGS(args, parse) \ args.argc = ast_app_separate_args(parse, '|', args.argv, (sizeof(args) - sizeof(args.argc)) / sizeof(args.argv[0])) +/*! + \brief Performs the 'nonstandard' argument separation process for an application. + \param args An argument structure defined using AST_DECLARE_APP_ARGS + \param parse A modifiable buffer containing the input to be parsed + \param sep A nonstandard separator character + + This function will separate the input string using the nonstandard argument + separator character and fill in the provided structure, including + the argc argument counter field. + */ +#define AST_NONSTANDARD_APP_ARGS(args, parse, sep) \ + args.argc = ast_app_separate_args(parse, sep, args.argv, (sizeof(args) - sizeof(args.argc)) / sizeof(args.argv[0])) + /*! \brief Separate a string into arguments in an array \param buf The string to be parsed (this must be a writable copy, as it will be modified)