This looks good. I'd just like to point out on-list that we shouldn't be patching away stpcpy everywhere, it is easy to introduce a bug in perfectly correct code by doing this (as happened in some cases with strlcpy patches in the ports tree), it's just that gettext is *very* commonly used and the linker warning adds a lot of noise to the build logs, so removing that noise is helpful here.
Another pair of eyes wouldn't hurt, but anyway it's OK with me. On 2012/07/11 00:12, Christian Weisgerber wrote: > The goal here is to get rid of these warnings that fill our build > logs: > > /usr/local/lib/libintl.so.6.0: warning: stpcpy() is dangerous GNU crap; don't > use it > > Note that this is only about libintl proper, not about the msg* > tools and their helper libraries. > > These patches need reviewing. I'm not confident that I got it all > right. > > > Index: Makefile > =================================================================== > RCS file: /cvs/ports/devel/gettext/Makefile,v > retrieving revision 1.55 > diff -u -p -r1.55 Makefile > --- Makefile 26 Jan 2012 22:08:26 -0000 1.55 > +++ Makefile 10 Jul 2012 22:10:40 -0000 > @@ -3,7 +3,7 @@ > COMMENT= GNU gettext > > DISTNAME= gettext-0.18.1 > -REVISION= 1 > +REVISION= 2 > SHARED_LIBS += intl 6.0 # .9.1 > SHARED_LIBS += asprintf 1.0 # .0.0 > SHARED_LIBS += gettextlib 3.0 # .0.0 > Index: distinfo > =================================================================== > RCS file: /cvs/ports/devel/gettext/distinfo,v > retrieving revision 1.8 > diff -u -p -r1.8 distinfo > --- distinfo 3 Jul 2010 03:23:22 -0000 1.8 > +++ distinfo 10 Jul 2012 22:10:40 -0000 > @@ -1,5 +1,2 @@ > -MD5 (gettext-0.18.1.tar.gz) = KuBPlg1foDd0Y23e8Z69vw== > -RMD160 (gettext-0.18.1.tar.gz) = RKDgYMH10nRiq41Y4B2i/qWkiqU= > -SHA1 (gettext-0.18.1.tar.gz) = FPhwpUU5MogPgc6Qqlmz2p1Nr1w= > SHA256 (gettext-0.18.1.tar.gz) = N6lHu65jwxc6LiyqDmH4K4bCPz4/AS+PMJ7q+Q2DnHs= > SIZE (gettext-0.18.1.tar.gz) = 15140564 > Index: patches/patch-gettext-runtime_intl_dcigettext_c > =================================================================== > RCS file: > /cvs/ports/devel/gettext/patches/patch-gettext-runtime_intl_dcigettext_c,v > retrieving revision 1.2 > diff -u -p -r1.2 patch-gettext-runtime_intl_dcigettext_c > --- patches/patch-gettext-runtime_intl_dcigettext_c 3 Jul 2010 03:23:22 > -0000 1.2 > +++ patches/patch-gettext-runtime_intl_dcigettext_c 10 Jul 2012 22:10:40 > -0000 > @@ -1,7 +1,63 @@ > $OpenBSD: patch-gettext-runtime_intl_dcigettext_c,v 1.2 2010/07/03 03:23:22 > naddy Exp $ > ---- gettext-runtime/intl/dcigettext.c.orig Mon Jun 28 20:23:14 2010 > -+++ gettext-runtime/intl/dcigettext.c Mon Jun 28 20:25:07 2010 > -@@ -769,13 +769,17 @@ DCIGETTEXT (const char *domainname, const char *msgid1 > +--- gettext-runtime/intl/dcigettext.c.orig Sat Dec 26 14:42:37 2009 > ++++ gettext-runtime/intl/dcigettext.c Tue Jul 10 20:08:14 2012 > +@@ -507,6 +507,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1 > + const char *localename; > + #endif > + size_t domainname_len; > ++ size_t xdomainname_len; > + > + /* If no real MSGID is given return NULL. */ > + if (msgid1 == NULL) > +@@ -627,6 +628,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1 > + /* We have a relative path. Make it absolute now. */ > + size_t dirname_len = strlen (dirname) + 1; > + size_t path_max; > ++ size_t resolved_dirname_len; > + char *resolved_dirname; > + char *ret; > + > +@@ -635,7 +637,8 @@ DCIGETTEXT (const char *domainname, const char *msgid1 > + > + for (;;) > + { > +- resolved_dirname = (char *) alloca (path_max + dirname_len); > ++ resolved_dirname_len = path_max + dirname_len; > ++ resolved_dirname = (char *) alloca (resolved_dirname_len); > + ADD_BLOCK (block_list, tmp_dirname); > + > + __set_errno (0); > +@@ -652,7 +655,8 @@ DCIGETTEXT (const char *domainname, const char *msgid1 > + error but simply return the default string. */ > + goto return_untranslated; > + > +- stpcpy (stpcpy (strchr (resolved_dirname, '\0'), "/"), dirname); > ++ strlcat (resolved_dirname, "/", resolved_dirname_len); > ++ strlcat (resolved_dirname, dirname, resolved_dirname_len); > + dirname = resolved_dirname; > + } > + #ifndef IN_LIBGLOCALE > +@@ -670,13 +674,14 @@ DCIGETTEXT (const char *domainname, const char *msgid1 > + #endif > + > + domainname_len = strlen (domainname); > +- xdomainname = (char *) alloca (strlen (categoryname) > +- + domainname_len + 5); > ++ xdomainname_len = strlen (categoryname) + domainname_len + 5; > ++ xdomainname = (char *) alloca (xdomainname_len); > + ADD_BLOCK (block_list, xdomainname); > + > +- stpcpy ((char *) mempcpy (stpcpy (stpcpy (xdomainname, categoryname), > "/"), > +- domainname, domainname_len), > +- ".mo"); > ++ strlcpy (xdomainname, categoryname, xdomainname_len); > ++ strlcat (xdomainname, "/", xdomainname_len); > ++ strlcat (xdomainname, domainname, xdomainname_len); > ++ strlcat (xdomainname, ".mo", xdomainname_len); > + > + /* Creating working area. */ > + single_locale = (char *) alloca (strlen (categoryvalue) + 1); > +@@ -769,13 +774,17 @@ DCIGETTEXT (const char *domainname, const char *msgid1 > /* Create a new entry and add it to the search tree. */ > size_t msgid_len; > size_t size; > @@ -20,7 +76,7 @@ $OpenBSD: patch-gettext-runtime_intl_dci > #endif > newp = (struct known_translation_t *) malloc (size); > if (newp != NULL) > -@@ -791,7 +795,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1 > +@@ -791,7 +800,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1 > memcpy (new_domainname, domainname, domainname_len + 1); > #ifdef HAVE_PER_THREAD_LOCALE > new_localename = new_domainname + domainname_len + 1; > Index: patches/patch-gettext-runtime_intl_l10nflist_c > =================================================================== > RCS file: patches/patch-gettext-runtime_intl_l10nflist_c > diff -N patches/patch-gettext-runtime_intl_l10nflist_c > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ patches/patch-gettext-runtime_intl_l10nflist_c 10 Jul 2012 22:10:40 > -0000 > @@ -0,0 +1,80 @@ > +$OpenBSD$ > +--- gettext-runtime/intl/l10nflist.c.orig Sun Jun 28 21:44:04 2009 > ++++ gettext-runtime/intl/l10nflist.c Tue Jul 10 23:41:41 2012 > +@@ -183,6 +183,7 @@ _nl_make_l10nflist (struct loaded_l10nfile **l10nfile_ > + struct loaded_l10nfile **lastp; > + struct loaded_l10nfile *retval; > + char *cp; > ++ size_t abs_filename_len; > + size_t dirlist_count; > + size_t entries; > + int cnt; > +@@ -193,7 +194,7 @@ _nl_make_l10nflist (struct loaded_l10nfile **l10nfile_ > + dirlist_len = 0; > + > + /* Allocate room for the full file name. */ > +- abs_filename = (char *) malloc (dirlist_len > ++ abs_filename_len = (dirlist_len > + + strlen (language) > + + ((mask & XPG_TERRITORY) != 0 > + ? strlen (territory) + 1 : 0) > +@@ -204,6 +205,7 @@ _nl_make_l10nflist (struct loaded_l10nfile **l10nfile_ > + + ((mask & XPG_MODIFIER) != 0 > + ? strlen (modifier) + 1 : 0) > + + 1 + strlen (filename) + 1); > ++ abs_filename = (char *) malloc (abs_filename_len); > + > + if (abs_filename == NULL) > + return NULL; > +@@ -218,31 +220,31 @@ _nl_make_l10nflist (struct loaded_l10nfile **l10nfile_ > + cp[-1] = '/'; > + } > + > +- cp = stpcpy (cp, language); > ++ strlcat (abs_filename, language, abs_filename_len); > + > + if ((mask & XPG_TERRITORY) != 0) > + { > +- *cp++ = '_'; > +- cp = stpcpy (cp, territory); > ++ strlcat (abs_filename, "_", abs_filename_len); > ++ strlcat (abs_filename, territory, abs_filename_len); > + } > + if ((mask & XPG_CODESET) != 0) > + { > +- *cp++ = '.'; > +- cp = stpcpy (cp, codeset); > ++ strlcat (abs_filename, ".", abs_filename_len); > ++ strlcat (abs_filename, codeset, abs_filename_len); > + } > + if ((mask & XPG_NORM_CODESET) != 0) > + { > +- *cp++ = '.'; > +- cp = stpcpy (cp, normalized_codeset); > ++ strlcat (abs_filename, ".", abs_filename_len); > ++ strlcat (abs_filename, normalized_codeset, abs_filename_len); > + } > + if ((mask & XPG_MODIFIER) != 0) > + { > +- *cp++ = '@'; > +- cp = stpcpy (cp, modifier); > ++ strlcat (abs_filename, "@", abs_filename_len); > ++ strlcat (abs_filename, modifier, abs_filename_len); > + } > + > +- *cp++ = '/'; > +- stpcpy (cp, filename); > ++ strlcat (abs_filename, "/", abs_filename_len); > ++ strlcat (abs_filename, filename, abs_filename_len); > + > + /* Look in list of already loaded domains whether it is already > + available. */ > +@@ -366,7 +368,7 @@ _nl_normalize_codeset (const char *codeset, size_t nam > + if (retval != NULL) > + { > + if (only_digit) > +- wp = stpcpy (retval, "iso"); > ++ wp = (char *) memcpy (retval, "iso", 3) + 3; > + else > + wp = retval; > + > -- > Christian "naddy" Weisgerber na...@mips.inka.de >