- markus@cvs.openbsd.org 2001/04/06 21:00:17
     [auth-rh-rsa.c auth-rhosts.c auth-rsa.c auth2.c channels.c session.c
      ssh.c sshconnect.c sshconnect.h uidswap.c uidswap.h]
     do gid/groups-swap in addition to uid-swap, should help if /home/group
     is chmod 750 + chgrp grp /home/group/, work be deraadt and me, thanks
     to olar@openwall.com is comments.  we had many requests for this.
diff --git a/sshconnect.c b/sshconnect.c
index 754ac12..85427b4 100644
--- a/sshconnect.c
+++ b/sshconnect.c
@@ -13,7 +13,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: sshconnect.c,v 1.102 2001/04/05 10:42:55 markus Exp $");
+RCSID("$OpenBSD: sshconnect.c,v 1.103 2001/04/06 21:00:14 markus Exp $");
 
 #include <openssl/bn.h>
 
@@ -45,7 +45,7 @@
  * Connect to the given ssh server using a proxy command.
  */
 int
-ssh_proxy_connect(const char *host, u_short port, uid_t original_real_uid,
+ssh_proxy_connect(const char *host, u_short port, struct passwd *pw,
 		  const char *proxy_command)
 {
 	Buffer command;
@@ -96,7 +96,7 @@
 		char *argv[10];
 
 		/* Child.  Permanently give up superuser privileges. */
-		permanently_set_uid(original_real_uid);
+		permanently_set_uid(pw);
 
 		/* Redirect stdin and stdout. */
 		close(pin[1]);
@@ -145,7 +145,7 @@
  * Creates a (possibly privileged) socket for use as the ssh connection.
  */
 int
-ssh_create_socket(uid_t original_real_uid, int privileged, int family)
+ssh_create_socket(struct passwd *pw, int privileged, int family)
 {
 	int sock;
 
@@ -165,7 +165,7 @@
 		 * Just create an ordinary socket on arbitrary port.  We use
 		 * the user's uid to create the socket.
 		 */
-		temporarily_use_uid(original_real_uid);
+		temporarily_use_uid(pw);
 		sock = socket(family, SOCK_STREAM, 0);
 		if (sock < 0)
 			error("socket: %.100s", strerror(errno));
@@ -188,7 +188,7 @@
 int
 ssh_connect(const char *host, struct sockaddr_storage * hostaddr,
 	    u_short port, int connection_attempts,
-	    int anonymous, uid_t original_real_uid,
+	    int anonymous, struct passwd *pw,
 	    const char *proxy_command)
 {
 	int gaierr;
@@ -212,7 +212,7 @@
 	}
 	/* If a proxy command is given, connect using it. */
 	if (proxy_command != NULL)
-		return ssh_proxy_connect(host, port, original_real_uid, proxy_command);
+		return ssh_proxy_connect(host, port, pw, proxy_command);
 
 	/* No proxy command. */
 
@@ -248,7 +248,7 @@
 				host, ntop, strport);
 
 			/* Create a socket for connecting. */
-			sock = ssh_create_socket(original_real_uid,
+			sock = ssh_create_socket(pw,
 #ifdef HAVE_CYGWIN
 			    !anonymous,
 #else
@@ -262,7 +262,7 @@
 			 * hope that it will help with tcp_wrappers showing
 			 * the remote uid as root.
 			 */
-			temporarily_use_uid(original_real_uid);
+			temporarily_use_uid(pw);
 			if (connect(sock, ai->ai_addr, ai->ai_addrlen) >= 0) {
 				/* Successful connection. */
 				memcpy(hostaddr, ai->ai_addr, ai->ai_addrlen);
@@ -739,16 +739,11 @@
  */
 void
 ssh_login(Key *own_host_key, const char *orighost,
-    struct sockaddr *hostaddr, uid_t original_real_uid)
+    struct sockaddr *hostaddr, struct passwd *pw)
 {
-	struct passwd *pw;
 	char *host, *cp;
 	char *server_user, *local_user;
 
-	/* Get local user name.  Use it as server user if no user name was given. */
-	pw = getpwuid(original_real_uid);
-	if (!pw)
-		fatal("User id %u not found from user database.", original_real_uid);
 	local_user = xstrdup(pw->pw_name);
 	server_user = options.user ? options.user : local_user;