fontconfig: Branch 'master' - 2 commits

[email protected] (Akira TAGOH)
Newsgroups gmane.comp.fonts.fontconfig
Message-ID <[email protected]>
 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 <[email protected]>
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 <[email protected]>
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"
 
_______________________________________________
Fontconfig mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/fontconfig
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.