Upstream status: This patch was taken from leptonica upstream. Backported to ghostscripts bundled leptonica. From f04da7c816feb1d5f689c34f3d0e7e3621edf1f5 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Wed, 1 Feb 2023 19:35:43 +0100 Subject: [PATCH] Fix GNU/Hurd build There is no PATH_MAX limitation on GNU/Hurd, and realpath() can be safely be used with its second parameter set to NULL (as required by posix since its version 2001). --- src/sarray1.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) --- a/src/sarray1.c 2023-06-13 12:31:13.393672916 +0200 +++ a/src/sarray1.c 2023-06-13 12:34:13.574237149 +0200 @@ -1953,7 +1953,11 @@ SARRAY * getFilenamesInDirectory(const char *dirname) { +#if _POSIX_VERSION >= 200112 || defined(__GLIBC__) +char *dir; +#else char dir[PATH_MAX + 1]; +#endif char *realdir, *stat_path, *ignore; size_t size; SARRAY *safiles; @@ -1976,17 +1980,28 @@ * If the file or directory exists, realpath returns its path; else it returns NULL. * If the second arg to realpath is passed in, the canonical path - is returned there. Use a buffer of sufficient size. If the - second arg is NULL, the path is malloc'd and returned if the - file or directory exists. - We pass in a buffer for the second arg, and check that the canonical - directory path was made. The existence of the directory is checked - later, after its actual path is returned by genPathname(). */ + is returned there. Use a buffer of sufficient size. + We pass in a buffer for the second arg, and check that the + canonical directory path was made. The existence of the + directory is checked later, after its actual path is returned by + genPathname(). + With GNU libc or Posix 2001, if the second arg is NULL, the path + is malloc'd and returned if the file or directory exists. + */ +#if _POSIX_VERSION >= 200112 || defined(__GLIBC__) + dir = realpath(dirname, NULL); + if (dir == NULL) + return (SARRAY *)ERROR_PTR("dir not made", __func__, NULL); +#else dir[0] = '\0'; /* init empty in case realpath() fails to write it */ ignore = realpath(dirname, dir); if (dir[0] == '\0') return (SARRAY *)ERROR_PTR("dir not made", procName, NULL); +#endif realdir = genPathname(dir, NULL); +#if _POSIX_VERSION >= 200112 || defined(__GLIBC__) + LEPT_FREE(dir); +#endif if ((pdir = opendir(realdir)) == NULL) { LEPT_FREE(realdir); return (SARRAY *)ERROR_PTR("pdir not opened", procName, NULL); @@ -1998,10 +2013,12 @@ stat_ret = fstatat(dfd, pdirentry->d_name, &st, 0); #else size = strlen(realdir) + strlen(pdirentry->d_name) + 2; +#if _POSIX_VERSION < 200112 && !defined(__GLIBC__) if (size > PATH_MAX) { L_ERROR("size = %zu too large; skipping\n", procName, size); continue; } +#endif stat_path = (char *)LEPT_CALLOC(size, 1); snprintf(stat_path, size, "%s/%s", realdir, pdirentry->d_name); stat_ret = stat(stat_path, &st);