Submitted By:            Randy McMurchy <randy_at_linuxfromscratch_dot_org>
Date:                    2005-03-23
Initial Package Version: 1.4.2
Upstream Status:         Not sure
Origin:                  Internet (URL's are now lost)
Description:             Fix the rexecd daemon so that it understands shadow
                         passwords. Fix the rshd daemon so that it properly
                         resolves hostnames.

diff -Naur inetutils-1.4.2-orig/rexecd/rexecd.c inetutils-1.4.2/rexecd/rexecd.c
--- inetutils-1.4.2-orig/rexecd/rexecd.c	2002-12-11 12:38:00.000000000 +0000
+++ inetutils-1.4.2/rexecd/rexecd.c	2005-02-22 19:53:44.146962264 +0000
@@ -79,6 +79,10 @@
 #include <varargs.h>
 #endif
 
+#ifdef HAVE_SHADOW_H
+#include <shadow.h>
+#endif
+
 void error __P ((const char *fmt, ...));
 /*
  * remote execute server:
@@ -127,6 +131,10 @@
 	char *cmdbuf, *cp, *namep;
 	char *user, *pass;
 	struct passwd *pwd;
+#ifdef HAVE_SHADOW_H
+      struct spwd *spwd;
+      char *pw_field;
+#endif
 	int s;
 	u_short port;
 	int pv[2], pid, cc;
@@ -186,6 +194,24 @@
 		exit(1);
 	}
 	endpwent();
+
+#ifdef HAVE_SHADOW_H
+      // Get encrypted password from /etc/shadow if possible,
+      // else from /etc/passwd.
+      spwd = getspnam(user);
+      if (spwd) {
+              pw_field = spwd->sp_pwdp;
+      } else {
+              pw_field = pwd->pw_passwd;
+      }
+      if (*pw_field != '\0') {
+              namep = CRYPT (pass, pw_field);
+              if (strcmp(namep, pw_field)) {
+                      error("Password incorrect.\n");
+                      exit(1);
+              }
+      }
+#else
 	if (*pwd->pw_passwd != '\0') {
 		namep = CRYPT (pass, pwd->pw_passwd);
 		if (strcmp(namep, pwd->pw_passwd)) {
@@ -193,6 +219,7 @@
 			exit(1);
 		}
 	}
+#endif
 	write(STDERR_FILENO, "\0", 1);
 	if (port) {
 		pipe(pv);
diff -Naur inetutils-1.4.2-orig/rshd/rshd.c inetutils-1.4.2/rshd/rshd.c
--- inetutils-1.4.2-orig/rshd/rshd.c	2002-12-11 12:38:00.000000000 +0000
+++ inetutils-1.4.2/rshd/rshd.c	2005-02-22 19:54:33.162510768 +0000
@@ -443,7 +443,7 @@
       dup2 (sockfd, STDERR_FILENO);
     }
 
-  /* Get the "name" of the clent form its Internet address.
+  /* Get the "name" of the client form its Internet address.
    * This is used for the autentication below
    */
   errorstr = NULL;
@@ -457,52 +457,49 @@
        * in a remote net; look up the name and check that this
        * address corresponds to the name.
        */
-      hostname = strdup (hp->h_name);
+      const char *remotehost = strdup(hp->h_name);
 #ifdef	KERBEROS
       if (!use_kerberos)
 #endif
-	if (check_all || local_domain (hp->h_name))
+       if (! remotehost)
+           errorstr = "Out of memory\n";
+       else if (check_all || local_domain (remotehost))
 	  {
-	    char *remotehost = (char *) alloca (strlen (hp->h_name) + 1);
-	    if (! remotehost)
-	      errorstr = "Out of memory\n";
-	    else
+           errorhost = remotehost;
+           hp = gethostbyname (remotehost);
+           if (hp == NULL)
 	      {
-		strcpy (remotehost, hp->h_name);
-		errorhost = remotehost;
-		hp = gethostbyname (remotehost);
-		if (hp == NULL)
+               syslog (LOG_INFO,
+                       "Couldn't look up address for %s", remotehost);
+                       errorstr = "Couldn't look up address for your host (%s)\n";
+                       hostname = strdup(inet_ntoa(fromp->sin_addr));
+             }
+           else
+              {
+               for (; ; hp->h_addr_list++)
 		  {
-		    syslog (LOG_INFO,
-			    "Couldn't look up address for %s", remotehost);
-		    errorstr = "Couldn't look up address for your host (%s)\n";
-		    hostname = inet_ntoa (fromp->sin_addr);
+                   if (hp->h_addr_list[0] == NULL)
+                     {
+                       syslog (LOG_NOTICE,
+                               "Host addr %s not listed for host %s",
+                               inet_ntoa (fromp->sin_addr), hp->h_name);
+                       errorstr = "Host address mismatch for %s\n";
+                       hostname = strdup(inet_ntoa(fromp->sin_addr));
+                       break;
+                     }
+                   if (!memcmp (hp->h_addr_list[0],
+                               (caddr_t)&fromp->sin_addr,
+                               sizeof fromp->sin_addr))
+                     {
+                       hostname = strdup(hp->h_name);
+                       break; /* equal, OK */
+                     }
 		  }
-		else
-		  for (; ; hp->h_addr_list++)
-		    {
-		      if (hp->h_addr_list[0] == NULL)
-			{
-			  syslog (LOG_NOTICE,
-				  "Host addr %s not listed for host %s",
-				  inet_ntoa (fromp->sin_addr), hp->h_name);
-			  errorstr = "Host address mismatch for %s\n";
-			  hostname = inet_ntoa (fromp->sin_addr);
-			  break;
-			}
-		      if (!memcmp (hp->h_addr_list[0],
-				   (caddr_t)&fromp->sin_addr,
-				   sizeof fromp->sin_addr))
-			{
-			  hostname = hp->h_name;
-			  break; /* equal, OK */
-			}
-		    }
-	      }
+              }
 	  }
     }
   else
-    errorhost = hostname = inet_ntoa (fromp->sin_addr);
+    errorhost = hostname = strdup(inet_ntoa(fromp->sin_addr));
 
 #ifdef	KERBEROS
   if (use_kerberos)

