]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix places in resources where a negative return value could impact execution
authorMatthew Jordan <mjordan@digium.com>
Tue, 17 Apr 2012 21:11:25 +0000 (21:11 +0000)
committerMatthew Jordan <mjordan@digium.com>
Tue, 17 Apr 2012 21:11:25 +0000 (21:11 +0000)
This patch addresses a number of modules in resources that did not handle the
negative return value from function calls adequately.  This includes:

* res_agi.c: if the result of the read function is a negative number,
indicating some failure, the result would instead be treated as the number
of bytes read.  This patch now treats negative results in the same manner
as an end of file condition, with the exception that it also logs the
error code indicated by the return.

* res_musiconhold.c: if spawn_mp3 fails to assign a file descriptor to srcfd,
and instead assigns a negative value, that file descriptor could later be
passed to functions that require a valid file descriptor.  If spawn_mp3 fails,
we now immediately retry instead of continuing in the logic.

* res_rtp_asterisk.c: if no codec can be matched between two RTP instances
in a peer to peer bridge, we immediately return instead of attempting to
use the codec payload type as an index to determine the appropriate negotiated
codec.

(issue ASTERISK-19655)
Reported by: Matt Jordan

Review: https://reviewboard.asterisk.org/r/1863/
........

Merged revisions 362362 from http://svn.asterisk.org/svn/asterisk/branches/1.8

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

res/res_agi.c
res/res_musiconhold.c
res/res_rtp_asterisk.c

index c05701d38e170f8aeeb76e5eec972f2a00392a70..36397dc1d30fe669d05fc1388490b8bfb010f7c2 100644 (file)
@@ -1297,9 +1297,9 @@ static enum agi_result launch_asyncagi(struct ast_channel *chan, char *argv[], i
        setup_env(chan, "async", fds[1], 0, 0, NULL);
        /* read the environment */
        res = read(fds[0], agi_buffer, AGI_BUF_SIZE);
-       if (!res) {
-               ast_log(LOG_ERROR, "Failed to read from Async AGI pipe on channel %s\n",
-                       chan->name);
+       if (res <= 0) {
+               ast_log(LOG_ERROR, "Failed to read from Async AGI pipe on channel %s: %s\n",
+                       chan->name, res < 0 ? strerror(errno) : "EOF");
                returnstatus = AGI_RESULT_FAILURE;
                goto async_agi_abort;
        }
@@ -1327,9 +1327,9 @@ static enum agi_result launch_asyncagi(struct ast_channel *chan, char *argv[], i
                         * fd (the pipe), let's read the response.
                         */
                        res = read(fds[0], agi_buffer, AGI_BUF_SIZE);
-                       if (!res) {
-                               ast_log(LOG_ERROR, "Failed to read from Async AGI pipe on channel %s\n",
-                                       chan->name);
+                       if (res <= 0) {
+                               ast_log(LOG_ERROR, "Failed to read from Async AGI pipe on channel %s: %s\n",
+                                       chan->name, res < 0 ? strerror(errno) : "EOF");
                                free_agi_cmd(cmd);
                                returnstatus = AGI_RESULT_FAILURE;
                                goto async_agi_done;
index 76b9bafd9bd65022a72b7eab2369328a9275f89e..34124e9ba15bfcf29f980ee97a67648a1e233627 100644 (file)
@@ -669,7 +669,7 @@ static void *monmp3thread(void *data)
                                ast_log(LOG_WARNING, "Unable to spawn mp3player\n");
                                /* Try again later */
                                sleep(500);
-                               pthread_testcancel();
+                               continue;
                        }
                }
                if (class->timer) {
index d804d2cb0bde0ac888d840c8745585a12874328e..de99acf32cb22c1254be49dfcde0ba8566092b8a 100644 (file)
@@ -2046,6 +2046,11 @@ static int bridge_p2p_rtp_write(struct ast_rtp_instance *instance, unsigned int
        /* Otherwise adjust bridged payload to match */
        bridged_payload = ast_rtp_codecs_payload_code(ast_rtp_instance_get_codecs(instance1), payload_type.asterisk_format, &payload_type.format, payload_type.rtp_code);
 
+       /* If no codec could be matched between instance and instance1, then somehow things were made incompatible while we were still bridged.  Bail. */
+       if (bridged_payload < 0) {
+               return -1;
+       }
+
        /* If the payload coming in is not one of the negotiated ones then send it to the core, this will cause formats to change and the bridge to break */
        if (!(ast_rtp_instance_get_codecs(instance1)->payloads[bridged_payload].rtp_code) &&
        !(ast_rtp_instance_get_codecs(instance1)->payloads[bridged_payload].asterisk_format)) {