Hi,

Current sshd doesn't handle actual size of struct sockaddr correctly,
and does copy it as long as just size of struct sockaddr.  So, sshd
deesn't log hostname into utmp correctly.
Here is a proposed patch to fix this problem.  Please review it.

Sincerely,

Index: crypto/openssh/monitor.c
diff -u crypto/openssh/monitor.c.orig crypto/openssh/monitor.c
--- crypto/openssh/monitor.c.orig	Thu Jul 11 08:04:07 2002
+++ crypto/openssh/monitor.c	Thu Aug  1 15:21:58 2002
@@ -1113,8 +1113,8 @@
 	 * the address be 0.0.0.0.
 	 */
 	memset(&from, 0, sizeof(from));
+	fromlen = sizeof(from);
 	if (packet_connection_is_on_socket()) {
-		fromlen = sizeof(from);
 		if (getpeername(packet_get_connection_in(),
 			(struct sockaddr *) & from, &fromlen) < 0) {
 			debug("getpeername: %.100s", strerror(errno));
@@ -1124,7 +1124,7 @@
 	/* Record that there was a login on that tty from the remote host. */
 	record_login(s->pid, s->tty, pw->pw_name, pw->pw_uid,
 	    get_remote_name_or_ip(utmp_len, options.verify_reverse_mapping),
-	    (struct sockaddr *)&from);
+	    (struct sockaddr *)&from, fromlen);
 }
 
 static void
Index: crypto/openssh/session.c
diff -u crypto/openssh/session.c.orig crypto/openssh/session.c
--- crypto/openssh/session.c.orig	Sun Jul 28 00:43:29 2002
+++ crypto/openssh/session.c	Thu Aug  1 15:22:21 2002
@@ -721,8 +721,8 @@
 	 * the address be 0.0.0.0.
 	 */
 	memset(&from, 0, sizeof(from));
+	fromlen = sizeof(from);
 	if (packet_connection_is_on_socket()) {
-		fromlen = sizeof(from);
 		if (getpeername(packet_get_connection_in(),
 		    (struct sockaddr *) & from, &fromlen) < 0) {
 			debug("getpeername: %.100s", strerror(errno));
@@ -735,7 +735,7 @@
 		record_login(pid, s->tty, pw->pw_name, pw->pw_uid,
 		    get_remote_name_or_ip(utmp_len,
 		    options.verify_reverse_mapping),
-		    (struct sockaddr *)&from);
+		    (struct sockaddr *)&from, fromlen);
 
 #ifdef USE_PAM
 	/*
Index: crypto/openssh/sshlogin.c
diff -u crypto/openssh/sshlogin.c.orig crypto/openssh/sshlogin.c
--- crypto/openssh/sshlogin.c.orig	Sat Jul 13 12:53:57 2002
+++ crypto/openssh/sshlogin.c	Thu Aug  1 15:24:36 2002
@@ -66,12 +66,12 @@
  */
 void
 record_login(pid_t pid, const char *ttyname, const char *user, uid_t uid,
-    const char *host, struct sockaddr * addr)
+    const char *host, struct sockaddr * addr, socklen_t addrlen)
 {
   struct logininfo *li;
 
   li = login_alloc_entry(pid, user, host, ttyname);
-  login_set_addr(li, addr, sizeof(struct sockaddr));
+  login_set_addr(li, addr, addrlen);
   login_login(li);
   login_free_entry(li);
 }
Index: crypto/openssh/sshlogin.h
diff -u crypto/openssh/sshlogin.h.orig crypto/openssh/sshlogin.h
--- crypto/openssh/sshlogin.h.orig	Sat Jul 13 12:53:57 2002
+++ crypto/openssh/sshlogin.h	Thu Aug  1 15:26:40 2002
@@ -16,7 +16,7 @@
 
 void
 record_login(pid_t, const char *, const char *, uid_t,
-    const char *, struct sockaddr *);
+    const char *, struct sockaddr *, socklen_t);
 void   record_logout(pid_t, const char *, const char *);
 u_long         get_last_login_time(uid_t, const char *, char *, u_int);
 
--
Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan
[EMAIL PROTECTED]  [EMAIL PROTECTED]  ume@{,jp.}FreeBSD.org
http://www.imasy.org/~ume/

Reply via email to