[Fontconfig] fontconfig: Branch 'master' - 2 commits

Akira TAGOH tagoh at kemper.freedesktop.org
Wed Mar 1 10:49:14 UTC 2017


 configure.ac    |   20 ++++++++++++++++++++
 src/fcdefault.c |   34 +++++++++++++++++++++++++++-------
 src/fcint.h     |    6 ++++++
 src/fcobjs.c    |    4 ++--
 src/fcstat.c    |   12 +++++++++++-
 5 files changed, 66 insertions(+), 10 deletions(-)

New commits:
commit abdb6d658e1a16410dd1c964e365a3ebd5039e7c
Author: Akira TAGOH <akira at tagoh.org>
Date:   Wed Mar 1 19:48:02 2017 +0900

    Fix the build issue on GNU/Hurd
    
    PATH_MAX isn't defined on GNU/Hurd. according to the porting guidelines
    (https://www.gnu.org/software/hurd/hurd/porting/guidelines.html)
    allocate a memory dynamically instead of relying on the length of
    a string with PATH_MAX.
    
    https://bugs.freedesktop.org/show_bug.cgi?id=97512

diff --git a/src/fcdefault.c b/src/fcdefault.c
index 6647a8f..5afd7ec 100644
--- a/src/fcdefault.c
+++ b/src/fcdefault.c
@@ -148,17 +148,34 @@ retry:
 	    prgname = FcStrdup ("");
 #else
 # if defined (HAVE_GETEXECNAME)
-	const char *p = getexecname ();
+	char *p = FcStrdup(getexecname ());
 # elif defined (HAVE_READLINK)
-	char buf[PATH_MAX + 1];
-	int len;
+	size_t size = FC_PATH_MAX;
 	char *p = NULL;
 
-	len = readlink ("/proc/self/exe", buf, sizeof (buf) - 1);
-	if (len != -1)
+	while (1)
 	{
-	    buf[len] = '\0';
-	    p = buf;
+	    char *buf = malloc (size);
+	    ssize_t len;
+
+	    if (!buf)
+		break;
+
+	    len = readlink ("/proc/self/exe", buf, size - 1);
+	    if (len < 0)
+	    {
+		free (buf);
+		break;
+	    }
+	    if (len < size - 1)
+	    {
+		buf[len] = 0;
+		p = buf;
+		break;
+	    }
+
+	    free (buf);
+	    size *= 2;
 	}
 # else
 	char *p = NULL;
@@ -176,6 +193,9 @@ retry:
 
 	if (!prgname)
 	    prgname = FcStrdup ("");
+
+	if (p)
+	    free (p);
 #endif
 
 	if (!fc_atomic_ptr_cmpexch (&default_prgname, NULL, prgname)) {
diff --git a/src/fcint.h b/src/fcint.h
index ac911ad..dad34c5 100644
--- a/src/fcint.h
+++ b/src/fcint.h
@@ -70,6 +70,12 @@ extern pfnSHGetFolderPathA pSHGetFolderPathA;
 #  define FC_DIR_SEPARATOR_S       "/"
 #endif
 
+#ifdef PATH_MAX
+#define FC_PATH_MAX	PATH_MAX
+#else
+#define FC_PATH_MAX	128
+#endif
+
 #if __GNUC__ >= 4
 #define FC_UNUSED	__attribute__((unused))
 #else
diff --git a/src/fcstat.c b/src/fcstat.c
index 1734fa4..f6e1aaa 100644
--- a/src/fcstat.c
+++ b/src/fcstat.c
@@ -278,8 +278,13 @@ FcDirChecksum (const FcChar8 *dir, time_t *checksum)
 	{
 #endif
 	struct stat statb;
-	char f[PATH_MAX + 1];
+	char *f = malloc (len + 1 + dlen + 1);
 
+	if (!f)
+	{
+	    ret = -1;
+	    goto bail;
+	}
 	memcpy (f, dir, len);
 	f[len] = FC_DIR_SEPARATOR;
 	memcpy (&f[len + 1], files[n]->d_name, dlen);
@@ -287,11 +292,16 @@ FcDirChecksum (const FcChar8 *dir, time_t *checksum)
 	if (lstat (f, &statb) < 0)
 	{
 	    ret = -1;
+	    free (f);
 	    goto bail;
 	}
 	if (S_ISDIR (statb.st_mode))
+	{
+	    free (f);
 	    goto bail;
+	}
 
+	free (f);
 	dtype = statb.st_mode;
 #ifdef HAVE_STRUCT_DIRENT_D_TYPE
 	}
commit 9878b306f6c673d3d6cd9db487f67eb426cc03df
Author: Akira TAGOH <akira at tagoh.org>
Date:   Thu Feb 23 21:39:10 2017 +0900

    Fix the build issue with gperf 3.1
    
    To support the one of changes in gperf 3.1:
    * The 'len' parameter of the hash function and of the lookup function is now
      of type 'size_t' instead of 'unsigned int'. This makes it safe to call these
      functions with strings of length > 4 GB, on 64-bit machines.

diff --git a/configure.ac b/configure.ac
index 4948816..8fbf3d3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -193,6 +193,26 @@ fi
 AC_CHECK_MEMBERS([struct dirent.d_type],,,
 	[#include <dirent.h>])
 
+# Check the argument type of the gperf hash/lookup function
+AC_MSG_CHECKING([The type of len parameter of gperf hash/lookup function])
+fc_gperf_test="$(echo 'foo' | gperf -L ANSI-C)"
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+	#include <string.h>
+
+	const char *in_word_set(register const char *, register size_t);
+	$fc_gperf_test
+	]])], [FC_GPERF_SIZE_T=size_t],
+	[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+		#include <string.h>
+
+		const char *in_word_set(register const char *, register unsigned int);
+		$fc_gperf_test
+	]])], [FC_GPERF_SIZE_T="unsigned int"],
+	[AC_MSG_ERROR([Unable to determine the type of the len parameter of the gperf hash/lookup function])]
+)])
+AC_DEFINE_UNQUOTED(FC_GPERF_SIZE_T, $FC_GPERF_SIZE_T, [The type of len parameter of the gperf hash/lookup function])
+AC_MSG_RESULT($FC_GPERF_SIZE_T)
+
 #
 # Checks for iconv
 #
diff --git a/src/fcobjs.c b/src/fcobjs.c
index 16ff31c..33bba8d 100644
--- a/src/fcobjs.c
+++ b/src/fcobjs.c
@@ -25,10 +25,10 @@
 #include "fcint.h"
 
 static unsigned int
-FcObjectTypeHash (register const char *str, register unsigned int len);
+FcObjectTypeHash (register const char *str, register FC_GPERF_SIZE_T len);
 
 static const struct FcObjectTypeInfo *
-FcObjectTypeLookup (register const char *str, register unsigned int len);
+FcObjectTypeLookup (register const char *str, register FC_GPERF_SIZE_T len);
 
 #include "fcobjshash.h"
 


More information about the Fontconfig mailing list