summaryrefslogtreecommitdiff
path: root/main/channel.c
diff options
context:
space:
mode:
authorzuul <zuul@gerrit.asterisk.org>2017-02-14 13:31:01 -0600
committerGerrit Code Review <gerrit2@gerrit.digium.api>2017-02-14 13:31:01 -0600
commitcea835e565ea690b99dfbc3240900a47694e186b (patch)
treea1938a6d505e8d574bd07d5672a07ba7d8e0c1f4 /main/channel.c
parentb1e0b261454d668424c1831e672dc3ff51680daa (diff)
parent89871576b943058b65a7bfbe9df59fbe75f982dd (diff)
Merge "channel: Protect flags in ast_waitfor_nandfds operation."
Diffstat (limited to 'main/channel.c')
-rw-r--r--main/channel.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/main/channel.c b/main/channel.c
index 992c94086..54db47351 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -3133,7 +3133,9 @@ struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds,
fdmap[max].chan = x; /* channel x is linked to this pfds */
max += ast_add_fd(&pfds[max], ast_channel_fd(c[x], y));
}
+ ast_channel_lock(c[x]);
CHECK_BLOCKING(c[x]);
+ ast_channel_unlock(c[x]);
}
/* Add the individual fds */
for (x = 0; x < nfds; x++) {
@@ -3160,7 +3162,9 @@ struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds,
res = ast_poll(pfds, max, rms);
}
for (x = 0; x < n; x++) {
+ ast_channel_lock(c[x]);
ast_clear_flag(ast_channel_flags(c[x]), AST_FLAG_BLOCKING);
+ ast_channel_unlock(c[x]);
}
if (res < 0) { /* Simulate a timeout if we were interrupted */
if (errno != EINTR) {
@@ -3196,12 +3200,14 @@ struct ast_channel *ast_waitfor_nandfds(struct ast_channel **c, int n, int *fds,
}
if (fdmap[x].chan >= 0) { /* this is a channel */
winner = c[fdmap[x].chan]; /* override previous winners */
+ ast_channel_lock(winner);
if (res & POLLPRI) {
ast_set_flag(ast_channel_flags(winner), AST_FLAG_EXCEPTION);
} else {
ast_clear_flag(ast_channel_flags(winner), AST_FLAG_EXCEPTION);
}
ast_channel_fdno_set(winner, fdmap[x].fdno);
+ ast_channel_unlock(winner);
} else { /* this is an fd */
if (outfd) {
*outfd = pfds[x].fd;