summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2012-04-17 21:14:49 +0000
committerMatthew Jordan <mjordan@digium.com>2012-04-17 21:14:49 +0000
commit016dfa01f1883a246c8944014ce0ecadff651a81 (patch)
tree176fdd07f911332ec9bba1e0e2d83b296a79eeea
parentf88a632d96bb3ed76976b2f32f5d7b7e8591afa9 (diff)
Fix places in resources where a negative return value could impact execution
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 ........ Merged revisions 362364 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@362365 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--res/res_agi.c12
-rw-r--r--res/res_musiconhold.c2
-rw-r--r--res/res_rtp_asterisk.c5
3 files changed, 12 insertions, 7 deletions
diff --git a/res/res_agi.c b/res/res_agi.c
index 1a5ff7fbf..2ad328cf8 100644
--- a/res/res_agi.c
+++ b/res/res_agi.c
@@ -1301,9 +1301,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",
- ast_channel_name(chan));
+ if (res <= 0) {
+ ast_log(LOG_ERROR, "Failed to read from Async AGI pipe on channel %s: %s\n",
+ ast_channel_name(chan), res < 0 ? strerror(errno) : "EOF");
returnstatus = AGI_RESULT_FAILURE;
goto async_agi_abort;
}
@@ -1331,9 +1331,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",
- ast_channel_name(chan));
+ if (res <= 0) {
+ ast_log(LOG_ERROR, "Failed to read from Async AGI pipe on channel %s: %s\n",
+ ast_channel_name(chan), res < 0 ? strerror(errno) : "EOF");
free_agi_cmd(cmd);
returnstatus = AGI_RESULT_FAILURE;
goto async_agi_done;
diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c
index 7d5c96922..ec990d5d1 100644
--- a/res/res_musiconhold.c
+++ b/res/res_musiconhold.c
@@ -681,7 +681,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) {
diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c
index 17e3980b0..1137a7770 100644
--- a/res/res_rtp_asterisk.c
+++ b/res/res_rtp_asterisk.c
@@ -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)) {