--- lib/libutil/pw_util.c.orig 2007-01-09 02:02:05.000000000 +0100 +++ lib/libutil/pw_util.c 2008-09-08 17:16:36.000000000 +0200 @@ -214,18 +214,23 @@ pw_tmp(int mfd) { char buf[8192]; + char pcpy[MAXPATHLEN]; ssize_t nr; const char *p; int tfd; if (*masterpasswd == '\0') return (-1); - if ((p = strrchr(masterpasswd, '/'))) + if (!realpath(masterpasswd, pcpy)) { + strncpy(pcpy, masterpasswd, MAXPATHLEN - 1); + pcpy[MAXPATHLEN] = '\0'; + } + if ((p = strrchr(pcpy, '/'))) ++p; else - p = masterpasswd; + p = pcpy; if (snprintf(tempname, sizeof(tempname), "%.*spw.XXXXXX", - (int)(p - masterpasswd), masterpasswd) >= (int)sizeof(tempname)) { + (int)(p - pcpy), pcpy) >= (int)sizeof(tempname)) { errno = ENAMETOOLONG; return (-1); } @@ -251,9 +256,16 @@ int pw_mkdb(const char *user) { + char real_passwd_dir[MAXPATHLEN]; + char *p; int pstat; pid_t pid; + if (realpath(masterpasswd, real_passwd_dir) && + (p = strrchr(real_passwd_dir, '/'))) + *p = '\0'; + else + strcpy (real_passwd_dir, passwd_dir); (void)fflush(stderr); switch ((pid = fork())) { case -1: @@ -262,10 +274,10 @@ /* child */ if (user == NULL) execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", - "-d", passwd_dir, tempname, (char *)NULL); + "-d", real_passwd_dir, tempname, (char *)NULL); else execl(_PATH_PWD_MKDB, "pwd_mkdb", "-p", - "-d", passwd_dir, "-u", user, tempname, + "-d", real_passwd_dir, "-u", user, tempname, (char *)NULL); _exit(1); /* NOTREACHED */