summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdlib/realpath.c
diff options
context:
space:
mode:
authorderaadt <deraadt@openbsd.org>1997-06-20 20:37:45 +0000
committerderaadt <deraadt@openbsd.org>1997-06-20 20:37:45 +0000
commitb53d91e782e142a727eb602afdb9881df447bba9 (patch)
tree0bc5ea0d85db74ed3d7357b7c6700448c59521c2 /lib/libc/stdlib/realpath.c
parentboost TEST_BLOCK_LEN and TEST_BLOCK_COUNT a bit. this makes '-t' more (diff)
downloadwireguard-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.c7
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;