You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by bo...@apache.org on 2009/11/01 07:01:01 UTC

svn commit: r831641 - in /apr/apr/trunk: file_io/unix/open.c network_io/unix/sockets.c

Author: bojan
Date: Sun Nov  1 06:01:01 2009
New Revision: 831641

URL: http://svn.apache.org/viewvc?rev=831641&view=rev
Log:
Set file/socket descriptor to -1 before close(), so that there is no chance
of returning an already closed FD from apr_os_file_get()/apr_os_sock_get().

Modified:
    apr/apr/trunk/file_io/unix/open.c
    apr/apr/trunk/network_io/unix/sockets.c

Modified: apr/apr/trunk/file_io/unix/open.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/file_io/unix/open.c?rev=831641&r1=831640&r2=831641&view=diff
==============================================================================
--- apr/apr/trunk/file_io/unix/open.c (original)
+++ apr/apr/trunk/file_io/unix/open.c Sun Nov  1 06:01:01 2009
@@ -29,10 +29,14 @@
 static apr_status_t file_cleanup(apr_file_t *file, int is_child)
 {
     apr_status_t rv = APR_SUCCESS;
+    int fd = file->filedes;
 
-    if (close(file->filedes) == 0) {
-        file->filedes = -1;
+    /* Set file descriptor to -1 before close(), so that there is no
+     * chance of returning an already closed FD from apr_os_file_get().
+     */
+    file->filedes = -1;
 
+    if (close(fd) == 0) {
         /* Only the parent process should delete the file! */
         if (!is_child && (file->flags & APR_DELONCLOSE)) {
             unlink(file->fname);
@@ -44,6 +48,9 @@
 #endif
     }
     else {
+        /* Restore, close() was not successful. */
+        file->filedes = fd;
+
         /* Are there any error conditions other than EINTR or EBADF? */
         rv = errno;
     }

Modified: apr/apr/trunk/network_io/unix/sockets.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/network_io/unix/sockets.c?rev=831641&r1=831640&r2=831641&view=diff
==============================================================================
--- apr/apr/trunk/network_io/unix/sockets.c (original)
+++ apr/apr/trunk/network_io/unix/sockets.c Sun Nov  1 06:01:01 2009
@@ -38,6 +38,12 @@
 static apr_status_t socket_cleanup(void *sock)
 {
     apr_socket_t *thesocket = sock;
+    int sd = thesocket->socketdes;
+
+    /* Set socket descriptor to -1 before close(), so that there is no
+     * chance of returning an already closed FD from apr_os_sock_get().
+     */
+    thesocket->socketdes = -1;
 
 #if APR_HAVE_SOCKADDR_UN
     if (thesocket->bound && thesocket->local_addr->family == APR_UNIX) {
@@ -45,11 +51,13 @@
         unlink(thesocket->local_addr->hostname);
     }
 #endif        
-    if (close(thesocket->socketdes) == 0) {
-        thesocket->socketdes = -1;
+    if (close(sd) == 0) {
         return APR_SUCCESS;
     }
     else {
+        /* Restore, close() was not successful. */
+        thesocket->socketdes = sd;
+
         return errno;
     }
 }