From owner-freebsd-bugs Sun Jun 20 13: 0: 8 1999 Delivered-To: freebsd-bugs@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (Postfix) with ESMTP id 5F19C14DEE for ; Sun, 20 Jun 1999 13:00:01 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.9.3/8.9.2) id NAA90434; Sun, 20 Jun 1999 13:00:01 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: from dfw-ix6.ix.netcom.com (dfw-ix6.ix.netcom.com [206.214.98.6]) by hub.freebsd.org (Postfix) with ESMTP id 53CBE14DFB for ; Sun, 20 Jun 1999 12:55:02 -0700 (PDT) (envelope-from spork@narcissus.net) Received: (from smap@localhost) by dfw-ix6.ix.netcom.com (8.8.4/8.8.4) id OAA15173 for ; Sun, 20 Jun 1999 14:54:58 -0500 (CDT) Received: from nyc-ny63-18.ix.netcom.com(209.109.224.82) by dfw-ix6.ix.netcom.com via smap (V1.3) id rma015133; Sun Jun 20 14:54:23 1999 Message-Id: Date: Sun, 20 Jun 1999 15:54:01 -0400 (EDT) From: Spike Reply-To: sporkl@ix.netcom.com To: FreeBSD-gnats-submit@freebsd.org Subject: bin/12308: LPD can't be told not to bind to a TCP port. Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org >Number: 12308 >Category: bin >Synopsis: LPD can't be told not to bind to a TCP port. >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Sun Jun 20 13:00:00 PDT 1999 >Closed-Date: >Last-Modified: >Originator: Spike >Release: FreeBSD 4.0-CURRENT i386 >Organization: None. >Environment: FreeBSD nyc-ny63-18.ix.netcom.com1011 4.0-CURRENT FreeBSD 4.0-CURRENT #0: Sun May 30 00:29:24 EDT 1999 spork@pigstuy.penguinpowered.com:/usr/src/sys/compile/PIGSTUYCURRENT i386 >Description: LPD can't be told not to bind to a TCP network socket even if remote host printing isn't desired. >How-To-Repeat: Run lpd. >Fix: Apply the following patches: ============PATCH ONE=================== *** ./lpd.c Sun Jun 20 15:14:43 1999 --- ./lpd-new.c Sun Jun 20 15:16:12 1999 *************** *** 104,109 **** --- 104,110 ---- #include "extern.h" int lflag; /* log requests flag */ + int sflag; /* do not bind to tcp flag. */ int from_remote; /* from remote socket */ int main __P((int, char **)); *************** *** 144,150 **** errx(EX_NOPERM,"must run as root"); errs = 0; ! while ((i = getopt(argc, argv, "dl")) != -1) switch (i) { case 'd': options |= SO_DEBUG; --- 145,151 ---- errx(EX_NOPERM,"must run as root"); errs = 0; ! while ((i = getopt(argc, argv, "dls")) != -1) switch (i) { case 'd': options |= SO_DEBUG; *************** *** 152,157 **** --- 153,161 ---- case 'l': lflag++; break; + case 's': + sflag++; + break; default: errs++; } *************** *** 277,299 **** sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); FD_ZERO(&defreadfds); FD_SET(funix, &defreadfds); ! listen(funix, 5); ! finet = socket(AF_INET, SOCK_STREAM, 0); ! if (finet >= 0) { ! if (options & SO_DEBUG) ! if (setsockopt(finet, SOL_SOCKET, SO_DEBUG, 0, 0) < 0) { ! syslog(LOG_ERR, "setsockopt (SO_DEBUG): %m"); ! mcleanup(0); ! } ! memset(&sin, 0, sizeof(sin)); ! sin.sin_family = AF_INET; ! sin.sin_port = sp->s_port; ! if (bind(finet, (struct sockaddr *)&sin, sizeof(sin)) < 0) { ! syslog(LOG_ERR, "bind: %m"); ! mcleanup(0); ! } ! FD_SET(finet, &defreadfds); ! listen(finet, 5); } /* * Main loop: accept, do a request, continue. --- 281,305 ---- sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); FD_ZERO(&defreadfds); FD_SET(funix, &defreadfds); ! listen(funix, 5); ! if (sflag == 0) { ! finet = socket(AF_INET, SOCK_STREAM, 0); ! if (finet >= 0) { ! if (options & SO_DEBUG) ! if (setsockopt(finet, SOL_SOCKET, SO_DEBUG, 0, 0) < 0) { ! syslog(LOG_ERR, "setsockopt (SO_DEBUG): %m"); ! mcleanup(0); ! } ! memset(&sin, 0, sizeof(sin)); ! sin.sin_family = AF_INET; ! sin.sin_port = sp->s_port; ! if (bind(finet, (struct sockaddr *)&sin, sizeof(sin)) < 0) { ! syslog(LOG_ERR, "bind: %m"); ! mcleanup(0); ! } ! FD_SET(finet, &defreadfds); ! listen(finet, 5); ! } } /* * Main loop: accept, do a request, continue. *************** *** 318,324 **** domain = AF_UNIX, fromlen = sizeof(fromunix); s = accept(funix, (struct sockaddr *)&fromunix, &fromlen); ! } else /* if (FD_ISSET(finet, &readfds)) */ { domain = AF_INET, fromlen = sizeof(frominet); s = accept(finet, (struct sockaddr *)&frominet, &fromlen); --- 324,330 ---- domain = AF_UNIX, fromlen = sizeof(fromunix); s = accept(funix, (struct sockaddr *)&fromunix, &fromlen); ! } else if (sflag == 0) { domain = AF_INET, fromlen = sizeof(frominet); s = accept(finet, (struct sockaddr *)&frominet, &fromlen); *************** *** 333,345 **** continue; } if (fork() == 0) { ! signal(SIGCHLD, SIG_IGN); signal(SIGHUP, SIG_IGN); signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGTERM, SIG_IGN); (void) close(funix); ! (void) close(finet); dup2(s, 1); (void) close(s); if (domain == AF_INET) { --- 339,352 ---- continue; } if (fork() == 0) { ! signal(SIGCHLD, SIG_IGN); signal(SIGHUP, SIG_IGN); signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGTERM, SIG_IGN); (void) close(funix); ! if (sflag == 0) ! (void) close(finet); dup2(s, 1); (void) close(s); if (domain == AF_INET) { *************** *** 629,634 **** static void usage() { ! fprintf(stderr, "usage: lpd [-dl] [port#]\n"); exit(EX_USAGE); } --- 636,641 ---- static void usage() { ! fprintf(stderr, "usage: lpd [-dls] [port#]\n"); exit(EX_USAGE); } =============END PATCH ONE===================== =============PATCH TWO========================= *** ./lpd.8.orig Sun Jun 20 11:00:40 1999 --- ./lpd.8 Sun Jun 20 10:59:34 1999 *************** *** 39,45 **** .Nd line printer spooler daemon .Sh SYNOPSIS .Nm lpd ! .Op Fl dl .Op Ar port# .Sh DESCRIPTION .Nm Lpd --- 39,45 ---- .Nd line printer spooler daemon .Sh SYNOPSIS .Nm lpd ! .Op Fl dls .Op Ar port# .Sh DESCRIPTION .Nm Lpd *************** *** 72,77 **** --- 72,83 ---- .Nm to log valid requests received from the network. This can be useful for debugging purposes. + .It Fl s + The + .Fl s + flag causes + .Nm + not to bind to a TCP socket. This is similar to the "-s" flag to syslogd. .It Ar "port#" The Internet port number used to rendezvous with other processes is normally obtained with ============END PATCH TWO======================= >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message