]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fixed Asterisk crash when function QUEUE_MEMBER receives invalid input
authorMatthew Jordan <mjordan@digium.com>
Wed, 14 Dec 2011 21:58:12 +0000 (21:58 +0000)
committerMatthew Jordan <mjordan@digium.com>
Wed, 14 Dec 2011 21:58:12 +0000 (21:58 +0000)
The function QUEUE_MEMBER has two required parameters (queuename, option).  It
was only checking for the presence of queuename.  The patch checks for the
existence of the option parameter and provides better error logging when
invalid values are provided for the option parameter as well.

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@348211 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_queue.c

index bae89b8dc6bf3fa8f5000119f28f80a4f292a89e..bb0c7d2bad8016ab3175ea1c0d029040b36c83de 100644 (file)
@@ -6309,12 +6309,17 @@ static int queue_function_mem_read(struct ast_channel *chan, const char *cmd, ch
        buf[0] = '\0';
 
        if (ast_strlen_zero(data)) {
-               ast_log(LOG_ERROR, "%s requires an argument: queuename\n", cmd);
+               ast_log(LOG_ERROR, "Missing required argument. %s(<queuename>,<option>[<interface>])\n", cmd);
                return -1;
        }
 
        AST_STANDARD_APP_ARGS(args, data);
 
+       if (args.argc < 2) {
+               ast_log(LOG_ERROR, "Missing required argument. %s(<queuename>,<option>[<interface>])\n", cmd);
+               return -1;
+       }
+
        if ((q = find_load_queue_rt_friendly(args.queuename))) {
                ao2_lock(q);
                if (!strcasecmp(args.option, "logged")) {
@@ -6364,6 +6369,9 @@ static int queue_function_mem_read(struct ast_channel *chan, const char *cmd, ch
                           ((m = interface_exists(q, args.interface)))) {
                        count = m->ignorebusy;
                        ao2_ref(m, -1);
+               } else {
+                       ast_log(LOG_ERROR, "Unknown option %s provided to %s, valid values are: "
+                               "logged, free, ready, count, penalty, paused, ignorebusy\n", args.option, cmd);
                }
                ao2_unlock(q);
                queue_t_unref(q, "Done with temporary reference in QUEUE_MEMBER()");