From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.3 required=5.0 tests=MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 4447 invoked from network); 4 Aug 2020 03:02:17 -0000 Received: from mother.openwall.net (195.42.179.200) by inbox.vuxu.org with ESMTPUTF8; 4 Aug 2020 03:02:17 -0000 Received: (qmail 19840 invoked by uid 550); 4 Aug 2020 03:02:15 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 19817 invoked from network); 4 Aug 2020 03:02:14 -0000 Date: Mon, 3 Aug 2020 23:02:01 -0400 From: Rich Felker To: musl@lists.openwall.com Message-ID: <20200804030201.GG6949@brightrain.aerifal.cx> References: <20200803205529.2232-1-ericonr@disroot.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20200803205529.2232-1-ericonr@disroot.org> User-Agent: Mutt/1.5.21 (2010-09-15) Subject: Re: [musl] [PATCH] extend gethostid beyond a stub On Mon, Aug 03, 2020 at 05:55:29PM -0300, Érico Rolim wrote: > From: Érico Rolim > > Implement part of the glibc behavior, where the 32-bit identifier stored > in /etc/hostid, if the file exists, is returned. If this file doesn't > contain at least 32 bits or can't be opened for some reason, return 0. > --- > src/misc/gethostid.c | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/src/misc/gethostid.c b/src/misc/gethostid.c > index 25bb35db..e2e98b99 100644 > --- a/src/misc/gethostid.c > +++ b/src/misc/gethostid.c > @@ -1,6 +1,19 @@ > #include > +#include > > long gethostid() > { > - return 0; > + FILE *f; > + unsigned char hostid[4]; > + long rv = 0; > + > + f = fopen("/etc/hostid", "reb"); > + if (f) { > + if (fread(hostid, 1, 4, f) == 4) { > + rv = (hostid[3] << 24) | (hostid[2] << 16) | (hostid[1] << 8) | hostid[0]; > + } > + fclose(f); > + } > + > + return rv; > } > -- > 2.28.0 I somewhat dislike the use of stdio here, but this is something of a junk function that's not really worth writing read() retry loop, etc. hostid[3]<<24 is UB due to integer overflow (the promoted type is int, a signed type). This could be fixed via promotion to unsigned before the shift, but rather than constructing the value manually like this I'd probably lean towards reading it into a uint32_t object x then returning ntohl(x). It's unfortunate that fopen can fail for spurious reasons like ENOMEM or EMFILE/ENFILE, and that gethostid has no way of reporting this error rather than returning the wrong id, but this seems like a fundamental design bug in the interface and not something we can fix, at least not while using the existing design with data in a file. I think it could be avoided by using readlink() and storing the id in the contents of a symlink, which should have no spurious failure modes, but I'm not really keen on inventing a new convention for this fundamentally-broken function. So overall this looks pretty good. I'll revisit it after release and see if anyone else has thoughts on it in the mean time. Rich