Commit 8ab99435 authored by Tomas Mraz's avatar Tomas Mraz
Browse files

BIO_lookup_ex: Do not retry on EAI_MEMORY



We should not retry on EAI_MEMORY as that error is most probably
fatal and not depending on AI_ADDRCONFIG hint.

Also report the error from the first call if the second call fails
as that one would be most probably the more interesting one.

Reviewed-by: default avatarPaul Dale <paul.dale@oracle.com>
Reviewed-by: default avatarRichard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/9535)

(cherry picked from commit 91cb81d40a8102c3d8667629661be8d6937db82b)
parent 63be1415
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -675,7 +675,7 @@ int BIO_lookup_ex(const char *host, const char *service, int lookup_type,

    if (1) {
#ifdef AI_PASSIVE
        int gai_ret = 0;
        int gai_ret = 0, old_ret = 0;
        struct addrinfo hints;

        memset(&hints, 0, sizeof(hints));
@@ -703,6 +703,11 @@ int BIO_lookup_ex(const char *host, const char *service, int lookup_type,
            SYSerr(SYS_F_GETADDRINFO, get_last_socket_error());
            BIOerr(BIO_F_BIO_LOOKUP_EX, ERR_R_SYS_LIB);
            break;
# endif
# ifdef EAI_MEMORY
        case EAI_MEMORY:
            BIOerr(BIO_F_BIO_LOOKUP_EX, ERR_R_MALLOC_FAILURE);
            break;
# endif
        case 0:
            ret = 1;             /* Success */
@@ -712,11 +717,12 @@ int BIO_lookup_ex(const char *host, const char *service, int lookup_type,
            if (hints.ai_flags & AI_ADDRCONFIG) {
                hints.ai_flags &= ~AI_ADDRCONFIG;
                hints.ai_flags |= AI_NUMERICHOST;
                old_ret = gai_ret;
                goto retry;
            }
# endif
            BIOerr(BIO_F_BIO_LOOKUP_EX, ERR_R_SYS_LIB);
            ERR_add_error_data(1, gai_strerror(gai_ret));
            ERR_add_error_data(1, gai_strerror(old_ret ? old_ret : gai_ret));
            break;
        }
    } else {