$NetBSD: patch-ar,v 1.2 2008/01/04 06:48:07 martti Exp $ --- src/server.c.orig 2006-06-08 17:34:20.000000000 +0300 +++ src/server.c 2008-01-02 14:45:35.000000000 +0200 @@ -782,6 +782,7 @@ nothing. But for rsh, we need to do it now. */ parse_config (current_parsed_root->directory); + if (!nolock) { path = xmalloc (strlen (current_parsed_root->directory) + sizeof (CVSROOTADM) + 2); @@ -799,6 +800,7 @@ pending_error = save_errno; } free (path); + } #ifdef HAVE_PUTENV env = xmalloc (strlen (CVSROOT_ENV) + strlen (current_parsed_root->directory) + 2); @@ -2284,8 +2286,12 @@ break; case 'n': noexec = 1; + nolock = 1; logoff = 1; break; + case 'u': + nolock = 1; + break; case 'q': quiet = 1; break; @@ -5369,6 +5375,7 @@ const char *username; { struct passwd *pw; + int rc; pw = getpwnam (username); if (pw == NULL) @@ -5447,7 +5454,15 @@ } } - if (setuid (pw->pw_uid) < 0) +#ifdef SETXID_SUPPORT + /* Honor the setuid bit iff set. */ + if (getuid() != geteuid()) + rc = setuid (geteuid ()); + else +#else + rc = setuid (pw->pw_uid); +#endif + if (rc < 0) { /* Note that this means that if run as a non-root user, CVSROOT/passwd must contain the user we are running as