You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by yl...@apache.org on 2015/03/20 02:31:18 UTC

svn commit: r1667919 - in /apr/apr/branches/1.6.x: ./ network_io/unix/sockets.c poll/unix/epoll.c poll/unix/kqueue.c poll/unix/poll.c poll/unix/pollcb.c poll/unix/port.c poll/unix/z_asio.c

Author: ylavic
Date: Fri Mar 20 01:31:17 2015
New Revision: 1667919

URL: http://svn.apache.org/r1667919
Log:
Merge r1666341, r1667914 and r1667916 from trunk.

apr_poll(cb): fix error paths returned values and leaks.

Modified:
    apr/apr/branches/1.6.x/   (props changed)
    apr/apr/branches/1.6.x/network_io/unix/sockets.c
    apr/apr/branches/1.6.x/poll/unix/epoll.c
    apr/apr/branches/1.6.x/poll/unix/kqueue.c
    apr/apr/branches/1.6.x/poll/unix/poll.c
    apr/apr/branches/1.6.x/poll/unix/pollcb.c
    apr/apr/branches/1.6.x/poll/unix/port.c
    apr/apr/branches/1.6.x/poll/unix/z_asio.c   (contents, props changed)

Propchange: apr/apr/branches/1.6.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Mar 20 01:31:17 2015
@@ -1,4 +1,4 @@
 /apr/apr/branches/1.4.x:1003369,1101301
-/apr/apr/trunk:733052,739635,741862,741866-741867,741869,741871,745763-745764,746310,747990,748080,748361,748371,748565,748888,748902,748988,749810,760443,767895,775683,782838,783398,783958,784633,784773,788588,789050,793192-793193,794118,794485,795267,799497,800627,809745,809854,810472,811455,813063,821306,829490,831641,832904,835607,888669,892028,892159,892435,892909,896382,896653,908427,910419,910597,917819,917837-917838,925965,929796,931973,951771,960665,960671,979891,983618,989450,990435,1003338,1044440,1044447,1055657,1072165,1078845,1081462,1081495,1083038,1083242,1084662,1086695,1088023,1089031,1089129,1089438,1099348,1103310,1183683,1183685-1183686,1183688,1183693,1183698,1213382,1235047,1236970,1237078,1237507,1240472,1340286,1340288,1340470,1341193,1341196,1343233,1343243,1367050,1368819,1370494,1372018,1372022,1372093,1372849,1376957,1384764,1389077,1400200,1402868,1405985,1406690,1420106,1420109,1425356,1428809,1438940,1438957-1438959,1442903,1449568,1456418,1459994,146
 0179-1460180,1460241,1460399,1460405,1462738,1462813,1470186,1470348,1475509,1478905,1480067,1481262,1481265,1484271,1487796,1489517,1496407,1502804,1510354,1516261,1523384,1523479,1523484,1523505,1523521,1523604,1523613,1523615,1523844-1523845,1523853,1524014,1524031,1528797,1528809,1529488,1529495,1529515,1529521,1529668,1530786,1530800,1530988,1531554,1531768,1531884,1532022,1533104,1533111,1533979,1535027,1535157,1536744,1538171,1539374,1539389,1539455,1539603,1541054,1541061,1541486,1541655,1541666,1541744,1542601,1542779,1543033,1543056,1548575,1550907,1551650,1551659,1558905,1559382,1559873,1559975,1561040,1561260,1561265,1561321,1561347,1561356,1561361,1561394,1561555,1571894,1575509,1578420,1587045,1587063,1587543,1587545,1588878,1588937,1593611,1593614-1593615,1593680,1594684,1594708,1595549,1597797,1597803,1604590,1604596,1604598,1605104,1610854,1611023,1611107,1611110,1611117,1611120,1611125,1611184,1611193,1611466,1611515,1611517,1625173,1626564,1634615,1648830,1664406,
 1664447,1664451,1664471,1664769-1664770,1664775,1664904,1664911,1664958,1666411,1666458,1666611
+/apr/apr/trunk:733052,739635,741862,741866-741867,741869,741871,745763-745764,746310,747990,748080,748361,748371,748565,748888,748902,748988,749810,760443,767895,775683,782838,783398,783958,784633,784773,788588,789050,793192-793193,794118,794485,795267,799497,800627,809745,809854,810472,811455,813063,821306,829490,831641,832904,835607,888669,892028,892159,892435,892909,896382,896653,908427,910419,910597,917819,917837-917838,925965,929796,931973,951771,960665,960671,979891,983618,989450,990435,1003338,1044440,1044447,1055657,1072165,1078845,1081462,1081495,1083038,1083242,1084662,1086695,1088023,1089031,1089129,1089438,1099348,1103310,1183683,1183685-1183686,1183688,1183693,1183698,1213382,1235047,1236970,1237078,1237507,1240472,1340286,1340288,1340470,1341193,1341196,1343233,1343243,1367050,1368819,1370494,1372018,1372022,1372093,1372849,1376957,1384764,1389077,1400200,1402868,1405985,1406690,1420106,1420109,1425356,1428809,1438940,1438957-1438959,1442903,1449568,1456418,1459994,146
 0179-1460180,1460241,1460399,1460405,1462738,1462813,1470186,1470348,1475509,1478905,1480067,1481262,1481265,1484271,1487796,1489517,1496407,1502804,1510354,1516261,1523384,1523479,1523484,1523505,1523521,1523604,1523613,1523615,1523844-1523845,1523853,1524014,1524031,1528797,1528809,1529488,1529495,1529515,1529521,1529668,1530786,1530800,1530988,1531554,1531768,1531884,1532022,1533104,1533111,1533979,1535027,1535157,1536744,1538171,1539374,1539389,1539455,1539603,1541054,1541061,1541486,1541655,1541666,1541744,1542601,1542779,1543033,1543056,1548575,1550907,1551650,1551659,1558905,1559382,1559873,1559975,1561040,1561260,1561265,1561321,1561347,1561356,1561361,1561394,1561555,1571894,1575509,1578420,1587045,1587063,1587543,1587545,1588878,1588937,1593611,1593614-1593615,1593680,1594684,1594708,1595549,1597797,1597803,1604590,1604596,1604598,1605104,1610854,1611023,1611107,1611110,1611117,1611120,1611125,1611184,1611193,1611466,1611515,1611517,1625173,1626564,1634615,1648830,1664406,
 1664447,1664451,1664471,1664769-1664770,1664775,1664904,1664911,1664958,1666341,1666411,1666458,1666611,1667914,1667916
 /apr/apr/trunk/test/testnames.c:1460405
 /httpd/httpd/trunk:1604590

Modified: apr/apr/branches/1.6.x/network_io/unix/sockets.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/network_io/unix/sockets.c?rev=1667919&r1=1667918&r2=1667919&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/network_io/unix/sockets.c (original)
+++ apr/apr/branches/1.6.x/network_io/unix/sockets.c Fri Mar 20 01:31:17 2015
@@ -175,13 +175,22 @@ apr_status_t apr_socket_create(apr_socke
 #ifndef HAVE_SOCK_CLOEXEC
     {
         int flags;
+        apr_status_t rv;
 
-        if ((flags = fcntl((*new)->socketdes, F_GETFD)) == -1)
-            return errno;
+        if ((flags = fcntl((*new)->socketdes, F_GETFD)) == -1) {
+            rv = errno;
+            close((*new)->socketdes);
+            (*new)->socketdes = -1;
+            return rv;
+        }
 
         flags |= FD_CLOEXEC;
-        if (fcntl((*new)->socketdes, F_SETFD, flags) == -1)
-            return errno;
+        if (fcntl((*new)->socketdes, F_SETFD, flags) == -1) {
+            rv = errno;
+            close((*new)->socketdes);
+            (*new)->socketdes = -1;
+            return rv;
+        }
     }
 #endif
 
@@ -351,13 +360,22 @@ apr_status_t apr_socket_accept(apr_socke
 #ifndef HAVE_ACCEPT4
     {
         int flags;
+        apr_status_t rv;
 
-        if ((flags = fcntl((*new)->socketdes, F_GETFD)) == -1)
-            return errno;
+        if ((flags = fcntl((*new)->socketdes, F_GETFD)) == -1) {
+            rv = errno;
+            close((*new)->socketdes);
+            (*new)->socketdes = -1;
+            return rv;
+        }
 
         flags |= FD_CLOEXEC;
-        if (fcntl((*new)->socketdes, F_SETFD, flags) == -1)
-            return errno;
+        if (fcntl((*new)->socketdes, F_SETFD, flags) == -1) {
+            rv = errno;
+            close((*new)->socketdes);
+            (*new)->socketdes = -1;
+            return rv;
+        }
     }
 #endif
 

Modified: apr/apr/branches/1.6.x/poll/unix/epoll.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/poll/unix/epoll.c?rev=1667919&r1=1667918&r2=1667919&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/poll/unix/epoll.c (original)
+++ apr/apr/branches/1.6.x/poll/unix/epoll.c Fri Mar 20 01:31:17 2015
@@ -104,14 +104,22 @@ static apr_status_t impl_pollset_create(
 
 #ifndef HAVE_EPOLL_CREATE1
     {
-        int flags;
+        int fd_flags;
 
-        if ((flags = fcntl(fd, F_GETFD)) == -1)
-            return errno;
+        if ((fd_flags = fcntl(fd, F_GETFD)) == -1) {
+            rv = errno;
+            close(fd);
+            pollset->p = NULL;
+            return rv;
+        }
 
-        flags |= FD_CLOEXEC;
-        if (fcntl(fd, F_SETFD, flags) == -1)
-            return errno;
+        fd_flags |= FD_CLOEXEC;
+        if (fcntl(fd, F_SETFD, fd_flags) == -1) {
+            rv = errno;
+            close(fd);
+            pollset->p = NULL;
+            return rv;
+        }
     }
 #endif
 
@@ -122,11 +130,13 @@ static apr_status_t impl_pollset_create(
         ((rv = apr_thread_mutex_create(&pollset->p->ring_lock,
                                        APR_THREAD_MUTEX_DEFAULT,
                                        p)) != APR_SUCCESS)) {
+        close(fd);
         pollset->p = NULL;
         return rv;
     }
 #else
     if (flags & APR_POLLSET_THREADSAFE) {
+        close(fd);
         pollset->p = NULL;
         return APR_ENOTIMPL;
     }
@@ -345,14 +355,23 @@ static apr_status_t impl_pollcb_create(a
 
 #ifndef HAVE_EPOLL_CREATE1
     {
-        int flags;
+        int fd_flags;
+        apr_status_t rv;
 
-        if ((flags = fcntl(fd, F_GETFD)) == -1)
-            return errno;
+        if ((fd_flags = fcntl(fd, F_GETFD)) == -1) {
+            rv = errno;
+            close(fd);
+            pollcb->fd = -1;
+            return rv;
+        }
 
-        flags |= FD_CLOEXEC;
-        if (fcntl(fd, F_SETFD, flags) == -1)
-            return errno;
+        fd_flags |= FD_CLOEXEC;
+        if (fcntl(fd, F_SETFD, fd_flags) == -1) {
+            rv = errno;
+            close(fd);
+            pollcb->fd = -1;
+            return rv;
+        }
     }
 #endif
     

Modified: apr/apr/branches/1.6.x/poll/unix/kqueue.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/poll/unix/kqueue.c?rev=1667919&r1=1667918&r2=1667919&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/poll/unix/kqueue.c (original)
+++ apr/apr/branches/1.6.x/poll/unix/kqueue.c Fri Mar 20 01:31:17 2015
@@ -115,12 +115,20 @@ static apr_status_t impl_pollset_create(
     {
         int flags;
 
-        if ((flags = fcntl(pollset->p->kqueue_fd, F_GETFD)) == -1)
-            return errno;
+        if ((flags = fcntl(pollset->p->kqueue_fd, F_GETFD)) == -1) {
+            rv = errno;
+            close(pollset->p->kqueue_fd);
+            pollset->p = NULL;
+            return rv;
+        }
 
         flags |= FD_CLOEXEC;
-        if (fcntl(pollset->p->kqueue_fd, F_SETFD, flags) == -1)
-            return errno;
+        if (fcntl(pollset->p->kqueue_fd, F_SETFD, flags) == -1) {
+            rv = errno;
+            close(pollset->p->kqueue_fd);
+            pollset->p = NULL;
+            return rv;
+        }
     }
 
     pollset->p->result_set = apr_palloc(p, pollset->p->setsize * sizeof(apr_pollfd_t));
@@ -338,13 +346,22 @@ static apr_status_t impl_pollcb_create(a
 
     {
         int flags;
+        apr_status_t rv;
 
-        if ((flags = fcntl(fd, F_GETFD)) == -1)
-            return errno;
+        if ((flags = fcntl(fd, F_GETFD)) == -1) {
+            rv = errno;
+            close(fd);
+            pollcb->fd = -1;
+            return rv;
+        }
 
         flags |= FD_CLOEXEC;
-        if (fcntl(fd, F_SETFD, flags) == -1)
-            return errno;
+        if (fcntl(fd, F_SETFD, flags) == -1) {
+            rv = errno;
+            close(fd);
+            pollcb->fd = -1;
+            return rv;
+        }
     }
  
     pollcb->fd = fd;

Modified: apr/apr/branches/1.6.x/poll/unix/poll.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/poll/unix/poll.c?rev=1667919&r1=1667918&r2=1667919&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/poll/unix/poll.c (original)
+++ apr/apr/branches/1.6.x/poll/unix/poll.c Fri Mar 20 01:31:17 2015
@@ -240,26 +240,25 @@ static apr_status_t impl_pollset_poll(ap
 {
     int ret;
     apr_status_t rv = APR_SUCCESS;
-#ifdef WIN32
-    apr_interval_time_t orig_timeout = timeout;
-#endif
 
-    if (timeout > 0) {
-        timeout /= 1000;
-    }
 #ifdef WIN32
     /* WSAPoll() requires at least one socket. */
     if (pollset->nelts == 0) {
         *num = 0;
-        if (orig_timeout > 0) {
-            apr_sleep(orig_timeout);
+        if (timeout > 0) {
+            apr_sleep(timeout);
             return APR_TIMEUP;
         }
         return APR_SUCCESS;
     }
-
+    if (timeout > 0) {
+        timeout /= 1000;
+    }
     ret = WSAPoll(pollset->p->pollset, pollset->nelts, (int)timeout);
 #else
+    if (timeout > 0) {
+        timeout /= 1000;
+    }
     ret = poll(pollset->p->pollset, pollset->nelts, timeout);
 #endif
     (*num) = ret;

Modified: apr/apr/branches/1.6.x/poll/unix/pollcb.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/poll/unix/pollcb.c?rev=1667919&r1=1667918&r2=1667919&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/poll/unix/pollcb.c (original)
+++ apr/apr/branches/1.6.x/poll/unix/pollcb.c Fri Mar 20 01:31:17 2015
@@ -136,6 +136,9 @@ APR_DECLARE(apr_status_t) apr_pollcb_cre
         }
         pollcb->provider = provider;
     }
+    else if (rv != APR_SUCCESS) {
+        return rv;
+    }
 
     *ret_pollcb = pollcb;
     return APR_SUCCESS;

Modified: apr/apr/branches/1.6.x/poll/unix/port.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/poll/unix/port.c?rev=1667919&r1=1667918&r2=1667919&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/poll/unix/port.c (original)
+++ apr/apr/branches/1.6.x/poll/unix/port.c Fri Mar 20 01:31:17 2015
@@ -188,12 +188,20 @@ static apr_status_t impl_pollset_create(
     {
         int flags;
 
-        if ((flags = fcntl(pollset->p->port_fd, F_GETFD)) == -1)
-            return errno;
+        if ((flags = fcntl(pollset->p->port_fd, F_GETFD)) == -1) {
+            rv = errno;
+            close(pollset->p->port_fd);
+            pollset->p = NULL;
+            return rv;
+        }
 
         flags |= FD_CLOEXEC;
-        if (fcntl(pollset->p->port_fd, F_SETFD, flags) == -1)
-            return errno;
+        if (fcntl(pollset->p->port_fd, F_SETFD, flags) == -1) {
+            rv = errno;
+            close(pollset->p->port_fd);
+            pollset->p = NULL;
+            return rv;
+        }
     }
 
     pollset->p->result_set = apr_palloc(p, size * sizeof(apr_pollfd_t));
@@ -478,13 +486,22 @@ static apr_status_t impl_pollcb_create(a
 
     {
         int flags;
+        apr_status_t rv;
 
-        if ((flags = fcntl(pollcb->fd, F_GETFD)) == -1)
-            return errno;
+        if ((flags = fcntl(pollcb->fd, F_GETFD)) == -1) {
+            rv = errno;
+            close(pollcb->fd);
+            pollcb->fd = -1;
+            return rv;
+        }
 
         flags |= FD_CLOEXEC;
-        if (fcntl(pollcb->fd, F_SETFD, flags) == -1)
-            return errno;
+        if (fcntl(pollcb->fd, F_SETFD, flags) == -1) {
+            rv = errno;
+            close(pollcb->fd);
+            pollcb->fd = -1;
+            return rv;
+        }
     }
 
     pollcb->pollset.port = apr_palloc(p, size * sizeof(port_event_t));

Modified: apr/apr/branches/1.6.x/poll/unix/z_asio.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.6.x/poll/unix/z_asio.c?rev=1667919&r1=1667918&r2=1667919&view=diff
==============================================================================
--- apr/apr/branches/1.6.x/poll/unix/z_asio.c (original)
+++ apr/apr/branches/1.6.x/poll/unix/z_asio.c Fri Mar 20 01:31:17 2015
@@ -272,7 +272,7 @@ static apr_status_t asio_pollset_create(
                                            APR_THREAD_MUTEX_DEFAULT,
                                            p) != APR_SUCCESS) {
             DBG1(1, "apr_thread_mutex_create returned %d\n", rv);
-            pollset = NULL;
+            pollset->p = NULL;
             return rv;
         }
         rv = msgget(IPC_PRIVATE, S_IWUSR+S_IRUSR); /* user r/w perms */
@@ -280,7 +280,7 @@ static apr_status_t asio_pollset_create(
 #if DEBUG
             perror(__FUNCTION__ " msgget returned < 0 ");
 #endif
-            pollset = NULL;
+            pollset->p = NULL;
             return rv;
         }
 
@@ -292,7 +292,7 @@ static apr_status_t asio_pollset_create(
         APR_RING_INIT(&priv->prior_ready_ring, asio_elem_t, link);
 
 #else  /* APR doesn't have threads but caller wants a threadsafe pollset */
-        pollset = NULL;
+        pollset->p = NULL;
         return APR_ENOTIMPL;
 #endif
 
@@ -304,6 +304,7 @@ static apr_status_t asio_pollset_create(
         priv->query_set = apr_palloc(p, size * sizeof(apr_pollfd_t));
 
         if ((!priv->pollset) || (!priv->query_set)) {
+            pollset->p = NULL;
             return APR_ENOMEM;
         }
     }
@@ -314,6 +315,10 @@ static apr_status_t asio_pollset_create(
     priv->size    = size;
     priv->result_set = apr_palloc(p, size * sizeof(apr_pollfd_t));
     if (!priv->result_set) {
+        if (flags & APR_POLLSET_THREADSAFE) {
+            msgctl(priv->msg_q, IPC_RMID, NULL);
+        }
+        pollset->p = NULL;
         return APR_ENOMEM;
     }
 

Propchange: apr/apr/branches/1.6.x/poll/unix/z_asio.c
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Mar 20 01:31:17 2015
@@ -1,4 +1,4 @@
 /apr/apr/branches/1.4.x/poll/unix/z_asio.c:1101301
 /apr/apr/branches/1.5.x/poll/unix/z_asio.c:1101302
-/apr/apr/trunk/poll/unix/z_asio.c:1561356,1646891
+/apr/apr/trunk/poll/unix/z_asio.c:1561356,1646891,1666341
 /apr/apr-util/branches/1.4.x/poll/unix/z_asio.c:1211219,1211223