Use realhostname() rather than various combinations of

gethostbyaddr() & gethostbyname().

Remove brokeness in ftpd for hosts of MAXHOSTNAMELEN length.
This commit is contained in:
Brian Somers 1999-04-06 23:06:00 +00:00
parent 595f220e04
commit 32af26a501
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=45393
9 changed files with 51 additions and 170 deletions

View File

@ -42,10 +42,10 @@ static const char copyright[] =
static char sccsid[] = "@(#)fingerd.c 8.1 (Berkeley) 6/4/93";
#endif
static const char rcsid[] =
"$Id: fingerd.c,v 1.10 1997/11/20 07:26:04 charnier Exp $";
"$Id: fingerd.c,v 1.11 1998/05/15 03:23:28 jb Exp $";
#endif /* not lint */
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
@ -70,11 +70,11 @@ main(argc, argv)
register FILE *fp;
register int ch;
register char *lp;
struct hostent *hp;
struct sockaddr_in sin;
int p[2], logging, secure, sval;
#define ENTRIES 50
char **ap, *av[ENTRIES + 1], **comp, line[1024], *prog;
char rhost[MAXHOSTNAMELEN + 1];
prog = _PATH_FINGER;
logging = secure = 0;
@ -130,12 +130,8 @@ main(argc, argv)
sval = sizeof(sin);
if (getpeername(0, (struct sockaddr *)&sin, &sval) < 0)
logerr("getpeername: %s", strerror(errno));
if (hp = gethostbyaddr((char *)&sin.sin_addr.s_addr,
sizeof(sin.sin_addr.s_addr), AF_INET))
lp = hp->h_name;
else
lp = inet_ntoa(sin.sin_addr);
syslog(LOG_NOTICE, "query from %s: `%s'", lp, t);
realhostname(rhost, sizeof rhost - 1, &sin.sin_addr);
syslog(LOG_NOTICE, "query from %s: `%s'", rhost, t);
}
comp = &av[1];

View File

@ -44,7 +44,7 @@ static char copyright[] =
static char sccsid[] = "@(#)ftpd.c 8.4 (Berkeley) 4/16/94";
#endif
static const char rcsid[] =
"$Id: ftpd.c,v 1.51 1998/06/03 11:33:44 jb Exp $";
"$Id: ftpd.c,v 1.52 1998/10/13 20:42:01 des Exp $";
#endif /* not lint */
/*
@ -166,7 +166,7 @@ static struct ftphost {
} *thishost, *firsthost;
#endif
char remotehost[MAXHOSTNAMELEN];
char remotehost[MAXHOSTNAMELEN + 1];
char *ident = NULL;
static char ttyline[20];
@ -1896,14 +1896,8 @@ static void
dolog(sin)
struct sockaddr_in *sin;
{
struct hostent *hp = gethostbyaddr((char *)&sin->sin_addr,
sizeof(struct in_addr), AF_INET);
realhostname(remotehost, sizeof remotehost - 1, &sin->sin_addr);
if (hp)
(void) strncpy(remotehost, hp->h_name, sizeof(remotehost));
else
(void) strncpy(remotehost, inet_ntoa(sin->sin_addr),
sizeof(remotehost));
#ifdef SETPROCTITLE
#ifdef VIRTUAL_HOSTING
if (thishost != firsthost)

View File

@ -42,7 +42,7 @@ static const char copyright[] =
static char sccsid[] = "@(#)rexecd.c 8.1 (Berkeley) 6/4/93";
#endif
static const char rcsid[] =
"$Id$";
"$Id: rexecd.c,v 1.15 1997/11/26 07:29:04 charnier Exp $";
#endif /* not lint */
#include <sys/param.h>
@ -55,6 +55,7 @@ static const char rcsid[] =
#include <err.h>
#include <netdb.h>
#include <libutil.h>
#include <paths.h>
#include <pwd.h>
#include <signal.h>
@ -72,7 +73,7 @@ char path[sizeof(_PATH_DEFPATH) + sizeof("PATH=")] = "PATH=";
char *envinit[] =
{homedir, shell, path, username, 0};
char **environ;
char *remote;
char remote[MAXHOSTNAMELEN + 1];
struct sockaddr_in asin = { AF_INET };
@ -103,10 +104,7 @@ main(argc, argv)
if (getpeername(0, (struct sockaddr *)&from, &fromlen) < 0)
err(1, "getpeername");
hp = gethostbyaddr((char *) &from.sin_addr, sizeof(from.sin_addr),
from.sin_family);
remote = inet_ntoa(from.sin_addr);
remote = (hp != NULL) ? hp->h_name : inet_ntoa(from.sin_addr);
realhostname(remote, sizeof remote - 1, &from.sin_addr);
doit(0, &from);
return(0);

View File

@ -42,7 +42,7 @@ static const char copyright[] =
static const char sccsid[] = "@(#)rlogind.c 8.1 (Berkeley) 6/4/93";
#endif
static const char rcsid[] =
"$Id: rlogind.c,v 1.19 1997/11/25 07:17:15 charnier Exp $";
"$Id: rlogind.c,v 1.20 1998/12/16 07:20:44 peter Exp $";
#endif /* not lint */
/*
@ -211,7 +211,6 @@ doit(f, fromp)
{
int master, pid, on = 1;
int authenticated = 0;
register struct hostent *hp;
char hostname[2 * MAXHOSTNAMELEN + 1];
char c;
@ -227,31 +226,7 @@ doit(f, fromp)
alarm(0);
fromp->sin_port = ntohs((u_short)fromp->sin_port);
hp = gethostbyaddr((char *)&fromp->sin_addr, sizeof(struct in_addr),
fromp->sin_family);
if (hp) {
strncpy(hostname, hp->h_name, sizeof(hostname) - 1);
hostname[sizeof(hostname) - 1] = '\0';
hp = gethostbyname(hostname);
if (hp == NULL) {
strncpy(hostname, inet_ntoa(fromp->sin_addr),
sizeof(hostname) - 1);
} else for (; ; hp->h_addr_list++) {
if (hp->h_addr_list[0] == NULL) {
/* End of list - ditch it */
strncpy(hostname, inet_ntoa(fromp->sin_addr),
sizeof(hostname) - 1);
break;
}
if (!bcmp(hp->h_addr_list[0],
(caddr_t)&fromp->sin_addr,
sizeof(fromp->sin_addr)))
break; /* OK! */
}
} else {
strncpy(hostname, inet_ntoa(fromp->sin_addr),
sizeof(hostname) - 1);
}
realhostname(hostname, sizeof hostname - 1, &fromp->sin_addr);
hostname[sizeof(hostname) - 1] = '\0';
#ifdef KERBEROS

View File

@ -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.22 1998/12/01 23:27:24 dg Exp $";
"$Id: rshd.c,v 1.23 1998/12/16 07:20:45 peter Exp $";
#endif /* not lint */
/*
@ -67,6 +67,7 @@ static const char rcsid[] =
#include <errno.h>
#include <fcntl.h>
#include <libutil.h>
#include <paths.h>
#include <pwd.h>
#include <signal.h>
@ -207,13 +208,12 @@ doit(fromp)
struct sockaddr_in *fromp;
{
extern char *__rcmd_errstr; /* syslog hook from libc/net/rcmd.c. */
struct hostent *hp;
struct passwd *pwd;
u_short port;
fd_set ready, readfrom;
int cc, nfd, pv[2], pid, s;
int one = 1;
char *hostname, *errorstr;
char *errorstr;
char *cp, sig, buf[BUFSIZ];
char cmdbuf[NCARGS+1], locuser[16], remuser[16];
char fromhost[2 * MAXHOSTNAMELEN + 1];
@ -350,36 +350,8 @@ doit(fromp)
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) {
/*
* 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;
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);
break;
}
if (!bcmp(hp->h_addr_list[0],
(caddr_t)&fromp->sin_addr,
sizeof(fromp->sin_addr)))
break; /* OK! */
}
}
fromhost[sizeof(fromhost) - 1] = 0;
realhostname(fromhost, sizeof fromhost - 1, &fromp->sin_addr);
fromhost[sizeof(fromhost) - 1] = '\0';
#ifdef KERBEROS
if (use_kerberos) {
@ -426,7 +398,7 @@ doit(fromp)
if (pwd == NULL) {
syslog(LOG_INFO|LOG_AUTH,
"%s@%s as %s: unknown login. cmd='%.80s'",
remuser, hostname, locuser, cmdbuf);
remuser, fromhost, locuser, cmdbuf);
if (errorstr == NULL)
errorstr = "Login incorrect.\n";
goto fail;
@ -440,7 +412,7 @@ doit(fromp)
login_getcapbool(lc, "requirehome", !!pwd->pw_uid)) {
syslog(LOG_INFO|LOG_AUTH,
"%s@%s as %s: no home directory. cmd='%.80s'",
remuser, hostname, locuser, cmdbuf);
remuser, fromhost, locuser, cmdbuf);
error("No remote home directory.\n");
exit(0);
}
@ -449,7 +421,7 @@ doit(fromp)
#ifdef notdef
syslog(LOG_INFO|LOG_AUTH,
"%s@%s as %s: no home directory. cmd='%.80s'",
remuser, hostname, locuser, cmdbuf);
remuser, fromhost, locuser, cmdbuf);
error("No remote directory.\n");
exit(1);
#endif
@ -479,16 +451,16 @@ doit(fromp)
if (__rcmd_errstr)
syslog(LOG_INFO|LOG_AUTH,
"%s@%s as %s: permission denied (%s). cmd='%.80s'",
remuser, hostname, locuser, __rcmd_errstr,
remuser, fromhost, locuser, __rcmd_errstr,
cmdbuf);
else
syslog(LOG_INFO|LOG_AUTH,
"%s@%s as %s: permission denied. cmd='%.80s'",
remuser, hostname, locuser, cmdbuf);
remuser, fromhost, locuser, cmdbuf);
fail:
if (errorstr == NULL)
errorstr = "Login incorrect.\n";
error(errorstr, hostname);
error(errorstr, fromhost);
exit(1);
}
@ -506,7 +478,7 @@ doit(fromp)
if (!auth_hostok(lc, fromhost, remote_ip)) {
syslog(LOG_INFO|LOG_AUTH,
"%s@%s as %s: permission denied (%s). cmd='%.80s'",
remuser, hostname, locuser, __rcmd_errstr,
remuser, fromhost, locuser, __rcmd_errstr,
cmdbuf);
error("Login incorrect.\n");
exit(1);
@ -729,11 +701,11 @@ doit(fromp)
syslog(LOG_INFO|LOG_AUTH,
"Kerberos shell from %s.%s@%s on %s as %s, cmd='%.80s'",
kdata->pname, kdata->pinst, kdata->prealm,
hostname, locuser, cmdbuf);
fromhost, locuser, cmdbuf);
else
#endif
syslog(LOG_INFO|LOG_AUTH, "%s@%s as %s: cmd='%.80s'",
remuser, hostname, locuser, cmdbuf);
remuser, fromhost, locuser, cmdbuf);
}
execl(pwd->pw_shell, cp, "-c", cmdbuf, 0);
perror(pwd->pw_shell);

View File

@ -42,7 +42,7 @@ static const char copyright[] =
static char sccsid[] = "@(#)telnetd.c 8.2 (Berkeley) 12/15/93";
#endif
static const char rcsid[] =
"$Id: telnetd.c,v 1.15 1998/12/16 06:04:29 peter Exp $";
"$Id: telnetd.c,v 1.16 1999/04/06 00:29:41 brian Exp $";
#endif /* not lint */
#include "telnetd.h"
@ -61,6 +61,8 @@ static const char rcsid[] =
#include <arpa/inet.h>
#include <sys/mman.h>
#include <libutil.h>
#include <utmp.h>
#if defined(_SC_CRAY_SECURE_SYS)
#include <sys/sysv.h>
@ -756,7 +758,7 @@ terminaltypeok(s)
char *hostname;
char host_name[MAXHOSTNAMELEN];
char remote_host_name[MAXHOSTNAMELEN];
char remote_hostname[UT_HOSTSIZE + 1];
extern void telnet P((int, int, char *));
@ -769,8 +771,6 @@ char user_name[256];
doit(who)
struct sockaddr_in *who;
{
char *host = NULL;
struct hostent *hp;
int ptynum;
/*
@ -813,47 +813,16 @@ doit(who)
#endif /* _SC_CRAY_SECURE_SYS */
/* get name of connected client */
hp = gethostbyaddr((char *)&who->sin_addr, sizeof (struct in_addr),
who->sin_family);
if (hp == NULL && registerd_host_only) {
if (realhostname(remote_hostname, sizeof remote_hostname - 1,
&who->sin_addr) == HOSTNAME_INVALIDADDR && registerd_host_only)
fatal(net, "Couldn't resolve your address into a host name.\r\n\
Please contact your net administrator");
} else if (hp &&
(strlen(hp->h_name) <= ((utmp_len < 0) ? -utmp_len : utmp_len))) {
strncpy(remote_host_name, hp->h_name,
sizeof(remote_host_name)-1);
hp = gethostbyname(remote_host_name);
if (hp == NULL)
host = inet_ntoa(who->sin_addr);
else for (; ; hp->h_addr_list++) {
if (hp->h_addr_list[0] == NULL) {
/* End of list - ditch it */
host = inet_ntoa(who->sin_addr);
break;
}
if (!bcmp(hp->h_addr_list[0], (caddr_t)&who->sin_addr,
sizeof(who->sin_addr))) {
host = hp->h_name;
break; /* OK! */
}
}
} else {
host = inet_ntoa(who->sin_addr);
}
/*
* We must make a copy because Kerberos is probably going
* to also do a gethost* and overwrite the static data...
*/
strncpy(remote_host_name, host, sizeof(remote_host_name)-1);
remote_host_name[sizeof(remote_host_name)-1] = 0;
host = remote_host_name;
(void) gethostname(host_name, sizeof (host_name));
hostname = host_name;
#if defined(AUTHENTICATION)
auth_encrypt_init(hostname, host, "TELNETD", 1);
auth_encrypt_init(hostname, remote_hostname, "TELNETD", 1);
#endif
init_env();
@ -873,7 +842,7 @@ doit(who)
}
#endif /* _SC_CRAY_SECURE_SYS */
telnet(net, pty, host); /* begin server process */
telnet(net, pty, remote_hostname); /* begin server process */
/*NOTREACHED*/
} /* end of doit */

View File

@ -1,8 +1,10 @@
# @(#)Makefile 8.1 (Berkeley) 6/4/93
# $Id$
# $Id: Makefile,v 1.5 1997/02/22 14:22:35 peter Exp $
PROG= tftpd
SRCS= tftpd.c tftpsubs.c
DPADD= ${LIBUTIL}
LDADD= -lutil
MAN8= tftpd.8
CFLAGS+=-I${.CURDIR}/../../usr.bin/tftp
.PATH: ${.CURDIR}/../../usr.bin/tftp

View File

@ -42,7 +42,7 @@ static const char copyright[] =
static char sccsid[] = "@(#)tftpd.c 8.1 (Berkeley) 6/4/93";
#endif
static const char rcsid[] =
"$Id: tftpd.c,v 1.11 1998/04/12 11:15:54 phk Exp $";
"$Id: tftpd.c,v 1.12 1998/10/30 16:17:39 dg Exp $";
#endif /* not lint */
/*
@ -65,6 +65,7 @@ static const char rcsid[] =
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <libutil.h>
#include <netdb.h>
#include <pwd.h>
#include <setjmp.h>
@ -108,7 +109,6 @@ static int logging;
static char *errtomsg __P((int));
static void nak __P((int));
static char *verifyhost __P((struct sockaddr_in *));
int
main(argc, argv)
@ -325,8 +325,11 @@ tftp(tp, size)
}
ecode = (*pf->f_validate)(&filename, tp->th_opcode);
if (logging) {
syslog(LOG_INFO, "%s: %s request for %s: %s",
verifyhost(&from),
char host[MAXHOSTNAMELEN + 1];
realhostname(host, sizeof host - 1, &from.sin_addr);
host[sizeof host - 1] = '\0';
syslog(LOG_INFO, "%s: %s request for %s: %s", host,
tp->th_opcode == WRQ ? "write" : "read",
filename, errtomsg(ecode));
}
@ -670,17 +673,3 @@ nak(error)
if (send(peer, buf, length, 0) != length)
syslog(LOG_ERR, "nak: %m");
}
static char *
verifyhost(fromp)
struct sockaddr_in *fromp;
{
struct hostent *hp;
hp = gethostbyaddr((char *)&fromp->sin_addr, sizeof (fromp->sin_addr),
fromp->sin_family);
if (hp)
return hp->h_name;
else
return inet_ntoa(fromp->sin_addr);
}

View File

@ -45,7 +45,7 @@ static const char copyright[] =
static char sccsid[] = "@(#)uucpd.c 8.1 (Berkeley) 6/4/93";
#endif
static const char rcsid[] =
"$Id: uucpd.c,v 1.15 1998/06/30 15:19:51 bde Exp $";
"$Id: uucpd.c,v 1.16 1999/03/30 10:23:35 joerg Exp $";
#endif /* not lint */
/*
@ -121,16 +121,8 @@ void main(int argc, char **argv)
void badlogin(char *name, struct sockaddr_in *sin)
{
char remotehost[MAXHOSTNAMELEN];
struct hostent *hp = gethostbyaddr((char *)&sin->sin_addr,
sizeof (struct in_addr), AF_INET);
if (hp) {
strncpy(remotehost, hp->h_name, sizeof (remotehost));
endhostent();
} else
strncpy(remotehost, inet_ntoa(sin->sin_addr),
sizeof (remotehost));
realhostname(remotehost, sizeof remotehost - 1, &sin->sin_addr);
remotehost[sizeof remotehost - 1] = '\0';
syslog(LOG_NOTICE, "LOGIN FAILURE FROM %s", remotehost);
@ -251,19 +243,13 @@ void dologout(void)
void dologin(struct passwd *pw, struct sockaddr_in *sin)
{
char line[32];
char remotehost[MAXHOSTNAMELEN];
char remotehost[UT_HOSTSIZE + 1];
int f;
time_t cur_time;
struct hostent *hp = gethostbyaddr((char *)&sin->sin_addr,
sizeof (struct in_addr), AF_INET);
if (hp) {
strncpy(remotehost, hp->h_name, sizeof (remotehost));
endhostent();
} else
strncpy(remotehost, inet_ntoa(sin->sin_addr),
sizeof (remotehost));
realhostname(remotehost, sizeof remotehost - 1, &sin->sin_addr);
remotehost[sizeof remotehost - 1] = '\0';
/* hack, but must be unique and no tty line */
sprintf(line, "uucp%ld", (long)getpid());
time(&cur_time);