summaryrefslogtreecommitdiffstats
path: root/libexec/rshd/rshd.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1998-12-16 07:20:45 +0000
committerpeter <peter@FreeBSD.org>1998-12-16 07:20:45 +0000
commitb811a3806f179839235ab91554fd7c30ddb75d1c (patch)
tree6ffc10269543127071e3d2a01cd40212590f813f /libexec/rshd/rshd.c
parent41b0bb1bb12a5cf89887a608007adf57417e440f (diff)
downloadFreeBSD-src-b811a3806f179839235ab91554fd7c30ddb75d1c.zip
FreeBSD-src-b811a3806f179839235ab91554fd7c30ddb75d1c.tar.gz
As previously threatened, clean up the rshd -a option and make it default
on rshd and rlogind. However, note that: 1: rshd used to drop a connection with -a if the hostname != ip address. This is unneeded, because iruserok() does it's own checking. It was also wrong if .rhosts had an explicit IP address in it, connections would be dropped from that host solely because the DNS was mismatched even though it was explicitly intended to work by IP address. 2: rlogind and rshd check the hostname mappings by default now because that is what goes into the utmp/wtmp and logs. If the hostname != ip address, then it uses the IP address for logging/utmp/wtmp purposes. There isn't much point logging ficticious hostnames. 3: rshd -a is now accepted (but ignored) for compatability. If you really want to make life miserable for people with bad reverse DNS, use tcpd in paranoid mode (which is questionable anyway, given DNS ttl tweaking).
Diffstat (limited to 'libexec/rshd/rshd.c')
-rw-r--r--libexec/rshd/rshd.c79
1 files changed, 26 insertions, 53 deletions
diff --git a/libexec/rshd/rshd.c b/libexec/rshd/rshd.c
index 1f3278a..cd2f57c 100644
--- a/libexec/rshd/rshd.c
+++ b/libexec/rshd/rshd.c
@@ -42,7 +42,7 @@ static const char copyright[] =
static const char sccsid[] = "@(#)rshd.c 8.2 (Berkeley) 4/6/94";
#endif
static const char rcsid[] =
- "$Id: rshd.c,v 1.21 1998/05/05 00:28:51 rnordier Exp $";
+ "$Id: rshd.c,v 1.22 1998/12/01 23:27:24 dg Exp $";
#endif /* not lint */
/*
@@ -80,7 +80,6 @@ static const char rcsid[] =
#endif
int keepalive = 1;
-int check_all;
int log_success; /* If TRUE, log all successful accesses */
int sent_null;
int no_delay;
@@ -122,7 +121,7 @@ main(argc, argv)
while ((ch = getopt(argc, argv, OPTIONS)) != -1)
switch (ch) {
case 'a':
- check_all = 1;
+ /* ignored for compatability */
break;
case 'l':
__check_rhosts_file = 0;
@@ -214,10 +213,9 @@ doit(fromp)
fd_set ready, readfrom;
int cc, nfd, pv[2], pid, s;
int one = 1;
- char *hostname, *errorstr, *errorhost;
+ char *hostname, *errorstr;
char *cp, sig, buf[BUFSIZ];
char cmdbuf[NCARGS+1], locuser[16], remuser[16];
- char remotehost[2 * MAXHOSTNAMELEN + 1];
char fromhost[2 * MAXHOSTNAMELEN + 1];
#ifdef LOGIN_CAP
login_cap_t *lc;
@@ -296,6 +294,7 @@ doit(fromp)
(void) alarm(60);
port = 0;
+ s = 0; /* not set or used if port == 0 */
for (;;) {
char c;
if ((cc = read(STDIN_FILENO, &c, 1)) != 1) {
@@ -304,7 +303,7 @@ doit(fromp)
shutdown(0, 1+1);
exit(1);
}
- if (c== 0)
+ if (c == 0)
break;
port = port * 10 + c - '0';
}
@@ -349,64 +348,38 @@ doit(fromp)
dup2(f, 2);
#endif
errorstr = NULL;
+ strncpy(fromhost, inet_ntoa(fromp->sin_addr),
+ sizeof(fromhost) - 1);
+ hostname = fromhost;
hp = gethostbyaddr((char *)&fromp->sin_addr, sizeof (struct in_addr),
fromp->sin_family);
if (hp) {
/*
- * If name returned by gethostbyaddr is in our domain,
- * attempt to verify that we haven't been fooled by someone
- * in a remote net; look up the name and check that this
- * address corresponds to the name.
+ * OK, it looks like a DNS name is attached.. Lets see if
+ * it looks like we can use it. If it doesn't check out,
+ * ditch it and use the IP address for logging instead.
+ * Note that iruserok() does it's own hostname checking!!
*/
strncpy(fromhost, hp->h_name, sizeof(fromhost) - 1);
fromhost[sizeof(fromhost) - 1] = 0;
- hostname = fromhost;
-#ifdef KERBEROS
- if (!use_kerberos)
-#endif
- if (check_all || local_domain(hp->h_name)) {
- strncpy(remotehost, hp->h_name, sizeof(remotehost) - 1);
- remotehost[sizeof(remotehost) - 1] = 0;
- 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";
+ hp = gethostbyname(fromhost);
+ if (hp == NULL) {
+ strncpy(fromhost, inet_ntoa(fromp->sin_addr),
+ sizeof(fromhost) - 1);
+ } else for (; ; hp->h_addr_list++) {
+ if (hp->h_addr_list[0] == NULL) {
+ /* End of list - ditch it */
strncpy(fromhost, inet_ntoa(fromp->sin_addr),
sizeof(fromhost) - 1);
- fromhost[sizeof(fromhost) - 1] = 0;
- hostname = fromhost;
- } 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";
- strncpy(fromhost, inet_ntoa(fromp->sin_addr),
- sizeof(fromhost) - 1);
- fromhost[sizeof(fromhost) - 1] = 0;
- hostname = fromhost;
- break;
- }
- if (!bcmp(hp->h_addr_list[0],
- (caddr_t)&fromp->sin_addr,
- sizeof(fromp->sin_addr))) {
- hostname = remotehost;
- break;
- }
+ break;
}
+ if (!bcmp(hp->h_addr_list[0],
+ (caddr_t)&fromp->sin_addr,
+ sizeof(fromp->sin_addr)))
+ break; /* OK! */
}
- } else {
- strncpy(fromhost, inet_ntoa(fromp->sin_addr),
- sizeof(fromhost) - 1);
- fromhost[sizeof(fromhost) - 1] = 0;
- errorhost = hostname = fromhost;
}
+ fromhost[sizeof(fromhost) - 1] = 0;
#ifdef KERBEROS
if (use_kerberos) {
@@ -515,7 +488,7 @@ doit(fromp)
fail:
if (errorstr == NULL)
errorstr = "Login incorrect.\n";
- error(errorstr, errorhost);
+ error(errorstr, hostname);
exit(1);
}
OpenPOWER on IntegriCloud