- Fix NULL pointer dereference in login.c. Fix from Andre Lucas
   <andre.lucas@dial.pipex.com>
diff --git a/ChangeLog b/ChangeLog
index 25f1d3e..f09fa8a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+20000125
+ - Fix NULL pointer dereference in login.c. Fix from Andre Lucas 
+   <andre.lucas@dial.pipex.com>
+
 20000124
  - Pick up version 1.2.2 from OpenBSD CVS (no changes, just version number
    increment)
diff --git a/login.c b/login.c
index 29259f5..485b9d5 100644
--- a/login.c
+++ b/login.c
@@ -18,7 +18,7 @@
  */
 
 #include "includes.h"
-RCSID("$Id: login.c,v 1.19 2000/01/23 09:18:36 damien Exp $");
+RCSID("$Id: login.c,v 1.20 2000/01/26 00:04:48 damien Exp $");
 
 #if defined(HAVE_UTMPX_H) && defined(USE_UTMPX)
 # include <utmpx.h>
@@ -173,21 +173,23 @@
 	strncpy(u.ut_host, host, sizeof(u.ut_host));
 #endif
 #if defined(HAVE_ADDR_IN_UTMP)
-	switch (addr->sa_family) {
-		case AF_INET: {
-			struct sockaddr_in *in = (struct sockaddr_in*)addr;
-			memcpy(&(u.ut_addr), &(in->sin_addr), sizeof(&(in->sin_addr)));
-			break;
-		}
+	if (addr) {
+		switch (addr->sa_family) {
+			case AF_INET: {
+				struct sockaddr_in *in = (struct sockaddr_in*)addr;
+				memcpy(&(u.ut_addr), &(in->sin_addr), sizeof(&(in->sin_addr)));
+				break;
+			}
 #if defined(HAVE_ADDR_V6_IN_UTMP)
-		case AF_INET6: {
-			struct sockaddr_in6 *in6 = (struct sockaddr_in6*)addr;
-			memcpy(u.ut_addr_v6, &(in6->sin6_addr), sizeof(&(in6->sin6_addr)));
-			break;
-		}
+			case AF_INET6: {
+				struct sockaddr_in6 *in6 = (struct sockaddr_in6*)addr;
+				memcpy(u.ut_addr_v6, &(in6->sin6_addr), sizeof(&(in6->sin6_addr)));
+				break;
+			}
 #endif
-		default:
-			break;
+			default:
+				break;
+		}
 	}
 #endif
 
@@ -208,21 +210,23 @@
 #  endif /* HAVE_SYSLEN_IN_UTMPX */
 # endif
 #if defined(HAVE_ADDR_IN_UTMPX)
-	switch (addr->sa_family) {
-		case AF_INET: {
-			struct sockaddr_in *in = (struct sockaddr_in*)addr;
-			memcpy(&(utx.ut_addr), &(in->sin_addr), sizeof(&(in->sin_addr)));
-			break;
-		}
+	if (addr)
+		switch (addr->sa_family) {
+			case AF_INET: {
+				struct sockaddr_in *in = (struct sockaddr_in*)addr;
+				memcpy(&(utx.ut_addr), &(in->sin_addr), sizeof(&(in->sin_addr)));
+				break;
+			}
 #if defined(HAVE_ADDR_V6_IN_UTMPX)
-		case AF_INET6: {
-			struct sockaddr_in6 *in6 = (struct sockaddr_in6*)addr;
-			memcpy(utx.ut_addr_v6, &(in6->sin6_addr), sizeof(&(in6->sin6_addr)));
-			break;
-		}
+			case AF_INET6: {
+				struct sockaddr_in6 *in6 = (struct sockaddr_in6*)addr;
+				memcpy(utx.ut_addr_v6, &(in6->sin6_addr), sizeof(&(in6->sin6_addr)));
+				break;
+			}
 #endif
-		default:
-			break;
+			default:
+				break;
+		}
 	}
 #endif
 #endif /* defined(HAVE_UTMPX_H) && defined(USE_UTMPX) */