]> granicus.if.org Git - apache/commitdiff
Experimental patch that may mitigate (but not eliminate) the errors in
authorWilliam A. Rowe Jr <wrowe@apache.org>
Wed, 17 Apr 2002 16:39:12 +0000 (16:39 +0000)
committerWilliam A. Rowe Jr <wrowe@apache.org>
Wed, 17 Apr 2002 16:39:12 +0000 (16:39 +0000)
  [crit] (32538)An operation was attempted on something that is not a socket.
       : Parent: WSADuplicateSocket failed for socket ...
  if the particular stacks' bug is that it won't associate a handle as a
  socket if that handle was duped with DuplicateHandle().  Other bugs with
  unimplemented WSADuplicateSocket are not addressed by this patch.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@94682 13f79535-47bb-0310-9956-ffa450edef68

server/mpm/winnt/mpm_winnt.c

index 4ece337118e071bf1dbb6ed9cee519647921893f..34ca240e5452ab6c9942a389432c64eb3055921d 100644 (file)
@@ -527,15 +527,32 @@ static int set_listeners_noninheritable(apr_pool_t *p)
 
     for (lr = ap_listeners; lr; lr = lr->next) {
         apr_os_sock_get(&nsd,lr->sd);
-        if (!DuplicateHandle(hProcess, (HANDLE) nsd, hProcess, &dup, 
-                             0, FALSE, DUPLICATE_SAME_ACCESS)) {
-            ap_log_error(APLOG_MARK, APLOG_ERR, apr_get_os_error(), ap_server_conf,
-                         "set_listeners_noninheritable: DuplicateHandle failed.");
+        if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
+            if (!DuplicateHandle(hProcess, (HANDLE) nsd, hProcess, &dup, 
+                                 0, FALSE, DUPLICATE_SAME_ACCESS)) {
+                ap_log_error(APLOG_MARK, APLOG_ERR, apr_get_os_error(), ap_server_conf,
+                             "set_listeners_noninheritable: DuplicateHandle failed.");
+            }
+            else {
+                closesocket(nsd);
+                nsd = (SOCKET) dup;
+                apr_os_sock_put(&lr->sd, &nsd, p);
+            }
         }
         else {
-            closesocket(nsd);
-            nsd = (SOCKET) dup;
-            apr_os_sock_put(&lr->sd, &nsd, p);
+            /* A different approach.  Many users report errors such as 
+             * (32538)An operation was attempted on something that is not 
+             * a socket.  : Parent: WSADuplicateSocket failed...
+             *
+             * This appears that the duplicated handle is no longer recognized
+             * as a socket handle.  SetHandleInformation should overcome that
+             * problem by not altering the handle identifier.  But this won't
+             * work on 9x - it's unsupported.
+             */
+            if (!SetHandleInformation(nsd, HANDLE_FLAG_INHERIT, 0)) {
+                ap_log_error(APLOG_MARK, APLOG_ERR, apr_get_os_error(), ap_server_conf,
+                             "set_listeners_noninheritable: SetHandleInformation failed.");
+            }
         }
     }