[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