cvs commit: src/usr.sbin/kldxref kldxref.c

Yar Tikhiy yar at comp.chem.msu.su
Tue Aug 8 10:16:00 UTC 2006


On Mon, Aug 07, 2006 at 01:59:30PM +1000, Bruce Evans wrote:
> On Sun, 6 Aug 2006, Dag-Erling [iso-8859-1] SmЬrgrav wrote:
> 
> >Marcel Moolenaar <marcel at FreeBSD.org> writes:
> >>  Log:
> >>  Fix (static) buffer overflow bug. The dest buffer is of size MAXPATHLEN,
> >>  so dest[MAXPATHLEN] falls outside the buffer.  This bug corrupted
> >>  arenas[0] defined in libc's malloc.c on PowerPC when kldxref is shared,
> >>  which triggered a delayed SIGSERV.
> >
> >MAXPATHLEN should be spelled PATH_MAX.
> 
> Actually, MAXPATHLEN is better since it is honestly unportable.  It works
> on all [Free]BSD systems, while PATH_MAX only works on POSIX systems that
> define it.  The correct spelling of PATH_MAX is {PATH_MAX} or:
> 
> #if defined(PATH_MAX) && defined(OPTIMIZE_FOR_COMPILE_TIME_CONST_PATH_MAX)
> 	char buf[PATH_MAX];
> 	...
> #else
> 	long path_max;
> 
> 	path_max = pathconf(pathname_of_interest, _PC_PATH_MAX);
> 	if (path_max == -1)
> 		handle_error();
> 	assert(path_max > 0 && path_max <= SIZE_MAX)
> 	buf = malloc((size_t)path_max);
> 	if (buf == NULL)
> 		handle_allocation_failure();
> 	...
> #endif
> 
> The correct spelling is too hard to use for simple unportable utilities
> like kldxref.

Just looked what SUSv3 says:

	It should be noted, however, that many of the listed limits
	are not invariant, and at runtime, the value of the limit
	may differ from those given in this header, for the following
	reasons:

	The limit is pathname-dependent.

	The limit differs between the compile and runtime machines.

	For these reasons, an application may use the fpathconf(),
	pathconf(), and sysconf() functions to determine the actual
	value of a limit at runtime.

Therefore using PATH_MAX alone doesn't buy us true portability
within POSIX.  Sigh...  It seems indeed better to use the good old
non-portable MAXPATHLEN rather than pretend portability falsely.

-- 
Yar


More information about the cvs-src mailing list