res_rtp_asterisk & udptl: fix port selection to work with SELinux restrictions
authorCorey Farrell <git@cfware.com>
Thu, 30 Jan 2014 20:36:21 +0000 (20:36 +0000)
committerCorey Farrell <git@cfware.com>
Thu, 30 Jan 2014 20:36:21 +0000 (20:36 +0000)
ast_bind to a port reserved for another program by SELinux causes
errno == EACCES.  This caused random failures when binding rtp or
udptl sockets.  Treat EACCES as a non-fatal error, try next port.

(closes issue ASTERISK-23134)
Reported by: Corey Farrell
........

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

Merged revisions 406934 from http://svn.asterisk.org/svn/asterisk/branches/11
........

Merged revisions 406935 from http://svn.asterisk.org/svn/asterisk/branches/12

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

main/udptl.c
res/res_rtp_asterisk.c

index dac350e..acbb4d7 100644 (file)
@@ -1051,7 +1051,7 @@ struct ast_udptl *ast_udptl_new_with_bindaddr(struct ast_sched_context *sched, s
                if (ast_bind(udptl->fd, &udptl->us) == 0) {
                        break;
                }
-               if (errno != EADDRINUSE) {
+               if (errno != EADDRINUSE && errno != EACCES) {
                        ast_log(LOG_WARNING, "Unexpected bind error: %s\n", strerror(errno));
                        close(udptl->fd);
                        ast_free(udptl);
index b2f11dc..1e9f070 100644 (file)
@@ -1822,7 +1822,7 @@ static int ast_rtp_new(struct ast_rtp_instance *instance,
                }
 
                /* See if we ran out of ports or if the bind actually failed because of something other than the address being in use */
-               if (x == startplace || errno != EADDRINUSE) {
+               if (x == startplace || (errno != EADDRINUSE && errno != EACCES)) {
                        ast_log(LOG_ERROR, "Oh dear... we couldn't allocate a port for RTP instance '%p'\n", instance);
                        close(rtp->s);
                        ast_free(rtp);