diff options
author | 1997-06-20 20:37:45 +0000 | |
---|---|---|
committer | 1997-06-20 20:37:45 +0000 | |
commit | b53d91e782e142a727eb602afdb9881df447bba9 (patch) | |
tree | 0bc5ea0d85db74ed3d7357b7c6700448c59521c2 /lib/libc/stdlib/realpath.c | |
parent | boost TEST_BLOCK_LEN and TEST_BLOCK_COUNT a bit. this makes '-t' more (diff) | |
download | wireguard-openbsd-b53d91e782e142a727eb602afdb9881df447bba9.tar.xz wireguard-openbsd-b53d91e782e142a727eb602afdb9881df447bba9.zip |
add ELOOP support; shigio@wafu.netgate.net
Diffstat (limited to 'lib/libc/stdlib/realpath.c')
-rw-r--r-- | lib/libc/stdlib/realpath.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/libc/stdlib/realpath.c b/lib/libc/stdlib/realpath.c index 51e336efdd5..78c286014dc 100644 --- a/lib/libc/stdlib/realpath.c +++ b/lib/libc/stdlib/realpath.c @@ -35,7 +35,7 @@ */ #if defined(LIBC_SCCS) && !defined(lint) -static char *rcsid = "$OpenBSD: realpath.c,v 1.2 1996/08/19 08:33:47 tholo Exp $"; +static char *rcsid = "$OpenBSD: realpath.c,v 1.3 1997/06/20 20:37:45 deraadt Exp $"; #endif /* LIBC_SCCS and not lint */ #include <sys/param.h> @@ -62,6 +62,7 @@ realpath(path, resolved) struct stat sb; int fd, n, rootd, serrno; char *p, *q, wbuf[MAXPATHLEN]; + int symlinks = 0; /* Save the starting point. */ if ((fd = open(".", O_RDONLY)) < 0) { @@ -100,6 +101,10 @@ loop: /* Deal with the last component. */ if (lstat(p, &sb) == 0) { if (S_ISLNK(sb.st_mode)) { + if (++symlinks > MAXSYMLINKS) { + errno = ELOOP; + goto err1; + } n = readlink(p, resolved, MAXPATHLEN); if (n < 0) goto err1; |