Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 May 1997 10:13:53 -0700 (MST)
From:      Terry Lambert <terry@lambert.org>
To:        shigio@wafu.netgate.net (Shigio Yamaguchi)
Cc:        freebsd-hackers@FreeBSD.ORG, shigio@wafu.netgate.net
Subject:   Re: Bug fix for realpath(3).
Message-ID:  <199705271713.KAA15554@phaeton.artisoft.com>
In-Reply-To: <199705270820.IAA12141@wafu.netgate.net> from "Shigio Yamaguchi" at May 28, 97 01:17:48 am

next in thread | previous in thread | raw e-mail | index | archive | help
> Hello, hackers.
> I fixed two bugs in realpath(3). Would you please check this?
> 
> 1. Realpath goes into infinite loop.
> 
> 	% ln -s a b
> 	% ln -s b a
> 
> 	[user's code]
> 
> 	char resolved[MAXPATHLEN];
> 	(void)realpath("a", resolved);	/* It will not return */
> 
>    It should break when over MAXSYMLINKS symbolic links are encountered,
>    like other system calls.

It's a library call, but you are right about where it should fail out.

8-).


> 2. Realpath has unsafe code.
> 
> 	[user's code]
> 
> 	char resolved[MAXPATHLEN];
> 	(void)realpath("xxx", resolved);
> 
> 	[realpath's code]
> 
> 	n = readlink(p, resolved, MAXPATHLEN);
> 	if (n < 0)
> 		goto err1;
> 	resolved[n] = '\0';		/* It's dangerous */

This is actually a bogosity which should be addressed in realpath(3)'s
definition.  It should probably be:

	char *
	realpath(const char *pathname, char resolvedname[MAXPATHLEN+1])

In the manual page, to accout for the NUL.

Alternately, it should return a count, just like readlink(), and not
NULL terminate the return value.

The problem with your fix is that a 1024 byte readlink return is
perfectly legal.


					Regards,
					Terry Lambert
					terry@lambert.org
---
Any opinions in this posting are my own and not those of my present
or previous employers.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199705271713.KAA15554>