summaryrefslogtreecommitdiff
path: root/lib/canonicalize-lgpl.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2016-10-14 02:49:05 +0200
committerBruno Haible <bruno@clisp.org>2016-10-15 14:51:09 +0200
commit794b3480e3c1a46d23e42491c39e332ebd3ccbc8 (patch)
treec20ca0d82ad8a07eb2c88335d6199ef8bc853136 /lib/canonicalize-lgpl.c
parent7dad5f25591de682c452c3fc39ffe2fa11e21491 (diff)
downloadgnulib-794b3480e3c1a46d23e42491c39e332ebd3ccbc8.tar.gz
canonicalize-lgpl: Support the case path_max > INT_MAX.
* lib/canonicalize-lgpl.c (__realpath): Declare n as ssize_t, not int.
Diffstat (limited to 'lib/canonicalize-lgpl.c')
-rw-r--r--lib/canonicalize-lgpl.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/lib/canonicalize-lgpl.c b/lib/canonicalize-lgpl.c
index 4a38a4610e..7f54008a74 100644
--- a/lib/canonicalize-lgpl.c
+++ b/lib/canonicalize-lgpl.c
@@ -194,7 +194,6 @@ __realpath (const char *name, char *resolved)
#else
struct stat st;
#endif
- int n;
/* Skip sequence of multiple path-separators. */
while (ISSLASH (*start))
@@ -275,6 +274,7 @@ __realpath (const char *name, char *resolved)
{
char *buf;
size_t len;
+ ssize_t n;
if (++num_links > MAXSYMLINKS)
{
@@ -311,7 +311,8 @@ __realpath (const char *name, char *resolved)
}
len = strlen (end);
- if ((long int) (n + len) >= path_max)
+ /* Check that n + len + 1 doesn't overflow and is <= path_max. */
+ if (n >= SIZE_MAX - len || n + len >= path_max)
{
freea (buf);
__set_errno (ENAMETOOLONG);