From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 46623 invoked by alias); 26 Jun 2018 17:33:29 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 46608 invoked by uid 89); 26 Jun 2018 17:33:28 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.7 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mx1.redhat.com Subject: Re: [PATCH] gethostid (Linux variant): Switch to struct scratch_buffer [BZ #18023] To: Adhemerval Zanella , libc-alpha@sourceware.org References: <20180626154633.BC8B943994575@oldenburg.str.redhat.com> From: Florian Weimer Message-ID: Date: Tue, 26 Jun 2018 17:33:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------F29AC1C3481D433412901266" X-SW-Source: 2018-06/txt/msg00813.txt.bz2 This is a multi-part message in MIME format. --------------F29AC1C3481D433412901266 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-length: 883 On 06/26/2018 06:58 PM, Adhemerval Zanella wrote: >> + /* Determine the IP address of the host name. */ >> + struct scratch_buffer tmpbuf; >> + scratch_buffer_init (&tmpbuf); >> + while (true) >> + { >> + int ret = __gethostbyname_r (hostname, &hostbuf, >> + tmpbuf.data, tmpbuf.length, &hp, &herr); >> + if (ret == 0) >> + break; >> + else >> + { >> + /* Enlarge the buffer on ERANGE. */ >> + if (herr == NETDB_INTERNAL && errno == ERANGE) >> + { >> + if (!scratch_buffer_grow (&tmpbuf)) >> + return 0; >> + } >> + else >> + /* Other errors are a failure. Return an arbitrary value. */ > Shouldn' it call 'scratch_buffer_free' here for the case the buffer is > grown and a subsequent __gethostbyname_r results something different > than ERANGE (assuming it is possible)? Thanks, you are right. New patch attached. Florian --------------F29AC1C3481D433412901266 Content-Type: text/x-patch; name="gethostid.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="gethostid.patch" Content-length: 2963 Subject: [PATCH] gethostid (Linux variant): Switch to struct scratch_buffer [BZ #18023] To: libc-alpha@sourceware.org Previously, extend_alloca was used without alloca accounting, which could have been problematic with large NSS results. 2018-06-26 Florian Weimer [BZ #18023] * sysdeps/unix/sysv/linux/gethostid.c (gethostid): Use struct scratch_buffer instead of extend_alloca. Update comments. diff --git a/sysdeps/unix/sysv/linux/gethostid.c b/sysdeps/unix/sysv/linux/gethostid.c index 73c56e57e5..2e20f034dc 100644 --- a/sysdeps/unix/sysv/linux/gethostid.c +++ b/sysdeps/unix/sysv/linux/gethostid.c @@ -21,6 +21,7 @@ #include #include #include +#include #define HOSTIDFILE "/etc/hostid" @@ -63,13 +64,12 @@ sethostid (long int id) # include # include # include +# include long int gethostid (void) { char hostname[MAXHOSTNAMELEN + 1]; - size_t buflen; - char *buffer; struct hostent hostbuf, *hp; int32_t id; struct in_addr in; @@ -88,29 +88,43 @@ gethostid (void) return id; } - /* Getting from the file was not successful. An intelligent guess for - a unique number of a host is its IP address. Return this. */ + /* Getting from the file was not successful. An intelligent guess + for a unique number of a host is its IP address. To get the IP + address we need to know the host name. */ if (__gethostname (hostname, MAXHOSTNAMELEN) < 0 || hostname[0] == '\0') /* This also fails. Return and arbitrary value. */ return 0; - buflen = 1024; - buffer = __alloca (buflen); - - /* To get the IP address we need to know the host name. */ - while (__gethostbyname_r (hostname, &hostbuf, buffer, buflen, &hp, &herr) - != 0 - || hp == NULL) - if (herr != NETDB_INTERNAL || errno != ERANGE) - return 0; - else - /* Enlarge buffer. */ - buffer = extend_alloca (buffer, buflen, 2 * buflen); + /* Determine the IP address of the host name. */ + struct scratch_buffer tmpbuf; + scratch_buffer_init (&tmpbuf); + while (true) + { + int ret = __gethostbyname_r (hostname, &hostbuf, + tmpbuf.data, tmpbuf.length, &hp, &herr); + if (ret == 0) + break; + else + { + /* Enlarge the buffer on ERANGE. */ + if (herr == NETDB_INTERNAL && errno == ERANGE) + { + if (!scratch_buffer_grow (&tmpbuf)) + return 0; + } + /* Other errors are a failure. Return an arbitrary value. */ + else + { + scratch_buffer_free (&tmpbuf); + return 0; + } + } + } in.s_addr = 0; memcpy (&in, hp->h_addr, (int) sizeof (in) < hp->h_length ? (int) sizeof (in) : hp->h_length); - + scratch_buffer_free (&tmpbuf); /* For the return value to be not exactly the IP address we do some bit fiddling. */ return (int32_t) (in.s_addr << 16 | in.s_addr >> 16); --------------F29AC1C3481D433412901266--