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
> 

Reply via email to