Date: Mon, 7 Apr 1997 23:21:55 -0400 (EDT) From: Drew Derbyshire <ahd@kew.com> To: FreeBSD-gnats-submit@freebsd.org, ahd@dumbo.hh.kew.com Subject: misc/3225: uucpd.c should normalize host names Message-ID: <199704080321.XAA14775@dumbo.hh.kew.com> Resent-Message-ID: <199704080330.UAA12563@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 3225
>Category: misc
>Synopsis: uucpd.c should normalize host names as login does
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Mon Apr 7 20:30:01 PDT 1997
>Last-Modified:
>Originator: Drew Derbyshire
>Organization:
Kendra Electronic Wonderworks, Stoneham MA
>Release: FreeBSD 2.2-RELEASE i386 (uucpd.c 1.11 from 3.x-current)
>Environment:
uucpd.c instaleld to answer uucico login on port 540
>Description:
uucpd.c tends to end up with the remote host name logged
as IP addresses because it always checks for and/or presents
the full host name. login, on the other hand, automatically
strips the domain off the host name if the local and remote
domains matches.
>How-To-Repeat:
Login via port 540 from a host in the local domain longer
with a host name longer than 32 characters.
>Fix:
Patch follows. Note that I moved the retrieval of the host
name into a common routine which is called at startup; this
may slow the initial presentation of the prompt, but does
not affect overall performance because the login host would
always be logged before control is passed to UUCICO.
I also replaced the local prototype for the logwtmp with the
proper header file, and removed the redundant <sys/param.h>
header.
*** uucpd.c 1997/04/06 03:52:14 1.12
--- uucpd.c 1997/04/06 03:55:06
***************
*** 33,39 ****
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
! * $Id: uucpd.c,v 1.12 1997/04/06 03:52:14 ahd Exp $
*/
#ifndef lint
--- 33,39 ----
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
! * $Id: uucpd.c,v 1.11 1997/04/01 20:39:59 joerg Exp ahd $
*/
#ifndef lint
***************
*** 70,76 ****
#include <string.h>
#include <utmp.h>
#include <syslog.h>
! #include <sys/param.h>
#include "pathnames.h"
#if (MAXLOGNAME-1) > UT_NAMESIZE
--- 70,76 ----
#include <string.h>
#include <utmp.h>
#include <syslog.h>
! #include <libutil.h>
#include "pathnames.h"
#if (MAXLOGNAME-1) > UT_NAMESIZE
***************
*** 86,91 ****
--- 86,92 ----
struct sockaddr_in myctladdr;
int mypid;
+ char remotehost[MAXHOSTNAMELEN];
char Username[64], Logname[64];
char *nenv[] = {
Username,
***************
*** 93,136 ****
NULL,
};
extern char **environ;
- extern void logwtmp(char *line, char *name, char *host);
! void doit(struct sockaddr_in *sinp);
void dologout(void);
int readline(char start[], int num, int passw);
! void dologin(struct passwd *pw, struct sockaddr_in *sin);
void main(int argc, char **argv)
{
environ = nenv;
close(1); close(2);
dup(0); dup(0);
- hisaddrlen = sizeof (hisctladdr);
openlog("uucpd", LOG_PID, LOG_DAEMON);
! if (getpeername(0, (struct sockaddr *)&hisctladdr, &hisaddrlen) < 0) {
! syslog(LOG_ERR, "getpeername: %m");
! _exit(1);
! }
! doit(&hisctladdr);
dologout();
exit(0);
}
! 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));
-
- remotehost[sizeof remotehost - 1] = '\0';
-
syslog(LOG_NOTICE, "LOGIN FAILURE FROM %s", remotehost);
syslog(LOG_AUTHPRIV|LOG_NOTICE,
"LOGIN FAILURE FROM %s, %s", remotehost, name);
--- 94,120 ----
NULL,
};
extern char **environ;
! void doit();
void dologout(void);
int readline(char start[], int num, int passw);
! void dologin(struct passwd *pw);
! void getremotehostname( void );
void main(int argc, char **argv)
{
environ = nenv;
close(1); close(2);
dup(0); dup(0);
openlog("uucpd", LOG_PID, LOG_DAEMON);
! getremotehostname( );
! doit();
dologout();
exit(0);
}
! void badlogin(char *name)
{
syslog(LOG_NOTICE, "LOGIN FAILURE FROM %s", remotehost);
syslog(LOG_AUTHPRIV|LOG_NOTICE,
"LOGIN FAILURE FROM %s, %s", remotehost, name);
***************
*** 139,145 ****
exit(1);
}
! void doit(struct sockaddr_in *sinp)
{
char user[64], passwd[64];
char *xpasswd, *crypt();
--- 123,129 ----
exit(1);
}
! void doit()
{
char user[64], passwd[64];
char *xpasswd, *crypt();
***************
*** 180,186 ****
pwdok = 0;
}
if (!pwdok)
! badlogin(user, sinp);
}
alarm(0);
sprintf(Username, "USER=%s", pw->pw_name);
--- 164,170 ----
pwdok = 0;
}
if (!pwdok)
! badlogin(user);
}
alarm(0);
sprintf(Username, "USER=%s", pw->pw_name);
***************
*** 189,195 ****
syslog(LOG_ERR, "fork: %m");
_exit(1);
} else if (s == 0) {
! dologin(pw, sinp);
setgid(pw->pw_gid);
initgroups(pw->pw_name, pw->pw_gid);
chdir(pw->pw_dir);
--- 173,179 ----
syslog(LOG_ERR, "fork: %m");
_exit(1);
} else if (s == 0) {
! dologin(pw);
setgid(pw->pw_gid);
initgroups(pw->pw_name, pw->pw_gid);
chdir(pw->pw_dir);
***************
*** 243,263 ****
/*
* Record login in wtmp file.
*/
! void dologin(struct passwd *pw, struct sockaddr_in *sin)
{
char line[32];
- char remotehost[MAXHOSTNAMELEN];
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));
/* hack, but must be unique and no tty line */
sprintf(line, "uucp%ld", getpid());
time(&cur_time);
--- 227,237 ----
/*
* Record login in wtmp file.
*/
! void dologin(struct passwd *pw)
{
char line[32];
int f;
time_t cur_time;
/* hack, but must be unique and no tty line */
sprintf(line, "uucp%ld", getpid());
time(&cur_time);
***************
*** 272,275 ****
--- 246,291 ----
(void) close(f);
}
logwtmp(line, pw->pw_name, remotehost);
+ }
+
+ void
+ getremotehostname()
+ {
+ char localhost[MAXHOSTNAMELEN];
+ char *p, *domain;
+
+ struct sockaddr_in hisctladdr;
+ int hisaddrlen = sizeof hisctladdr;
+ struct hostent *hp;
+
+ /* Determine local (admin) domain name, if any */
+ domain = NULL;
+ if (gethostname(localhost, sizeof(localhost)) < 0)
+ syslog(LOG_ERR, "couldn't get local hostname: %m");
+ else
+ domain = strchr(localhost, '.');
+
+ /* Get remote sock info of stdin, in particular IP addr */
+ hisaddrlen = sizeof (hisctladdr);
+ if (getpeername(0, (struct sockaddr *)&hisctladdr, &hisaddrlen) < 0) {
+ syslog(LOG_ERR, "getpeername: %m");
+ _exit(1);
+ }
+
+ /* Now get remote name from IP address */
+ hp = gethostbyaddr((char *)&hisctladdr.sin_addr,
+ sizeof (struct in_addr), AF_INET);
+
+ if (hp) {
+ SCPYN(remotehost, hp->h_name );
+ remotehost[ sizeof remotehost - 1] = '\0';
+
+ /* Drop domain if system in in same domain */
+ if (domain && (p = strchr(remotehost, '.')) &&
+ strcasecmp(p, domain) == 0)
+ *p = 0;
+ endhostent();
+ } else
+ SCPYN(remotehost, inet_ntoa(hisctladdr.sin_addr));
+
}
>Audit-Trail:
>Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199704080321.XAA14775>
