29a9aee
diff -up cups-2.2.0/cups/http-addrlist.c.cpu-hammering cups-2.2.0/cups/http-addrlist.c
523b1be
--- cups-2.2.0/cups/http-addrlist.c.cpu-hammering	2016-10-04 18:54:55.697172885 +0200
523b1be
+++ cups-2.2.0/cups/http-addrlist.c	2016-10-04 18:56:41.038252500 +0200
29a9aee
@@ -304,6 +304,8 @@ httpAddrConnect2(
29a9aee
 
29a9aee
     if (result > 0)
29a9aee
     {
29a9aee
+      http_addrlist_t *connaddr = NULL;
29a9aee
+
29a9aee
       for (i = 0; i < nfds; i ++)
29a9aee
       {
29a9aee
 #  ifdef HAVE_POLL
29a9aee
@@ -314,7 +316,7 @@ httpAddrConnect2(
29a9aee
 #  endif /* HAVE_POLL */
29a9aee
 	{
29a9aee
 	  *sock    = fds[i];
29a9aee
-	  addrlist = addrs[i];
29a9aee
+	  connaddr = addrs[i];
29a9aee
 
29a9aee
 #  ifdef DEBUG
29a9aee
 	  len   = sizeof(peer);
29a9aee
@@ -322,11 +324,29 @@ httpAddrConnect2(
29a9aee
 	    DEBUG_printf(("1httpAddrConnect2: Connected to %s:%d...", httpAddrString(&peer, temp, sizeof(temp)), httpAddrPort(&peer)));
29a9aee
 #  endif /* DEBUG */
29a9aee
 	}
29a9aee
-	else
29a9aee
+# ifdef HAVE_POLL
29a9aee
+	else if (pfds[i].revents & (POLLERR | POLLHUP))
29a9aee
+# else
523b1be
+	else if (FD_ISSET(fds[i], &error))
29a9aee
+# endif /* HAVE_POLL */
29a9aee
+        {
29a9aee
+         /*
29a9aee
+          * Error on socket, remove from the "pool"...
29a9aee
+          */
29a9aee
+
29a9aee
 	  httpAddrClose(NULL, fds[i]);
29a9aee
+          nfds --;
29a9aee
+          if (i < nfds)
29a9aee
+          {
29a9aee
+            memmove(fds + i, fds + i + 1, (size_t)(nfds - i) * (sizeof(fds[0])));
29a9aee
+            memmove(addrs + i, addrs + i + 1, (size_t)(nfds - i) * (sizeof(addrs[0])));
29a9aee
+          }
29a9aee
+          i --;
29a9aee
+        }
29a9aee
       }
29a9aee
 
29a9aee
-      return (addrlist);
29a9aee
+      if (connaddr)
29a9aee
+        return (connaddr);
29a9aee
     }
29a9aee
 #endif /* O_NONBLOCK */
29a9aee