sockaddr's now require length (K. Sklower);
[unix-history] / usr / src / lib / libc / net / rcmd.c
index 1989488..16c2cc6 100644 (file)
@@ -1,12 +1,23 @@
 /*
  * Copyright (c) 1983 Regents of the University of California.
 /*
  * Copyright (c) 1983 Regents of the University of California.
- * All rights reserved.  The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * 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.12 (Berkeley) %G%";
-#endif LIBC_SCCS and not lint
+static char sccsid[] = "@(#)rcmd.c     5.19 (Berkeley) %G%";
+#endif /* LIBC_SCCS and not lint */
 
 #include <stdio.h>
 #include <ctype.h>
 
 #include <stdio.h>
 #include <ctype.h>
@@ -23,7 +34,7 @@ static char sccsid[] = "@(#)rcmd.c    5.12 (Berkeley) %G%";
 #include <errno.h>
 
 extern errno;
 #include <errno.h>
 
 extern errno;
-char   *index(), *sprintf();
+char   *index();
 
 rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
        char **ahost;
 
 rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
        char **ahost;
@@ -41,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;
@@ -157,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)
@@ -178,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;
@@ -210,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];
@@ -222,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);
                }
@@ -232,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];
@@ -265,12 +285,14 @@ 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;
+       static int nodomain = 0;
        register char *cp;
 
        if (len == -1)
        register char *cp;
 
        if (len == -1)
@@ -281,21 +303,21 @@ int len;
                return(1);
        if (*(lhost + len) != '\0')
                return(0);
                return(1);
        if (*(lhost + len) != '\0')
                return(0);
+       if (nodomain)
+               return(0);
        if (!domainp) {
                if (gethostname(ldomain, sizeof(ldomain)) == -1) {
        if (!domainp) {
                if (gethostname(ldomain, sizeof(ldomain)) == -1) {
-                       domainp = (char *)1;
+                       nodomain = 1;
                        return(0);
                }
                ldomain[MAXHOSTNAMELEN] = NULL;
                        return(0);
                }
                ldomain[MAXHOSTNAMELEN] = NULL;
-               if ((domainp = index(ldomain, '.') + 1) == (char *)1)
+               if ((domainp = index(ldomain, '.')) == (char *)NULL) {
+                       nodomain = 1;
                        return(0);
                        return(0);
-               cp = domainp;
-               while (*cp) {
-                       *cp = isupper(*cp) ? tolower(*cp) : *cp;
-                       cp++;
                }
                }
+               for (cp = ++domainp; *cp; ++cp)
+                       if (isupper(*cp))
+                               *cp = tolower(*cp);
        }
        }
-       if (domainp == (char *)1)
-               return(0);
        return(!strcmp(domainp, rhost + len +1));
 }
        return(!strcmp(domainp, rhost + len +1));
 }