$OpenBSD: patch-lib_socket_c,v 1.1.1.1 2019/12/31 11:35:55 ajacoutot Exp $

smb2_connect_share_async: don't return ENOMEM if connect fails.

Index: lib/socket.c
--- lib/socket.c.orig
+++ lib/socket.c
@@ -579,19 +579,19 @@ smb2_connect_async(struct smb2_context *smb2, const ch
         struct addrinfo *ai = NULL;
         struct sockaddr_storage ss;
         socklen_t socksize;
-        int family;
+        int family, err;
 
         if (smb2->fd != -1) {
                 smb2_set_error(smb2, "Trying to connect but already "
                                "connected.");
-                return -1;
+                return -EINVAL;
         }
 
         addr = strdup(server);
         if (addr == NULL) {
                 smb2_set_error(smb2, "Out-of-memory: "
                                "Failed to strdup server address.");
-                return -1;
+                return -ENOMEM;
         }
         host = addr;
         port = host;
@@ -606,7 +606,7 @@ smb2_connect_async(struct smb2_context *smb2, const ch
                         free(addr);
                         smb2_set_error(smb2, "Invalid address:%s  "
                                 "Missing ']' in IPv6 address", server);
-                        return -1;
+                        return -EINVAL;
                 }
                 *str = 0;
                 port = str + 1;
@@ -620,11 +620,33 @@ smb2_connect_async(struct smb2_context *smb2, const ch
         }
 
         /* is it a hostname ? */
-        if (getaddrinfo(host, port, NULL, &ai) != 0) {
+        err = getaddrinfo(host, port, NULL, &ai);
+        if (err != 0) {
                 free(addr);
                 smb2_set_error(smb2, "Invalid address:%s  "
                                "Can not resolv into IPv4/v6.", server);
-                return -1;
+                switch (err) {
+                    case EAI_AGAIN:
+                        return -EAGAIN;
+                    case EAI_NONAME:
+#if EAI_NODATA != EAI_NONAME /* Equal in MSCV */
+                    case EAI_NODATA:
+#endif
+                    case EAI_SERVICE:
+                    case EAI_FAIL:
+#ifdef EAI_ADDRFAMILY /* Not available in MSVC */
+                    case EAI_ADDRFAMILY:
+#endif
+                        return -EIO;
+                    case EAI_MEMORY:
+                        return -ENOMEM;
+#ifdef EAI_SYSTEM /* Not available in MSVC */
+                    case EAI_SYSTEM:
+                        return -errno;
+#endif
+                    default:
+                        return -EINVAL;
+                }
         }
         free(addr);
 
@@ -651,7 +673,7 @@ smb2_connect_async(struct smb2_context *smb2, const ch
                                 "Only IPv4/IPv6 supported so far.",
                                 ai->ai_family);
                 freeaddrinfo(ai);
-                return -1;
+                return -EINVAL;
 
         }
         family = ai->ai_family;
@@ -665,7 +687,7 @@ smb2_connect_async(struct smb2_context *smb2, const ch
 	if (smb2->fd == -1) {
 		smb2_set_error(smb2, "Failed to open smb2 socket. "
                                "Errno:%s(%d).", strerror(errno), errno);
-		return -1;
+		return -EIO;
 	}
 
 	set_nonblocking(smb2->fd);
@@ -681,7 +703,7 @@ smb2_connect_async(struct smb2_context *smb2, const ch
 			"%s(%d)", strerror(errno), errno);
 		close(smb2->fd);
 		smb2->fd = -1;
-		return -1;
+		return -EIO;
 	}
 
         return 0;
