From owner-svn-src-head@freebsd.org Wed Aug 12 16:10:40 2020 Return-Path: Delivered-To: svn-src-head@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 51F6A3A4CA4; Wed, 12 Aug 2020 16:10:40 +0000 (UTC) (envelope-from freebsd@gndrsh.dnsmgr.net) Received: from gndrsh.dnsmgr.net (br1.CN84in.dnsmgr.net [69.59.192.140]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 4BRZRz6zwnz45gb; Wed, 12 Aug 2020 16:10:39 +0000 (UTC) (envelope-from freebsd@gndrsh.dnsmgr.net) Received: from gndrsh.dnsmgr.net (localhost [127.0.0.1]) by gndrsh.dnsmgr.net (8.13.3/8.13.3) with ESMTP id 07CGAcXL038792; Wed, 12 Aug 2020 09:10:38 -0700 (PDT) (envelope-from freebsd@gndrsh.dnsmgr.net) Received: (from freebsd@localhost) by gndrsh.dnsmgr.net (8.13.3/8.13.3/Submit) id 07CGAcm0038791; Wed, 12 Aug 2020 09:10:38 -0700 (PDT) (envelope-from freebsd) From: "Rodney W. Grimes" Message-Id: <202008121610.07CGAcm0038791@gndrsh.dnsmgr.net> Subject: Re: svn commit: r364166 - head/usr.sbin/crunch/crunchgen In-Reply-To: <202008121549.07CFn6ED065712@repo.freebsd.org> To: Alex Richardson Date: Wed, 12 Aug 2020 09:10:38 -0700 (PDT) CC: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Reply-To: rgrimes@freebsd.org X-Mailer: ELM [version 2.4ME+ PL121h (25)] MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII X-Rspamd-Queue-Id: 4BRZRz6zwnz45gb X-Spamd-Bar: ---- Authentication-Results: mx1.freebsd.org; none X-Spamd-Result: default: False [-4.00 / 15.00]; ASN(0.00)[asn:13868, ipnet:69.59.192.0/19, country:US]; REPLY(-4.00)[] X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 12 Aug 2020 16:10:40 -0000 [ Charset UTF-8 unsupported, converting... ] > Author: arichardson > Date: Wed Aug 12 15:49:06 2020 > New Revision: 364166 > URL: https://svnweb.freebsd.org/changeset/base/364166 > > Log: > Fix crunchgen usage of mkstemp() > > On Glibc systems mkstemp can only be used once with the same template > string since it will be modified in-place and no longer contain any 'X' chars. > It is fine to reuse the same file here but we need to be explicit and use > open() instead of mkstemp() on the second use. > > While touching this file also avoid a hardcoded /bin/pwd since that may not > work when building on non-FreeBSD systems. This may cause some grief, as now pwd may use a shell builtin and often shell builtin's return a cwd that is not a true full path, ie it may contain symlink compontents in the path. /bin/sh: # cd /tmp/b # /bin/pwd /tmp/a # pwd /tmp/b # ls -lag /tmp/? lrwxr-xr-x 1 root wheel 1 Aug 12 16:06 /tmp/b -> a /tmp/a: total 17 drwxr-xr-x 2 root wheel 2 Aug 12 16:06 . drwxrwxrwt 18 root wheel 248 Aug 12 16:06 .. > > Reviewed By: brooks > Differential Revision: https://reviews.freebsd.org/D25990 > > Modified: > head/usr.sbin/crunch/crunchgen/crunchgen.c > > Modified: head/usr.sbin/crunch/crunchgen/crunchgen.c > ============================================================================== > --- head/usr.sbin/crunch/crunchgen/crunchgen.c Wed Aug 12 14:45:31 2020 (r364165) > +++ head/usr.sbin/crunch/crunchgen/crunchgen.c Wed Aug 12 15:49:06 2020 (r364166) > @@ -39,10 +39,13 @@ __FBSDID("$FreeBSD$"); > > #include > #include > +#include > #include > +#include > #include > #include > #include > +#include > #include > > #define CRUNCH_VERSION "0.2" > @@ -91,6 +94,7 @@ prog_t *progs = NULL; > char confname[MAXPATHLEN], infilename[MAXPATHLEN]; > char outmkname[MAXPATHLEN], outcfname[MAXPATHLEN], execfname[MAXPATHLEN]; > char tempfname[MAXPATHLEN], cachename[MAXPATHLEN], curfilename[MAXPATHLEN]; > +bool tempfname_initialized = false; > char outhdrname[MAXPATHLEN] ; /* user-supplied header for *.mk */ > char *objprefix; /* where are the objects ? */ > char *path_make; > @@ -216,6 +220,7 @@ main(int argc, char **argv) > snprintf(cachename, sizeof(cachename), "%s.cache", confname); > snprintf(tempfname, sizeof(tempfname), "%s/crunchgen_%sXXXXXX", > getenv("TMPDIR") ? getenv("TMPDIR") : _PATH_TMP, confname); > + tempfname_initialized = false; > > parse_conf_file(); > if (list_mode) > @@ -648,8 +653,7 @@ fillin_program(prog_t *p) > > /* Determine the actual srcdir (maybe symlinked). */ > if (p->srcdir) { > - snprintf(line, MAXLINELEN, "cd %s && echo -n `/bin/pwd`", > - p->srcdir); > + snprintf(line, MAXLINELEN, "cd %s && pwd", p->srcdir); > f = popen(line,"r"); > if (!f) > errx(1, "Can't execute: %s\n", line); > @@ -721,14 +725,26 @@ fillin_program_objs(prog_t *p, char *path) > > /* discover the objs from the srcdir Makefile */ > > - if ((fd = mkstemp(tempfname)) == -1) { > - perror(tempfname); > - exit(1); > + /* > + * We reuse the same temporary file name for multiple objects. However, > + * some libc implementations (such as glibc) return EINVAL if there > + * are no XXXXX characters in the template. This happens after the > + * first call to mkstemp since the argument is modified in-place. > + * To avoid this error we use open() instead of mkstemp() after the > + * call to mkstemp(). > + */ > + if (tempfname_initialized) { > + if ((fd = open(tempfname, O_CREAT | O_EXCL | O_RDWR, 0600)) == -1) { > + err(EX_OSERR, "open(%s)", tempfname); > + } > + } else if ((fd = mkstemp(tempfname)) == -1) { > + err(EX_OSERR, "mkstemp(%s)", tempfname); > } > + tempfname_initialized = true; > if ((f = fdopen(fd, "w")) == NULL) { > - warn("%s", tempfname); > + warn("fdopen(%s)", tempfname); > goterror = 1; > - return; > + goto out; > } > if (p->objvar) > objvar = p->objvar; > @@ -763,14 +779,14 @@ fillin_program_objs(prog_t *p, char *path) > if ((f = popen(line, "r")) == NULL) { > warn("submake pipe"); > goterror = 1; > - return; > + goto out; > } > > while(fgets(line, MAXLINELEN, f)) { > if (strncmp(line, "OBJS= ", 6)) { > warnx("make error: %s", line); > goterror = 1; > - continue; > + goto out; > } > > cp = line + 6; > @@ -793,7 +809,7 @@ fillin_program_objs(prog_t *p, char *path) > warnx("make error: make returned %d", rc); > goterror = 1; > } > - > +out: > unlink(tempfname); > } > > -- Rod Grimes rgrimes@freebsd.org