Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/lib/libc/gen/getcwd.c,v retrieving revision 1.36 retrieving revision 1.50.4.1 diff -u -p -r1.36 -r1.50.4.1 --- src/lib/libc/gen/getcwd.c 2005/01/30 22:37:32 1.36 +++ src/lib/libc/gen/getcwd.c 2012/04/17 00:05:18 1.50.4.1 @@ -1,4 +1,4 @@ -/* $NetBSD: getcwd.c,v 1.36 2005/01/30 22:37:32 enami Exp $ */ +/* $NetBSD: getcwd.c,v 1.50.4.1 2012/04/17 00:05:18 yamt Exp $ */ /* * Copyright (c) 1989, 1991, 1993, 1995 @@ -37,7 +37,7 @@ #if 0 static char sccsid[] = "@(#)getcwd.c 8.5 (Berkeley) 2/7/95"; #else -__RCSID("$NetBSD: getcwd.c,v 1.36 2005/01/30 22:37:32 enami Exp $"); +__RCSID("$NetBSD: getcwd.c,v 1.50.4.1 2012/04/17 00:05:18 yamt Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -50,11 +50,13 @@ __RCSID("$NetBSD: getcwd.c,v 1.36 2005/0 #include #include #include +#include #include "extern.h" #ifdef __weak_alias __weak_alias(getcwd,_getcwd) +__weak_alias(_sys_getcwd,_getcwd) __weak_alias(realpath,_realpath) #endif @@ -69,14 +71,20 @@ char * realpath(const char *path, char *resolved) { struct stat sb; - int idx = 0, n, nlnk = 0, serrno = errno; + int idx = 0, nlnk = 0; const char *q; char *p, wbuf[2][MAXPATHLEN]; size_t len; + ssize_t n; - _DIAGASSERT(path != NULL); _DIAGASSERT(resolved != NULL); + /* POSIX sez we must test for this */ + if (path == NULL) { + errno = EINVAL; + return NULL; + } + /* * Build real path one by one with paying an attention to ., * .. and symbolic link. @@ -96,7 +104,8 @@ realpath(const char *path, char *resolve /* If relative path, start from current working directory. */ if (*path != '/') { - if (getcwd(resolved, MAXPATHLEN) == NULL) { + /* check for resolved pointer to appease coverity */ + if (resolved && getcwd(resolved, MAXPATHLEN) == NULL) { p[0] = '.'; p[1] = 0; return (NULL); @@ -159,11 +168,6 @@ loop: * target to unresolved path. */ if (lstat(resolved, &sb) == -1) { - /* Allow nonexistent component if this is the last one. */ - if (*q == 0 && errno == ENOENT) { - errno = serrno; - return (resolved); - } return (NULL); } if (S_ISLNK(sb.st_mode)) { @@ -193,6 +197,10 @@ loop: p = resolved; goto loop; } + if (*q == '/' && !S_ISDIR(sb.st_mode)) { + errno = ENOTDIR; + return (NULL); + } /* Advance both resolved and unresolved path. */ p += 1 + q - path; @@ -201,7 +209,7 @@ loop: } char * -getcwd(char *pt, size_t size) +__ssp_real(getcwd)(char *pt, size_t size) { char *npt;