+2020-12-02 Paul Eggert <eggert@cs.ucla.edu>
+
+ canonicalize-lgpl: fix EOVERFLOW bug
+ * lib/canonicalize-lgpl.c: Do not include <sys/stat.h>.
+ (__realpath): Do not use lstat. Just use readlink, as this
+ suffices and it avoids the EOVERFLOW problem that lstat has.
+ * modules/canonicalize-lgpl (Depends-on): Remove lstat, sys_stat.
+
2020-12-02 Bruno Haible <bruno@clisp.org>
strsignal-tests: Fix test failure on macOS 10.13.
#if HAVE_SYS_PARAM_H || defined _LIBC
# include <sys/param.h>
#endif
-#include <sys/stat.h>
#include <errno.h>
#include <stddef.h>
for (end = start; *start; start = end)
{
-#ifdef _LIBC
- struct stat64 st;
-#else
- struct stat st;
-#endif
-
/* Skip sequence of multiple path-separators. */
while (ISSLASH (*start))
++start;
for (end = start; *end && !ISSLASH (*end); ++end)
/* Nothing. */;
- if (end - start == 0)
- break;
- else if (end - start == 1 && start[0] == '.')
+ if (end - start == 1 && start[0] == '.')
/* nothing */;
else if (end - start == 2 && start[0] == '.' && start[1] == '.')
{
#endif
*dest = '\0';
- /* FIXME: if lstat fails with errno == EOVERFLOW,
- the entry exists. */
-#ifdef _LIBC
- if (__lxstat64 (_STAT_VER, rpath, &st) < 0)
-#else
- if (lstat (rpath, &st) < 0)
-#endif
- goto error;
-
- if (S_ISLNK (st.st_mode))
+ char linkbuf[128];
+ ssize_t n = __readlink (rpath, linkbuf, sizeof linkbuf);
+ if (n < 0)
+ {
+ if (errno != EINVAL)
+ goto error;
+ }
+ else
{
char *buf;
size_t len;
- ssize_t n;
if (++num_links > MAXSYMLINKS)
{
goto error;
}
}
- buf = extra_buf + path_max;
-
- n = __readlink (rpath, buf, path_max - 1);
- if (n < 0)
- goto error;
+ if (n < sizeof linkbuf)
+ buf = linkbuf;
+ else
+ {
+ buf = extra_buf + path_max;
+ n = __readlink (rpath, buf, path_max - 1);
+ if (n < 0)
+ goto error;
+ }
buf[n] = '\0';
len = strlen (end);
dest++;
}
}
- else if (!S_ISDIR (st.st_mode) && *end != '\0')
- {
- __set_errno (ENOTDIR);
- goto error;
- }
}
}
if (dest > rpath + prefix_len + 1 && ISSLASH (dest[-1]))
double-slash-root [test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1]
errno [test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1]
filename [test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1]
-lstat [test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1]
malloca [test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1]
memmove [test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1]
pathmax [test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1]
readlink [test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1]
-sys_stat [test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1]
configure.ac:
gl_CANONICALIZE_LGPL