diff options
-rw-r--r-- | usr.sbin/lpr/common_source/common.c | 5 | ||||
-rw-r--r-- | usr.sbin/lpr/common_source/displayq.c | 14 | ||||
-rw-r--r-- | usr.sbin/lpr/common_source/lp.h | 22 | ||||
-rw-r--r-- | usr.sbin/lpr/common_source/net.c | 12 | ||||
-rw-r--r-- | usr.sbin/lpr/common_source/rmjob.c | 23 | ||||
-rw-r--r-- | usr.sbin/lpr/lpd/extern.h | 1 | ||||
-rw-r--r-- | usr.sbin/lpr/lpd/lpd.c | 39 | ||||
-rw-r--r-- | usr.sbin/lpr/lpd/printjob.c | 21 | ||||
-rw-r--r-- | usr.sbin/lpr/lpd/recvjob.c | 7 | ||||
-rw-r--r-- | usr.sbin/lpr/lpq/lpq.c | 2 | ||||
-rw-r--r-- | usr.sbin/lpr/lpr/lpr.c | 11 | ||||
-rw-r--r-- | usr.sbin/lpr/lprm/lprm.c | 2 |
12 files changed, 90 insertions, 69 deletions
diff --git a/usr.sbin/lpr/common_source/common.c b/usr.sbin/lpr/common_source/common.c index 8e705db..8c434b0 100644 --- a/usr.sbin/lpr/common_source/common.c +++ b/usr.sbin/lpr/common_source/common.c @@ -553,8 +553,9 @@ fatal(pp, msg, va_alist) #else va_start(ap); #endif - if (from != host) - (void)printf("%s: ", host); + /* this error message is being sent to the 'from_host' */ + if (from_host != local_host) + (void)printf("%s: ", local_host); (void)printf("%s: ", progname); if (pp && pp->printer) (void)printf("%s: ", pp->printer); diff --git a/usr.sbin/lpr/common_source/displayq.c b/usr.sbin/lpr/common_source/displayq.c index df82d56..7eef91e 100644 --- a/usr.sbin/lpr/common_source/displayq.c +++ b/usr.sbin/lpr/common_source/displayq.c @@ -127,7 +127,7 @@ displayq(struct printer *pp, int format) if (ret >= 0) { if (statb.st_mode & LFM_PRINT_DIS) { if (pp->remote) - printf("%s: ", host); + printf("%s: ", local_host); printf("Warning: %s is down: ", pp->printer); seteuid(euid); fd = open(pp->status_file, O_RDONLY|O_SHLOCK); @@ -141,7 +141,7 @@ displayq(struct printer *pp, int format) } if (statb.st_mode & LFM_QUEUE_DIS) { if (pp->remote) - printf("%s: ", host); + printf("%s: ", local_host); printf("Warning: %s queue is turned off\n", pp->printer); } @@ -179,7 +179,7 @@ displayq(struct printer *pp, int format) * Print the status file. */ if (pp->remote) - printf("%s: ", host); + printf("%s: ", local_host); seteuid(euid); fd = open(pp->status_file, O_RDONLY|O_SHLOCK); seteuid(uid); @@ -238,8 +238,8 @@ displayq(struct printer *pp, int format) alarm(0); (void)signal(SIGALRM, savealrm); if (fd < 0) { - if (from != host) - printf("%s: ", host); + if (from_host != local_host) + printf("%s: ", local_host); printf("connection to %s is down\n", pp->remote_host); } else { @@ -259,7 +259,7 @@ static void warn(const struct printer *pp) { if (pp->remote) - printf("%s: ", host); + printf("%s: ", local_host); puts("Warning: no daemon present"); current[0] = '\0'; } @@ -396,7 +396,7 @@ inlist(char *uname, char *cfile) for (n = 0, cp = cfile+3; isdigit(*cp); ) n = n * 10 + (*cp++ - '0'); for (r = requ; r < &requ[requests]; r++) - if (*r == n && !strcmp(cp, from)) + if (*r == n && !strcmp(cp, from_host)) return(1); return(0); } diff --git a/usr.sbin/lpr/common_source/lp.h b/usr.sbin/lpr/common_source/lp.h index 3cee695..9ca0612 100644 --- a/usr.sbin/lpr/common_source/lp.h +++ b/usr.sbin/lpr/common_source/lp.h @@ -154,10 +154,24 @@ struct request { */ extern char line[BUFSIZ]; extern const char *progname; /* program name (lpr, lpq, etc) */ - /* host machine name */ -extern char host[MAXHOSTNAMELEN]; -extern char *from; /* client's machine name */ -extern char from_ip[NI_MAXHOST]; /* client machine's IP address */ + + /* + * 'local_host' is the name of the machine that lpd (lpr, whatever) + * is actually running on. + * + * 'from_host' will point to the 'host' variable when receiving a job + * from a user on the same host, or "somewhere else" when receiving a + * job from a remote host. If 'from_host != local_host', then 'from_ip' + * is the character representation of the IP address of from_host (note + * that string could be an IPv6 address). + * + * Also note that when 'from_host' is not pointing at 'local_host', the + * string it is pointing at may be as long as NI_MAXHOST (which is very + * likely to be much longer than MAXHOSTNAMELEN). + */ +extern char local_host[MAXHOSTNAMELEN]; +extern const char *from_host; /* client's machine name */ +extern const char *from_ip; /* client machine's IP address */ extern int requ[]; /* job number of spool entries */ extern int requests; /* # of spool requests */ diff --git a/usr.sbin/lpr/common_source/net.c b/usr.sbin/lpr/common_source/net.c index 619c253..df70ef4 100644 --- a/usr.sbin/lpr/common_source/net.c +++ b/usr.sbin/lpr/common_source/net.c @@ -65,9 +65,15 @@ static const char rcsid[] = #include "lp.local.h" #include "pathnames.h" -char host[MAXHOSTNAMELEN]; /* host machine name */ -char *from = host; /* client's machine name */ -char from_ip[NI_MAXHOST] = ""; /* client machine's IP address */ +/* + * 'local_host' is always the hostname of the machine which is running + * lpr (lpd, whatever), while 'from_host' either points at 'local_host' + * or points at a different buffer when receiving a job from a remote + * machine (and that buffer has the hostname of that remote machine). + */ +char local_host[MAXHOSTNAMELEN]; /* host running lpd/lpr */ +const char *from_host = local_host; /* client's machine name */ +const char *from_ip = ""; /* client machine's IP address */ #ifdef INET6 u_char family = PF_UNSPEC; diff --git a/usr.sbin/lpr/common_source/rmjob.c b/usr.sbin/lpr/common_source/rmjob.c index 39a7d0f..3a60efb 100644 --- a/usr.sbin/lpr/common_source/rmjob.c +++ b/usr.sbin/lpr/common_source/rmjob.c @@ -106,9 +106,9 @@ rmjob(const char *printer) } } if (!strcmp(person, "-all")) { - if (from == host) + if (from_host == local_host) fatal(pp, "The login name \"-all\" is reserved"); - all = 1; /* all those from 'from' */ + all = 1; /* all those from 'from_host' */ person = root; } @@ -218,8 +218,8 @@ do_unlink(char *file) { int ret; - if (from != host) - printf("%s: ", host); + if (from_host != local_host) + printf("%s: ", local_host); seteuid(euid); ret = unlink(file); seteuid(uid); @@ -242,7 +242,7 @@ chk(char *file) if (strlen(file) < 7 || file[0] != 'c' || file[1] != 'f') return(0); - if (all && (from == host || !strcmp(from, file+6))) + if (all && (from_host == local_host || !strcmp(from_host, file+6))) return(1); /* @@ -288,12 +288,13 @@ chk(char *file) int isowner(char *owner, char *file) { - if (!strcmp(person, root) && (from == host || !strcmp(from, file+6))) + if (!strcmp(person, root) && (from_host == local_host || + !strcmp(from_host, file+6))) return (1); - if (!strcmp(person, owner) && !strcmp(from, file+6)) + if (!strcmp(person, owner) && !strcmp(from_host, file+6)) return (1); - if (from != host) - printf("%s: ", host); + if (from_host != local_host) + printf("%s: ", local_host); printf("%s: Permission denied\n", file); return(0); } @@ -362,8 +363,8 @@ rmremote(const struct printer *pp) rem = getport(pp, pp->remote_host, 0); (void)signal(SIGALRM, savealrm); if (rem < 0) { - if (from != host) - printf("%s: ", host); + if (from_host != local_host) + printf("%s: ", local_host); printf("connection to %s is down\n", pp->remote_host); } else { if (writev(rem, iov, niov) != totlen) diff --git a/usr.sbin/lpr/lpd/extern.h b/usr.sbin/lpr/lpd/extern.h index dc9b109..497594e 100644 --- a/usr.sbin/lpr/lpd/extern.h +++ b/usr.sbin/lpr/lpd/extern.h @@ -37,7 +37,6 @@ #include <sys/cdefs.h> extern char scnkey[][HEIGHT]; /* in lpdchar.c */ -extern char fromb[]; extern int lflag; /* in lpd.c */ struct printer; diff --git a/usr.sbin/lpr/lpd/lpd.c b/usr.sbin/lpr/lpd/lpd.c index d7de749..ed912c9 100644 --- a/usr.sbin/lpr/lpd/lpd.c +++ b/usr.sbin/lpr/lpd/lpd.c @@ -138,7 +138,7 @@ main(int argc, char **argv) euid = geteuid(); /* these shouldn't be different */ uid = getuid(); socket_debug = 0; - gethostname(host, sizeof(host)); + gethostname(local_host, sizeof(local_host)); progname = "lpd"; @@ -413,7 +413,8 @@ int requ[MAXREQUESTS]; /* job number of spool entries */ int requests; /* # of spool requests */ char *person; /* name of person doing lprm */ -char fromb[MAXHOSTNAMELEN]; /* buffer for client's machine name */ + /* buffer to hold the client's machine-name */ +static char frombuf[MAXHOSTNAMELEN]; char cbuf[BUFSIZ]; /* command line buffer */ const char *cmdnames[] = { "null", @@ -450,10 +451,10 @@ doit(void) if (lflag) { if (*cp >= '\1' && *cp <= '\5') syslog(LOG_INFO, "%s requests %s %s", - from, cmdnames[(u_char)*cp], cp+1); + from_host, cmdnames[(u_char)*cp], cp+1); else syslog(LOG_INFO, "bad request (%d) from %s", - *cp, from); + *cp, from_host); } switch (*cp++) { case CMD_CHECK_QUE: /* check the queue, print any jobs there */ @@ -611,7 +612,7 @@ chkhost(struct sockaddr *f) register FILE *hostf; int first = 1; int good = 0; - char host[NI_MAXHOST], ip[NI_MAXHOST]; + char hostbuf[NI_MAXHOST], ip[NI_MAXHOST]; char serv[NI_MAXSERV]; int error, addrlen; caddr_t addr; @@ -622,45 +623,43 @@ chkhost(struct sockaddr *f) fatal(0, "Malformed from address"); /* Need real hostname for temporary filenames */ - error = getnameinfo(f, f->sa_len, host, sizeof(host), NULL, 0, - NI_NAMEREQD); + error = getnameinfo(f, f->sa_len, hostbuf, sizeof(hostbuf), NULL, 0, + NI_NAMEREQD); if (error) { - error = getnameinfo(f, f->sa_len, host, sizeof(host), NULL, 0, - NI_NUMERICHOST | NI_WITHSCOPEID); + error = getnameinfo(f, f->sa_len, hostbuf, sizeof(hostbuf), + NULL, 0, NI_NUMERICHOST | NI_WITHSCOPEID); if (error) fatal(0, "Host name for your address unknown"); else fatal(0, "Host name for your address (%s) unknown", - host); + hostbuf); } - (void)strncpy(fromb, host, sizeof(fromb) - 1); - fromb[sizeof(fromb) - 1] = '\0'; - from = fromb; + strlcpy(frombuf, hostbuf, sizeof(frombuf)); + from_host = frombuf; /* Need address in stringform for comparison (no DNS lookup here) */ - error = getnameinfo(f, f->sa_len, host, sizeof(host), NULL, 0, - NI_NUMERICHOST | NI_WITHSCOPEID); + error = getnameinfo(f, f->sa_len, hostbuf, sizeof(hostbuf), NULL, 0, + NI_NUMERICHOST | NI_WITHSCOPEID); if (error) fatal(0, "Cannot print address"); - strncpy(from_ip, host, NI_MAXHOST); - from_ip[sizeof(from_ip) - 1] = '\0'; + from_ip = strdup(hostbuf); /* Reject numeric addresses */ memset(&hints, 0, sizeof(hints)); hints.ai_family = family; hints.ai_socktype = SOCK_DGRAM; /*dummy*/ hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST; - if (getaddrinfo(fromb, NULL, &hints, &res) == 0) { + if (getaddrinfo(from_host, NULL, &hints, &res) == 0) { freeaddrinfo(res); - fatal(0, "reverse lookup results in non-FQDN %s", fromb); + fatal(0, "reverse lookup results in non-FQDN %s", from_host); } /* Check for spoof, ala rlogind */ memset(&hints, 0, sizeof(hints)); hints.ai_family = family; hints.ai_socktype = SOCK_DGRAM; /*dummy*/ - error = getaddrinfo(fromb, NULL, &hints, &res); + error = getaddrinfo(from_host, NULL, &hints, &res); if (error) { fatal(0, "hostname for your address (%s) unknown: %s", from_ip, gai_strerror(error)); diff --git a/usr.sbin/lpr/lpd/printjob.c b/usr.sbin/lpr/lpd/printjob.c index 14dc49c..b46d278 100644 --- a/usr.sbin/lpr/lpd/printjob.c +++ b/usr.sbin/lpr/lpd/printjob.c @@ -107,7 +107,7 @@ static char title[80]; /* ``pr'' title */ static char locale[80]; /* ``pr'' locale */ static char class[32]; /* classification field */ -static char fromhost[MAXHOSTNAMELEN]; /* user's host machine */ +static char origin_host[MAXHOSTNAMELEN]; /* user's host machine */ /* indentation size in static characters */ static char indent[10] = "-i0"; static char jobname[100]; /* job or file name */ @@ -417,8 +417,7 @@ printit(struct printer *pp, char *file) while (getline(cfp)) switch (line[0]) { case 'H': - strncpy(fromhost, line+1, sizeof(fromhost) - 1); - fromhost[sizeof(fromhost) - 1] = '\0'; + strlcpy(origin_host, line + 1, sizeof(origin_host)); if (class[0] == '\0') { strncpy(class, line+1, sizeof(class) - 1); class[sizeof(class) - 1] = '\0'; @@ -747,7 +746,7 @@ print(struct printer *pp, int format, char *file) av[n++] = "-n"; av[n++] = logname; av[n++] = "-h"; - av[n++] = fromhost; + av[n++] = origin_host; av[n++] = pp->acct_file; av[n] = 0; fo = pfd; @@ -874,8 +873,7 @@ sendit(struct printer *pp, char *file) i = i * 10 + (*cp++ - '0'); fino = i; } else if (line[0] == 'H') { - strncpy(fromhost, line+1, sizeof(fromhost) - 1); - fromhost[sizeof(fromhost) - 1] = '\0'; + strlcpy(origin_host, line + 1, sizeof(origin_host)); if (class[0] == '\0') { strncpy(class, line+1, sizeof(class) - 1); class[sizeof(class) - 1] = '\0'; @@ -1005,7 +1003,7 @@ sendfile(struct printer *pp, int type, char *file, char format) av[++n] = "-n"; av[++n] = logname; av[++n] = "-h"; - av[++n] = fromhost; + av[++n] = origin_host; av[++n] = pp->acct_file; av[++n] = 0; if ((ifilter = dofork(pp, DORETURN)) == 0) { /* child */ @@ -1166,7 +1164,7 @@ sendfile(struct printer *pp, int type, char *file, char format) openpr(pp); if (type == '\3') trstat_write(pp, TR_SENDING, stb.st_size, logname, - pp->remote_host, fromhost); + pp->remote_host, origin_host); return(OK); } @@ -1321,10 +1319,10 @@ sendmail(struct printer *pp, char *user, int bombed) _exit(0); } else if (s > 0) { /* parent */ dup2(p[1], 1); - printf("To: %s@%s\n", user, fromhost); + printf("To: %s@%s\n", user, origin_host); printf("Subject: %s printer job \"%s\"\n", pp->printer, *jobname ? jobname : "<unknown>"); - printf("Reply-To: root@%s\n\n", host); + printf("Reply-To: root@%s\n\n", local_host); printf("Your printer job "); if (*jobname) printf("(%s) ", jobname); @@ -1341,7 +1339,8 @@ sendmail(struct printer *pp, char *user, int bombed) cp = "FATALERR"; break; case NOACCT: - printf("\ncould not be printed without an account on %s\n", host); + printf("\ncould not be printed without an account on %s\n", + local_host); cp = "NOACCT"; break; case FILTERERR: diff --git a/usr.sbin/lpr/lpd/recvjob.c b/usr.sbin/lpr/lpd/recvjob.c index 661ad05..99e38de 100644 --- a/usr.sbin/lpr/lpd/recvjob.c +++ b/usr.sbin/lpr/lpd/recvjob.c @@ -186,7 +186,8 @@ readjob(struct printer *pp) * something different than what gethostbyaddr() * returns */ - strncpy(cp + 6, from, sizeof(line) + line - cp - 7); + strncpy(cp + 6, from_host, sizeof(line) + line - cp + - 7); line[sizeof(line) - 1 ] = '\0'; strncpy(tfname, cp, sizeof(tfname) - 1); tfname[sizeof (tfname) - 1] = '\0'; @@ -231,7 +232,7 @@ readjob(struct printer *pp) dfcnt++; trstat_init(pp, dfname, dfcnt); (void) readfile(pp, dfname, size); - trstat_write(pp, TR_RECVING, size, givenid, from, + trstat_write(pp, TR_RECVING, size, givenid, from_host, givenhost); continue; } @@ -386,7 +387,7 @@ frecverr(msg, va_alist) #else va_start(ap); #endif - syslog(LOG_ERR, "Error receiving job from %s:", fromb); + syslog(LOG_ERR, "Error receiving job from %s:", from_host); vsyslog(LOG_ERR, msg, ap); va_end(ap); /* diff --git a/usr.sbin/lpr/lpq/lpq.c b/usr.sbin/lpr/lpq/lpq.c index 600286e..96f5d8e 100644 --- a/usr.sbin/lpr/lpq/lpq.c +++ b/usr.sbin/lpr/lpq/lpq.c @@ -93,7 +93,7 @@ main(int argc, char **argv) uid = getuid(); seteuid(uid); progname = *argv; - if (gethostname(host, sizeof(host))) + if (gethostname(local_host, sizeof(local_host))) err(1, "gethostname"); openlog("lpd", 0, LOG_LPR); diff --git a/usr.sbin/lpr/lpr/lpr.c b/usr.sbin/lpr/lpr/lpr.c index a3b2e37..143d98a 100644 --- a/usr.sbin/lpr/lpr/lpr.c +++ b/usr.sbin/lpr/lpr/lpr.c @@ -80,7 +80,7 @@ static const char rcsid[] = #include "pathnames.h" static char *cfname; /* daemon control files, linked from tf's */ -static char *class = host; /* class title on header page */ +static char *class = local_host; /* class title on header page */ static char *dfname; /* data files */ static char *fonts[4]; /* troff font names */ static char format = 'f'; /* format char for printing files */ @@ -152,7 +152,7 @@ main(int argc, char *argv[]) signal(SIGTERM, cleanup); progname = argv[0]; - gethostname(host, sizeof(host)); + gethostname(local_host, sizeof(local_host)); openlog("lpd", 0, LOG_LPR); errs = 0; @@ -326,7 +326,7 @@ main(int argc, char *argv[]) (void) fchown(tfd, pp->daemon_user, -1); /* owned by daemon for protection */ seteuid(uid); - card('H', host); + card('H', local_host); card('P', person); card('C', class); if (hdr && !pp->no_header) { @@ -854,7 +854,7 @@ mktemps(const struct printer *pp) n = n * 10 + (*cp++ - '0'); } } - len = strlen(pp->spool_dir) + strlen(host) + 8; + len = strlen(pp->spool_dir) + strlen(local_host) + 8; tfname = lmktemp(pp, "tf", n, len); cfname = lmktemp(pp, "cf", n, len); dfname = lmktemp(pp, "df", n, len); @@ -876,6 +876,7 @@ lmktemp(const struct printer *pp, const char *id, int num, int len) if ((s = malloc(len)) == NULL) errx(1, "out of memory"); - (void) snprintf(s, len, "%s/%sA%03d%s", pp->spool_dir, id, num, host); + (void) snprintf(s, len, "%s/%sA%03d%s", pp->spool_dir, id, num, + local_host); return(s); } diff --git a/usr.sbin/lpr/lprm/lprm.c b/usr.sbin/lpr/lprm/lprm.c index b163369..7c27a26 100644 --- a/usr.sbin/lpr/lprm/lprm.c +++ b/usr.sbin/lpr/lprm/lprm.c @@ -98,7 +98,7 @@ main(int argc, char *argv[]) euid = geteuid(); seteuid(uid); /* be safe */ progname = argv[0]; - gethostname(host, sizeof(host)); + gethostname(local_host, sizeof(local_host)); openlog("lpd", 0, LOG_LPR); /* |