Commit 81ce7cc8 authored by Tomas Mraz's avatar Tomas Mraz
Browse files

BIO_lookup_ex: Retry with AI_ADDRCONFIG cleared if getaddrinfo fails



The lookup for ::1 with getaddrinfo() might return error even if
the ::1 would work if AI_ADDRCONFIG flag is used.

Fixes: #9053

Reviewed-by: default avatarRichard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/9108)

(cherry picked from commit 3f91ede9aea70774d9b5d509bc76d484ebaff6aa)
parent 247b8a0b
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -696,6 +696,7 @@ int BIO_lookup_ex(const char *host, const char *service, int lookup_type,
        /* Note that |res| SHOULD be a 'struct addrinfo **' thanks to
         * macro magic in bio_lcl.h
         */
      retry:
        switch ((gai_ret = getaddrinfo(host, service, &hints, res))) {
# ifdef EAI_SYSTEM
        case EAI_SYSTEM:
@@ -706,6 +707,19 @@ int BIO_lookup_ex(const char *host, const char *service, int lookup_type,
        case 0:
            ret = 1;             /* Success */
            break;
# if (defined(EAI_FAMILY) || defined(EAI_ADDRFAMILY)) && defined(AI_ADDRCONFIG)
#  ifdef EAI_FAMILY
        case EAI_FAMILY:
#  endif
#  ifdef EAI_ADDRFAMILY
        case EAI_ADDRFAMILY:
#  endif
            if (hints.ai_flags & AI_ADDRCONFIG) {
                hints.ai_flags &= ~AI_ADDRCONFIG;
                goto retry;
            }
            /* fall through */
# endif
        default:
            BIOerr(BIO_F_BIO_LOOKUP_EX, ERR_R_SYS_LIB);
            ERR_add_error_data(1, gai_strerror(gai_ret));