[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 1/2] posix: Add compat glob symbol to not follow dangling

From: Paul Eggert
Subject: Re: [PATCH v2 1/2] posix: Add compat glob symbol to not follow dangling symbols
Date: Tue, 26 Sep 2017 11:10:35 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0

On 09/26/2017 10:24 AM, Adhemerval Zanella wrote:
I see other possible issues that would
need to be fixed as well:

   * FLEXIBLE_ARRAY_MEMBER definition for !__LIBC.
   * __glob_pattern_type duplicated prototype.
   * __set_errno and mempcpy definition.

Thanks for reporting the duplicated prototype; that is a portability issue that I fixed in Gnulib by applying the attached patch to Gnulib master. Gnulib glob.c already handles FLEXIBLE_ARRAY_MEMBER, __set_errno, and mempcpy automatically, because its 'glob' module has the modules 'flexmember', 'libc-config', and 'mempcpy' as prerequisites, and these supply the necessary definitions.

You can test Gnulib glob.c's portabililty by running this shell command in Gnulib's top directory:

./gnulib-tool --create-testdir --dir foo glob

and then by copying the newly-created 'foo' directory to the platform of your choice and running './configure; make check' there.

Gnu Make does not use Gnulib. Instead, it ships an old version of glob.c, which it took directly from glibc in 1999; this all predates Gnulib. If GNU Make ever updates to a more-modern glob.c I suggest that it use the Gnulib glob module, along with that module's prerequisites. I could help do that, if the GNU Make maintainer wants to go that route. [I'll CC: this to bug-make to give its maintainer a heads-up about this libc-alpha discussion, which can be followed from here:



I could build gnumake with forced internal glob implementation
(make_cv_sys_gnu_glob=no) with the patch following patch.  Looking
gnulib I am not sure if the correct way to use mempcpy for !_LIBC.

Sorry, but I'm confused by that patch (quoted below). It is a patch to glibc, so at first I assumed that you applied it to a copy of the glibc source, built a new glibc with it, and then used the newly-built glibc to configure and build GNU Make 4.2.1.  But that assumption cannot be right, since the patch modifies only code that is unused when building glibc. And one cannot simply copy current or patched glibc posix/glob.c into make's lib/glob.c, as (among other things) glibc's posix/glob.c includes <flexmember.h> when compiled outside of glibc, and GNU Make does not have that include file. So how did you use this patch?

diff --git a/posix/glob.c b/posix/glob.c
index 98122dac88..31e3aba4dd 100644
--- a/posix/glob.c
+++ b/posix/glob.c
@@ -65,11 +65,15 @@
  # define __stat64(fname, buf)   stat (fname, buf)
  # define __fxstatat64(_, d, f, st, flag) fstatat (d, f, st, flag)
  # define struct_stat64          struct stat
-# ifndef __MVS__
-#  define __alloca              alloca
-# endif
+# define __alloca               alloca
  # define __readdir              readdir
  # define COMPILE_GLOB64
+static inline void *
+mempcpy (void *dest, const void *src, size_t n)
+  return memcpy (dest, src, n) + n;
  #endif /* _LIBC */
#include <fnmatch.h>
@@ -230,8 +234,6 @@ glob_use_alloca (size_t alloca_used, size_t len)
  static int glob_in_dir (const char *pattern, const char *directory,
                         int flags, int (*errfunc) (const char *, int),
                         glob_t *pglob, size_t alloca_used);
-extern int __glob_pattern_type (const char *pattern, int quote)
-    attribute_hidden;
static int prefix_array (const char *prefix, char **array, size_t n) __THROWNL;
  static int collated_compare (const void *, const void *) __THROWNL;

Attachment: 0001-glob-remove-bogus-extern-decl.patch
Description: Text Data

reply via email to

[Prev in Thread] Current Thread [Next in Thread]