diff options
author | zuul <zuul@gerrit.asterisk.org> | 2017-02-14 13:31:01 -0600 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2017-02-14 13:31:01 -0600 |
commit | cea835e565ea690b99dfbc3240900a47694e186b (patch) | |
tree | a1938a6d505e8d574bd07d5672a07ba7d8e0c1f4 /main/channel.c | |
parent | b1e0b261454d668424c1831e672dc3ff51680daa (diff) | |
parent | 89871576b943058b65a7bfbe9df59fbe75f982dd (diff) |
Merge "channel: Protect flags in ast_waitfor_nandfds operation."
Diffstat (limited to 'main/channel.c')
-rw-r--r-- | main/channel.c | 6 |
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; |