sockaddr's now require length (K. Sklower);
[unix-history] / usr / src / lib / libc / net / rcmd.c
index cc92b86..16c2cc6 100644 (file)
@@ -3,15 +3,20 @@
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms are permitted
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms are permitted
- * provided that this notice is preserved and that due credit is given
- * to the University of California at Berkeley. The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific prior written permission. This software
- * is provided ``as is'' without express or implied warranty.
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
  */
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)rcmd.c     5.16 (Berkeley) %G%";
+static char sccsid[] = "@(#)rcmd.c     5.19 (Berkeley) %G%";
 #endif /* LIBC_SCCS and not lint */
 
 #include <stdio.h>
 #endif /* LIBC_SCCS and not lint */
 
 #include <stdio.h>
@@ -47,7 +52,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
        pid = getpid();
        hp = gethostbyname(*ahost);
        if (hp == 0) {
        pid = getpid();
        hp = gethostbyname(*ahost);
        if (hp == 0) {
-               fprintf(stderr, "%s: unknown host\n", *ahost);
+               herror(*ahost);
                return (-1);
        }
        *ahost = hp->h_name;
                return (-1);
        }
        *ahost = hp->h_name;
@@ -163,6 +168,7 @@ rresvport(alport)
        int s;
 
        sin.sin_family = AF_INET;
        int s;
 
        sin.sin_family = AF_INET;
+       sin.sin_len = sizeof(sin);
        sin.sin_addr.s_addr = INADDR_ANY;
        s = socket(AF_INET, SOCK_STREAM, 0);
        if (s < 0)
        sin.sin_addr.s_addr = INADDR_ANY;
        s = socket(AF_INET, SOCK_STREAM, 0);
        if (s < 0)
@@ -184,6 +190,8 @@ rresvport(alport)
        }
 }
 
        }
 }
 
+int    _check_rhosts_file = 1;
+
 ruserok(rhost, superuser, ruser, luser)
        char *rhost;
        int superuser;
 ruserok(rhost, superuser, ruser, luser)
        char *rhost;
        int superuser;
@@ -216,7 +224,7 @@ again:
                }
                (void) fclose(hostf);
        }
                }
                (void) fclose(hostf);
        }
-       if (first == 1) {
+       if (first == 1 && (_check_rhosts_file || superuser)) {
                struct stat sbuf;
                struct passwd *pwd;
                char pbuf[MAXPATHLEN];
                struct stat sbuf;
                struct passwd *pwd;
                char pbuf[MAXPATHLEN];
@@ -228,8 +236,13 @@ again:
                (void)strcat(pbuf, "/.rhosts");
                if ((hostf = fopen(pbuf, "r")) == NULL)
                        return(-1);
                (void)strcat(pbuf, "/.rhosts");
                if ((hostf = fopen(pbuf, "r")) == NULL)
                        return(-1);
-               (void)fstat(fileno(hostf), &sbuf);
-               if (sbuf.st_uid && sbuf.st_uid != pwd->pw_uid) {
+               /*
+                * if owned by someone other than user or root or if
+                * writeable by anyone but the owner, quit
+                */
+               if (fstat(fileno(hostf), &sbuf) ||
+                   sbuf.st_uid && sbuf.st_uid != pwd->pw_uid ||
+                   sbuf.st_mode&022) {
                        fclose(hostf);
                        return(-1);
                }
                        fclose(hostf);
                        return(-1);
                }
@@ -238,10 +251,11 @@ again:
        return (-1);
 }
 
        return (-1);
 }
 
+static
 _validuser(hostf, rhost, luser, ruser, baselen)
 _validuser(hostf, rhost, luser, ruser, baselen)
-char *rhost, *luser, *ruser;
-FILE *hostf;
-int baselen;
+       char *rhost, *luser, *ruser;
+       FILE *hostf;
+       int baselen;
 {
        char *user;
        char ahost[MAXHOSTNAMELEN];
 {
        char *user;
        char ahost[MAXHOSTNAMELEN];
@@ -271,9 +285,10 @@ int baselen;
        return (-1);
 }
 
        return (-1);
 }
 
+static
 _checkhost(rhost, lhost, len)
 _checkhost(rhost, lhost, len)
-char *rhost, *lhost;
-int len;
+       char *rhost, *lhost;
+       int len;
 {
        static char ldomain[MAXHOSTNAMELEN + 1];
        static char *domainp = NULL;
 {
        static char ldomain[MAXHOSTNAMELEN + 1];
        static char *domainp = NULL;