From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ua1-x92a.google.com (mail-ua1-x92a.google.com [IPv6:2607:f8b0:4864:20::92a]) by sourceware.org (Postfix) with ESMTPS id ADD9F3858425 for ; Thu, 3 Feb 2022 20:53:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org ADD9F3858425 Received: by mail-ua1-x92a.google.com with SMTP id w21so7455972uan.7 for ; Thu, 03 Feb 2022 12:53:04 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:from:to:references:in-reply-to :content-transfer-encoding; bh=VCNWGIQ32w50X+J/dQ+v8V2U1pPRnRlWph49vUbhHlE=; b=nNVIpQxnbSoEm8Yft9hSPMq+S0UOWMDEmhYLNfMy9RC3YSYr/UqyQs5HLufjGLdsZk PIbXhVQZ16zwUQV8JtVXR/gVv9h1xeICFDyVKc1145LpfhPfwzDLZ4eQTOWaxzFa6jA7 C+fD6KMMTl6xGg8Q+0ljAWUhvF2Ik31bvvvOkgkIzB+MNegNcVAbc7OgobJ/Bu3bxidy zxkIjb3prwmp/Vjz+4OqOBu7mipqbvHYR8kokh8Z5cugGqP9bzpZNCvtjBa3lLPgjh7x Ad+/B5+7zPQn2x1XC9WliuohbK9cA7cs92AZ9kt9jb4JTw4CmOfo0JCMeuz4sS1x7oET XNBw== X-Gm-Message-State: AOAM530tSol1m4Zco4any/9OrrOYN7Kjw0jHFqVkdoEQMXpC588suC+L rATsuFjhXaNgGo3fCWCUWY4TDx+jNs3B9w== X-Google-Smtp-Source: ABdhPJxNWWejTSyjnixNFiYsapmXX5VRDhDyqsOgos8wMQjwDxzyO04o8JM/3Ly/oC3TXpUfGJH6mg== X-Received: by 2002:a67:f5c4:: with SMTP id t4mr15069399vso.27.1643921584025; Thu, 03 Feb 2022 12:53:04 -0800 (PST) Received: from ?IPV6:2804:431:c7ca:709a:22aa:9542:591f:6eb9? ([2804:431:c7ca:709a:22aa:9542:591f:6eb9]) by smtp.gmail.com with ESMTPSA id s11sm6791358vke.47.2022.02.03.12.53.02 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 03 Feb 2022 12:53:03 -0800 (PST) Message-ID: Date: Thu, 3 Feb 2022 17:53:01 -0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.1 Subject: Re: [PATCH v2 3/3] inet: Return EAI_MEMORY when nrl_domainname() fails to allocate memory Content-Language: en-US From: Adhemerval Zanella To: libc-alpha@sourceware.org References: <20211210110733.1499984-1-adhemerval.zanella@linaro.org> <20211210110733.1499984-4-adhemerval.zanella@linaro.org> In-Reply-To: <20211210110733.1499984-4-adhemerval.zanella@linaro.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 03 Feb 2022 20:53:06 -0000 Ping. On 10/12/2021 08:07, Adhemerval Zanella wrote: > It aligns NI_NOFQDN with default behavior for getnameinfo(). > > Checked on x86_64-linux-gnu. > --- > inet/getnameinfo.c | 140 +++++++++++++++++++++++---------------------- > 1 file changed, 72 insertions(+), 68 deletions(-) > > diff --git a/inet/getnameinfo.c b/inet/getnameinfo.c > index 2d2397e7dc..acf1538a37 100644 > --- a/inet/getnameinfo.c > +++ b/inet/getnameinfo.c > @@ -83,94 +83,95 @@ libc_freeres_ptr (static char *domain); > now ignored. */ > #define DEPRECATED_NI_IDN 192 > > -static void > +static bool > nrl_domainname_core (struct scratch_buffer *tmpbuf) > { > char *c; > struct hostent *h, th; > int herror; > > - while (__gethostbyname_r ("localhost", &th, > - tmpbuf->data, tmpbuf->length, > + while (__gethostbyname_r ("localhost", &th, tmpbuf->data, tmpbuf->length, > &h, &herror)) > { > if (herror == NETDB_INTERNAL && errno == ERANGE) > { > if (!scratch_buffer_grow (tmpbuf)) > - return; > + return false; > } > else > break; > } > > if (h != NULL && (c = strchr (h->h_name, '.')) != NULL) > - domain = __strdup (++c); > - else > { > - /* The name contains no domain information. Use the name > - now to get more information. */ > - while (__gethostname (tmpbuf->data, tmpbuf->length)) > - if (!scratch_buffer_grow (tmpbuf)) > - return; > - > - if ((c = strchr (tmpbuf->data, '.')) != NULL) > - domain = __strdup (++c); > - else > - { > - /* We need to preserve the hostname. */ > - size_t hstnamelen = strlen (tmpbuf->data) + 1; > - while (__gethostbyname_r (tmpbuf->data, &th, > - tmpbuf->data + hstnamelen, > - tmpbuf->length - hstnamelen, > - &h, &herror)) > - { > - if (herror == NETDB_INTERNAL && errno == ERANGE) > - { > - if (!scratch_buffer_grow_preserve (tmpbuf)) > - return; > - } > - else > - break; > - } > + domain = __strdup (++c); > + return domain != NULL; > + } > > - if (h != NULL && (c = strchr(h->h_name, '.')) != NULL) > - domain = __strdup (++c); > - else > - { > - struct in_addr in_addr; > + /* The name contains no domain information. Use the name > + now to get more information. */ > + while (__gethostname (tmpbuf->data, tmpbuf->length)) > + if (!scratch_buffer_grow (tmpbuf)) > + return false; > > - in_addr.s_addr = htonl (INADDR_LOOPBACK); > + if ((c = strchr (tmpbuf->data, '.')) != NULL) > + { > + domain = __strdup (++c); > + return domain != NULL; > + } > > - while (__gethostbyaddr_r ((const char *) &in_addr, > - sizeof (struct in_addr), > - AF_INET, &th, > - tmpbuf->data, > - tmpbuf->length, > - &h, &herror)) > - { > - if (herror == NETDB_INTERNAL && errno == ERANGE) > - { > - if (!scratch_buffer_grow (tmpbuf)) > - return; > - } > - else > - break; > - } > + /* We need to preserve the hostname. */ > + size_t hstnamelen = strlen (tmpbuf->data) + 1; > + while (__gethostbyname_r (tmpbuf->data, &th, tmpbuf->data + hstnamelen, > + tmpbuf->length - hstnamelen, &h, &herror)) > + { > + if (herror == NETDB_INTERNAL && errno == ERANGE) > + { > + if (!scratch_buffer_grow_preserve (tmpbuf)) > + return false; > + } > + else > + break; > + } > > - if (h != NULL && (c = strchr (h->h_name, '.')) != NULL) > - domain = __strdup (++c); > - } > + if (h != NULL && (c = strchr(h->h_name, '.')) != NULL) > + { > + domain = __strdup (++c); > + return domain != NULL; > + } > + > + struct in_addr in_addr = { .s_addr = htonl (INADDR_LOOPBACK) }; > + > + while (__gethostbyaddr_r ((const char *) &in_addr, sizeof (struct in_addr), > + AF_INET, &th, tmpbuf->data, tmpbuf->length, &h, > + &herror)) > + { > + if (herror == NETDB_INTERNAL && errno == ERANGE) > + { > + if (!scratch_buffer_grow (tmpbuf)) > + return false; > } > + else > + break; > + } > + > + if (h != NULL && (c = strchr (h->h_name, '.')) != NULL) > + { > + domain = __strdup (++c); > + return domain != NULL; > } > + return true; > } > > -static char * > +static bool > nrl_domainname (void) > { > static int not_first; > > if (__glibc_likely (atomic_load_acquire (¬_first) != 0)) > - return domain; > + return true; > + > + int r = true; > > __libc_lock_define_initialized (static, lock); > __libc_lock_lock (lock); > @@ -180,16 +181,15 @@ nrl_domainname (void) > struct scratch_buffer tmpbuf; > scratch_buffer_init (&tmpbuf); > > - nrl_domainname_core (&tmpbuf); > + if ((r = nrl_domainname_core (&tmpbuf))) > + atomic_store_release (¬_first, 1); > > scratch_buffer_free (&tmpbuf); > - > - atomic_store_release (¬_first, 1); > } > > __libc_lock_unlock (lock); > > - return domain; > + return r; > }; > > /* Copy a string to a destination buffer with length checking. Return > @@ -285,13 +285,17 @@ gni_host_inet_name (struct scratch_buffer *tmpbuf, > > if (h) > { > - char *c; > - if ((flags & NI_NOFQDN) > - && (c = nrl_domainname ()) > - && (c = strstr (h->h_name, c)) > - && (c != h->h_name) && (*(--c) == '.')) > - /* Terminate the string after the prefix. */ > - *c = '\0'; > + if (flags & NI_NOFQDN) > + { > + if (!nrl_domainname ()) > + return EAI_MEMORY; > + > + char *c = domain; > + if (c != NULL && (c = strstr (h->h_name, c)) > + && (c != h->h_name) && (*(--c) == '.')) > + /* Terminate the string after the prefix. */ > + *c = '\0'; > + } > > /* If requested, convert from the IDN format. */ > bool do_idn = flags & NI_IDN;