diff --git a/res/res_agi.c b/res/res_agi.c index 1a5ff7fbf284e77d299f144de816e1e0cf08a7ee..2ad328cf88181899153d7b0bad7a2c3e5c3a02c6 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 7d5c969223b613c96d6f317e9aae5c5ac63a1907..ec990d5d10c212fe9fb01d18aeaa1303655d84cf 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 17e3980b06a84bdddbb6793db9612285729d5240..1137a77701eed7067429d21a5b6996168f12da12 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)) {