Date: Wed, 24 Aug 2016 12:53:27 -0700 From: Bryan Drewery <bdrewery@FreeBSD.org> To: Ed Schouten <ed@nuxi.nl> Cc: svn-src-head@freebsd.org, jilles@freebsd.org, svn-src-all@freebsd.org, src-committers <src-committers@freebsd.org>, Ed Schouten <ed@freebsd.org> Subject: Re: svn commit: r303988 - head/lib/libc/gen Message-ID: <d606b841-dda9-488e-ab35-a9289668d2c4@FreeBSD.org> In-Reply-To: <CABh_MKm_YQ3bJD19Cz1vBCGr=YxuzctXV6F1iqMASkSx-PsVMw@mail.gmail.com> References: <201608120703.u7C73whf007189@repo.freebsd.org> <d23b295a-1902-193c-dee6-ba49ebd77280@FreeBSD.org> <9ae1c2eb-02ad-b8fe-6aff-7e17e955607a@FreeBSD.org> <CABh_MKkxD3OTF7VO9Rq_eZyqHPN%2BxVws3q3dsH2R3DfZ343kFw@mail.gmail.com> <2632f5f8-d765-3df7-74d7-da878eb4b7a8@FreeBSD.org> <CABh_MKm_YQ3bJD19Cz1vBCGr=YxuzctXV6F1iqMASkSx-PsVMw@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --tfpodA24dFOTD595EJagi3dgWNqeXgijB Content-Type: multipart/mixed; boundary="OoWae0Ulc2BB2e7I6axj5I2fw8mQ9HkdA" From: Bryan Drewery <bdrewery@FreeBSD.org> To: Ed Schouten <ed@nuxi.nl> Cc: svn-src-head@freebsd.org, jilles@freebsd.org, svn-src-all@freebsd.org, src-committers <src-committers@freebsd.org>, Ed Schouten <ed@freebsd.org> Message-ID: <d606b841-dda9-488e-ab35-a9289668d2c4@FreeBSD.org> Subject: Re: svn commit: r303988 - head/lib/libc/gen References: <201608120703.u7C73whf007189@repo.freebsd.org> <d23b295a-1902-193c-dee6-ba49ebd77280@FreeBSD.org> <9ae1c2eb-02ad-b8fe-6aff-7e17e955607a@FreeBSD.org> <CABh_MKkxD3OTF7VO9Rq_eZyqHPN+xVws3q3dsH2R3DfZ343kFw@mail.gmail.com> <2632f5f8-d765-3df7-74d7-da878eb4b7a8@FreeBSD.org> <CABh_MKm_YQ3bJD19Cz1vBCGr=YxuzctXV6F1iqMASkSx-PsVMw@mail.gmail.com> In-Reply-To: <CABh_MKm_YQ3bJD19Cz1vBCGr=YxuzctXV6F1iqMASkSx-PsVMw@mail.gmail.com> --OoWae0Ulc2BB2e7I6axj5I2fw8mQ9HkdA Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable On 8/24/16 12:49 PM, Ed Schouten wrote: > 2016-08-24 20:30 GMT+02:00 Bryan Drewery <bdrewery@freebsd.org>: >> > That would only fix stable/11, stable/10, stable/9, releng/11.0. >> > >> > It won't fix releng/10.3, releng/10.2, releng/10.1, releng/9.3, etc.= =2E. >> > without an EN. >> > >> > It won't fix stable/11 - 1, stable/10 - 1, etc. >> > >> > It will never fix releng/8.4 (unsupported releases) since so@ won't = EN >> > to those. People do sometimes need to build these older releases st= ill. >> > >> > It creates a line in the sand where we can never build checkouts old= er >> > than where the fix was at. So I don't think it is the appropriate f= ix. > Good point! >=20 > Just for the record: Bryan and I just discussed this matter in more > detail on IRC. We came up with a workaround that should be pretty > good. >=20 > Attached is a patch for <libgen.h> that adds some extra logic, so that > any calls to basename() and dirname() will expand to calls to > __old_basename() and __old_dirname(). Using __sym_compat(), these will > cause the compiler to generate calls to basename@FBSD_1.0 and > dirname@FBSD_1.0. >=20 > According to Bryan, this fixes the problems he was experiencing. >=20 > -- Ed Schouten <ed@nuxi.nl> Nuxi, 's-Hertogenbosch, the Netherlands > KvK-nr.: 62051717 >=20 >=20 > dirname-basename-xinstall.diff >=20 >=20 > Index: include/libgen.h > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- include/libgen.h (revision 304750) > +++ include/libgen.h (working copy) > @@ -39,4 +39,26 @@ > char *dirname(char *); > __END_DECLS > =20 > +/* > + * In FreeBSD 12, the prototype of basename() and dirname() was modifi= ed > + * to comply to POSIX. These functions may now modify their input. > + * Unfortunately, our copy of xinstall(8) shipped with previous versio= ns > + * of FreeBSD is built using the host headers and libc during the > + * bootstrapping phase and depends on the old behavior. > + * > + * Apply a workaround where we explicitly link against basename@FBSD_1= =2E0 > + * and dirname@FBSD_1.0 in case these functions are called on constant= > + * strings, instead of making the build fail. > + */ > +#if defined(__generic) && !defined(__cplusplus) > +__BEGIN_DECLS > +char *__old_basename(const char *); > +char *__old_dirname(const char *); > +__END_DECLS > +__sym_compat(basename, __old_basename, FBSD_1.0); > +__sym_compat(dirname, __old_dirname, FBSD_1.0); > +#define basename(x) __generic(x, const char *, __old_basename, basenam= e)(x) > +#define dirname(x) __generic(x, const char *, __old_dirname, dirname)(= x) > +#endif Personally I really like this in general as an API-compat pattern. I know Ed wanted to deprecate and remove the old dirname(3)/basename(3), but it was quite painful downstream to convert our checkout to use the new prototypes. It spanned "only" 19 files, but it took 2 days of build-and-fix iterations to fix. We still get the benefit of thread-safe basename(3)/dirname(3) when using the proper prototype. Is it possible to cause the use of these old prototypes to print a warning and note that they are deprecated/unsafe? --=20 Regards, Bryan Drewery --OoWae0Ulc2BB2e7I6axj5I2fw8mQ9HkdA-- --tfpodA24dFOTD595EJagi3dgWNqeXgijB Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Comment: GPGTools - https://gpgtools.org iQEcBAEBCgAGBQJXvfs4AAoJEDXXcbtuRpfPA0MH/Ruegw0YBxd1Z8IXgjrhjEo1 NF0oNkXs1qP6RbXCfe/5R+HTutiIBv2SxkYi1kJM4eti2qrUOKFBLzXOCBNZ4uY0 KJamAYUyAqvmYSkjHMKUhE4x9RhHJxosvDiXUcM+topX/KZJUkJdsc2HfOQgvKh9 WwctbaVPMutgcx1JhkRgONXDACu5zaIptWHxD5Lx0UlrRe1hGhx76IfzT4YeYvl+ 27NtYOBIbilNEvxLo0oDfSMjpGD1mEMjNbuU8ubJ0uV/pclKV5l9D8fhSZdvowJ6 /bLCmL6bQBCiJbCPgtdIk+VGy6yN1/j2M2RIlFqBWnEuOAZ3aZhkSNbbtSDLKSg= =2ici -----END PGP SIGNATURE----- --tfpodA24dFOTD595EJagi3dgWNqeXgijB--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?d606b841-dda9-488e-ab35-a9289668d2c4>