From nobody@FreeBSD.org  Sat May  7 13:22:08 2005
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id 04ECF16A4DB
	for <freebsd-gnats-submit@FreeBSD.org>; Sat,  7 May 2005 13:22:08 +0000 (GMT)
Received: from www.freebsd.org (www.freebsd.org [216.136.204.117])
	by mx1.FreeBSD.org (Postfix) with ESMTP id DE0DA43DAB
	for <freebsd-gnats-submit@FreeBSD.org>; Sat,  7 May 2005 13:22:07 +0000 (GMT)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.13.1/8.13.1) with ESMTP id j47DM7Io062111
	for <freebsd-gnats-submit@FreeBSD.org>; Sat, 7 May 2005 13:22:07 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.13.1/8.13.1/Submit) id j47DM7DA062105;
	Sat, 7 May 2005 13:22:07 GMT
	(envelope-from nobody)
Message-Id: <200505071322.j47DM7DA062105@www.freebsd.org>
Date: Sat, 7 May 2005 13:22:07 GMT
From: Rostislav Krasny <rosti.bsd@gmail.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: [PATCH]: getty(8) and telnetd(8) ignore the 'if' option of gettytab(5) and don't print initial message from a file (by default /etc/issue) before the login prompt
X-Send-Pr-Version: www-2.3

>Number:         80732
>Category:       bin
>Synopsis:       [patch] getty(8) and telnetd(8) ignore the 'if' option of gettytab(5) and don't print initial message from a file (by default /etc/issue) before the login prompt
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat May 07 13:30:02 GMT 2005
>Closed-Date:    
>Last-Modified:  Mon Dec 29 18:04:38 UTC 2008
>Originator:     Rostislav Krasny
>Release:        5.4-RC4
>Organization:
>Environment:
FreeBSD mercury 5.4-RC4 FreeBSD 5.4-RC4 #0: Sun May  1 23:22:09 IDT 2005     root@mercury:/usr/obj/usr/src/sys/MYKERNEL  i386
>Description:
By default /etc/gettytab have following lines:

default:\
        :cb:ce:ck:lc:fd#1000:im=\r\n%s/%m (%h) (%t)\r\n\r\n:sp#1200:\
        :if=/etc/issue:

The 'if' option specifies a text file that their contents will be processed like contents of a 'im' gettytab(5) option. Both getty(8) and telnetd(8) ignore the 'if' option, the first because of a bug in the code and the second because it is not implemented. However, the telnetd(8) manual page states that it is implemented.
>How-To-Repeat:
Just create the /etc/issue file with some text in it and see how telnetd(8) and getty(8) work. You don't have to reboot when you test getty(8). Instead you can press [Ctrl]+[D] to restart getty(8) or [Enter] to just make it reprint the full login prompt. Also, you might need to enable inetd(8) and eding an /etc/inetd.conf to make telnetd working.
>Fix:
--- main.c.orig	Sat May  7 03:52:29 2005
+++ /usr/src/libexec/getty/main.c	Sat May  7 12:48:11 2005
@@ -184,7 +184,7 @@
 main(int argc, char *argv[])
 {
 	extern	char **environ;
-	int first_sleep = 1, first_time = 1;
+	int first_sleep = 1;
 	struct rlimit limit;
 	int rval;
 
@@ -312,24 +312,22 @@
 			putpad(CL);
 		edithost(HE);
 
-		/* if this is the first time through this, and an
-		   issue file has been given, then send it */
-		if (first_time && IF) {
-			int fd;
+		if (!(PL && PP)) {
+			int fd = -1;
 
-			if ((fd = open(IF, O_RDONLY)) != -1) {
-				char * cp;
-
-				while ((cp = getline(fd)) != NULL) {
-					  putf(cp);
+			if (IF) {
+				if ((fd = open(IF, O_RDONLY)) != -1) {
+					char * cp;
+
+					while ((cp = getline(fd)) != NULL)
+						putf(cp);
+					close(fd);
 				}
-				close(fd);
 			}
+			if (fd == -1 && IM && *IM)
+				putf(IM);
 		}
-		first_time = 0;
 
-		if (IM && *IM && !(PL && PP))
-			putf(IM);
 		if (setjmp(timeout)) {
 			cfsetispeed(&tmode, B0);
 			cfsetospeed(&tmode, B0);

--- telnetd.c.orig	Sat May  7 01:57:16 2005
+++ /usr/src/contrib/telnet/telnetd/telnetd.c	Sat May  7 15:08:11 2005
@@ -740,6 +740,7 @@
 	char *HE;
 	char *HN;
 	char *IM;
+	char *IF;
 	int nfd;
 
 	/*
@@ -900,18 +901,36 @@
 	 */
 
 	if (getent(defent, "default") == 1) {
-		char *cp=defstrs;
+		char *cp = defstrs;
 
 		HE = Getstr("he", &cp);
 		HN = Getstr("hn", &cp);
-		IM = Getstr("im", &cp);
-		if (HN && *HN)
+		IF = Getstr("if", &cp);
+		if (HN != NULL && *HN != 0)
 			(void) strlcpy(host_name, HN, sizeof(host_name));
-		if (IM == 0)
-			IM = strdup("");
+		if (IF != NULL) {
+			int if_fd;
+
+			if ((if_fd = open(IF, O_RDONLY)) != -1) {
+				struct stat if_fst;
+
+				fstat(if_fd, &if_fst);
+				IM = malloc(if_fst.st_size + 1);
+				read(if_fd, IM, if_fst.st_size);
+				IM[if_fst.st_size] = 0;
+				close(if_fd);
+			} else {
+				IF = NULL;
+			}
+		}
+		if (IF == NULL) {
+			IM = Getstr("im", &cp);
+			if (IM == NULL)
+				IM = strdup("");
+		}
 	} else {
 		IM = strdup(DEFAULT_IM);
-		HE = 0;
+		HE = NULL;
 	}
 	edithost(HE, host_name);
 	if (hostinfo && *IM)

>Release-Note:
>Audit-Trail:

From: Maxim Konovalov <maxim@macomnet.ru>
To: Rostislav Krasny <rosti.bsd@gmail.com>
Cc: bug-followup@freebsd.org
Subject: Re: bin/80732: [PATCH]: getty(8) and telnetd(8) ignore the 'if'
 option of gettytab(5) and don't print initial message from a file (by default
 /etc/issue) before the login prompt
Date: Sat, 7 May 2005 17:50:14 +0400 (MSD)

 Does your patch correlate with bin/23562?
 
 http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/23562
 
 -- 
 Maxim Konovalov

From: Rostislav Krasny <rosti.bsd@gmail.com>
To: Maxim Konovalov <maxim@macomnet.ru>
Cc: bug-followup@freebsd.org
Subject: Re: bin/80732: [PATCH]: getty(8) and telnetd(8) ignore the 'if' option of gettytab(5) and don't print initial message from a file (by default /etc/issue) before the login prompt
Date: Sat, 7 May 2005 17:41:58 +0200

 On 5/7/05, Maxim Konovalov <maxim@macomnet.ru> wrote:
 > Does your patch correlate with bin/23562?
 >=20
 > http://www.freebsd.org/cgi/query-pr.cgi?pr=3Dbin/23562
 
 The bin/23562 is about same bugs of getty(8) and telnetd(8). It have
 very old patch for telnetd(8) and no patch for getty(8).
 
 The history of the patch in bin/23562 is mysterious. Originally it was
 introduced in bin/6492 and then commited, many years ago:
 http://www.freebsd.org/cgi/cvsweb.cgi/src/libexec/telnetd/Attic/telnetd.c.d=
 iff?r1=3D1.7.2.4&r2=3D1.7.2.5
 Three years later (August 2001) it was removed during: "Feature
 merging and diff reduction between this code and crypto telnet":
 http://www.freebsd.org/cgi/cvsweb.cgi/src/libexec/telnetd/Attic/telnetd.c.d=
 iff?r1=3D1.29&r2=3D1.30
 But the removing was not complete. telnetd.c still includes
 <sys/mman.h> that had been need for mmap() and munmap() and manual
 page of telnetd(8) still states that 'if' option of gettytab is
 supported. The patch in bin/23562 was proposed in February 2001, i.e.
 before it was removed in revision 1.30.
 In July 2003 the sources of telnetd(8) were moved to
 src/contrib/telnet where the revision numbering is different.
 
 Personally I think my patch ot telnetd.c is better and the the
 inclusion of <sys/mman.h> could be also removed from the telnetd.c as
 needless.

From: Rostislav Krasny <rosti.bsd@gmail.com>
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: bin/80732: [PATCH]: getty(8) and telnetd(8) ignore the 'if' option of gettytab(5) and don't print initial message from a file (by default /etc/issue) before the login prompt
Date: Mon, 9 May 2005 17:28:12 +0200

 ------=_Part_2638_24198527.1115652492256
 Content-Type: text/plain; charset=ISO-8859-1
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: inline
 
 This is an updated version of the telnetd(8) patch. It solves two more prob=
 lems:
 1. if a lexically cultivated or original contents of /etc/issue file
 or 'im' parameter of /etc/gettytab is longer than BUFSIZ - 1 (1023
 bytes) then telnetd will crash
 2. if the last byte of the /etc/issue file or the 'im' parameter of
 /etc/gettytab is a '%' char then telnetd will jump over the
 null-terminator of the string.
 
 The patch is attached to this email.
 
 P.S. Original patch of getty(8) (of the main.c file) is still good and
 desirable.
 
 ------=_Part_2638_24198527.1115652492256
 Content-Type: text/plain; name="telnetd.patch"
 Content-Transfer-Encoding: base64
 Content-Disposition: attachment; filename="telnetd.patch"
 
 ZGlmZiAtdXIgdGVsbmV0ZC5vcmlnL2V4dC5oIC91c3Ivc3JjL2NvbnRyaWIvdGVsbmV0L3RlbG5l
 dGQvZXh0LmgKLS0tIHRlbG5ldGQub3JpZy9leHQuaAlNb24gTWF5ICA5IDE2OjQxOjQ1IDIwMDUK
 KysrIC91c3Ivc3JjL2NvbnRyaWIvdGVsbmV0L3RlbG5ldGQvZXh0LmgJTW9uIE1heSAgOSAxNzow
 MTozMCAyMDA1CkBAIC0xMTIsOCArMTEyLDcgQEAKICNlbmRpZgogCXByb2Nlc3Nfc2xjKHVuc2ln
 bmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIsIGNjX3QpLAogCXB0eWZsdXNoKHZvaWQpLAotCXB1dGNo
 cihpbnQpLAotCXB1dGYoY2hhciAqLCBjaGFyICopLAorCXB1dGYoY2hhciAqLCBjaGFyICosIHNp
 emVfdCksCiAJcmVjdl9heXQodm9pZCksCiAJc2VuZF9kbyhpbnQsIGludCksCiAJc2VuZF9kb250
 KGludCwgaW50KSwKZGlmZiAtdXIgdGVsbmV0ZC5vcmlnL3RlbG5ldGQuYyAvdXNyL3NyYy9jb250
 cmliL3RlbG5ldC90ZWxuZXRkL3RlbG5ldGQuYwotLS0gdGVsbmV0ZC5vcmlnL3RlbG5ldGQuYwlN
 b24gTWF5ICA5IDE2OjQyOjEzIDIwMDUKKysrIC91c3Ivc3JjL2NvbnRyaWIvdGVsbmV0L3RlbG5l
 dGQvdGVsbmV0ZC5jCU1vbiBNYXkgIDkgMTc6MDE6NDUgMjAwNQpAQCAtNDIsNyArNDIsNiBAQAog
 I2luY2x1ZGUgInRlbG5ldGQuaCIKICNpbmNsdWRlICJwYXRobmFtZXMuaCIKIAotI2luY2x1ZGUg
 PHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8ZXJyLmg+CiAjaW5jbHVkZSA8bGlidXRpbC5oPgogI2lu
 Y2x1ZGUgPHBhdGhzLmg+CkBAIC03NDAsNiArNzM5LDcgQEAKIAljaGFyICpIRTsKIAljaGFyICpI
 TjsKIAljaGFyICpJTTsKKwljaGFyICpJRjsKIAlpbnQgbmZkOwogCiAJLyoKQEAgLTkwMCwyMiAr
 OTAwLDQwIEBACiAJICovCiAKIAlpZiAoZ2V0ZW50KGRlZmVudCwgImRlZmF1bHQiKSA9PSAxKSB7
 Ci0JCWNoYXIgKmNwPWRlZnN0cnM7CisJCWNoYXIgKmNwID0gZGVmc3RyczsKIAogCQlIRSA9IEdl
 dHN0cigiaGUiLCAmY3ApOwogCQlITiA9IEdldHN0cigiaG4iLCAmY3ApOwotCQlJTSA9IEdldHN0
 cigiaW0iLCAmY3ApOwotCQlpZiAoSE4gJiYgKkhOKQorCQlJRiA9IEdldHN0cigiaWYiLCAmY3Ap
 OworCQlpZiAoSE4gIT0gTlVMTCAmJiAqSE4gIT0gMCkKIAkJCSh2b2lkKSBzdHJsY3B5KGhvc3Rf
 bmFtZSwgSE4sIHNpemVvZihob3N0X25hbWUpKTsKLQkJaWYgKElNID09IDApCi0JCQlJTSA9IHN0
 cmR1cCgiIik7CisJCWlmIChJRiAhPSBOVUxMKSB7CisJCQlpbnQgaWZfZmQ7CisKKwkJCWlmICgo
 aWZfZmQgPSBvcGVuKElGLCBPX1JET05MWSkpICE9IC0xKSB7CisJCQkJc3RydWN0IHN0YXQgaWZf
 ZnN0OworCisJCQkJZnN0YXQoaWZfZmQsICZpZl9mc3QpOworCQkJCUlNID0gbWFsbG9jKGlmX2Zz
 dC5zdF9zaXplICsgMSk7CisJCQkJcmVhZChpZl9mZCwgSU0sIGlmX2ZzdC5zdF9zaXplKTsKKwkJ
 CQlJTVtpZl9mc3Quc3Rfc2l6ZV0gPSAwOworCQkJCWNsb3NlKGlmX2ZkKTsKKwkJCX0gZWxzZSB7
 CisJCQkJSUYgPSBOVUxMOworCQkJfQorCQl9CisJCWlmIChJRiA9PSBOVUxMKSB7CisJCQlJTSA9
 IEdldHN0cigiaW0iLCAmY3ApOworCQkJaWYgKElNID09IE5VTEwpCisJCQkJSU0gPSBzdHJkdXAo
 IiIpOworCQl9CiAJfSBlbHNlIHsKIAkJSU0gPSBzdHJkdXAoREVGQVVMVF9JTSk7Ci0JCUhFID0g
 MDsKKwkJSEUgPSBOVUxMOwogCX0KIAllZGl0aG9zdChIRSwgaG9zdF9uYW1lKTsKIAlpZiAoaG9z
 dGluZm8gJiYgKklNKQotCQlwdXRmKElNLCBwdHlpYnVmMik7CisJCXB1dGYoSU0sIHB0eWlidWYy
 LCBCVUZTSVopOwogCiAJaWYgKHBjYykKIAkJKHZvaWQpIHN0cm5jYXQocHR5aWJ1ZjIsIHB0eWlw
 LCBwY2MrMSk7CmRpZmYgLXVyIHRlbG5ldGQub3JpZy91dGlsaXR5LmMgL3Vzci9zcmMvY29udHJp
 Yi90ZWxuZXQvdGVsbmV0ZC91dGlsaXR5LmMKLS0tIHRlbG5ldGQub3JpZy91dGlsaXR5LmMJTW9u
 IE1heSAgOSAxNjo0MjoyMiAyMDA1CisrKyAvdXNyL3NyYy9jb250cmliL3RlbG5ldC90ZWxuZXRk
 L3V0aWxpdHkuYwlNb24gTWF5ICA5IDE3OjAxOjM4IDIwMDUKQEAgLTY2LDExICs2Niw5IEBACiAg
 KiBhbHNvIGZsdXNoIHRoZSBwdHkgaW5wdXQgYnVmZmVyIChieSBkcm9wcGluZyBpdHMgZGF0YSkg
 aWYgaXQgYmVjb21lcwogICogdG9vIGZ1bGwuCiAgKi8KLQotICAgIHZvaWQKLXR0bG9vcCgpCit2
 b2lkCit0dGxvb3Aodm9pZCkKIHsKLQogICAgIERJQUcoVERfUkVQT1JULCBvdXRwdXRfZGF0YSgi
 dGQ6IHR0bG9vcFxyXG4iKSk7CiAgICAgaWYgKG5mcm9udHAgLSBuYmFja3AgPiAwKSB7CiAJbmV0
 Zmx1c2goKTsKQEAgLTM5MywyMiArMzkxLDYgQEAKIAllZGl0ZWRob3N0W3NpemVvZiBlZGl0ZWRo
 b3N0IC0gMV0gPSAnXDAnOwogfQogCi1zdGF0aWMgY2hhciAqcHV0bG9jYXRpb247Ci0KLXN0YXRp
 YyB2b2lkCi1wdXRzdHIoY29uc3QgY2hhciAqcykKLXsKLQotCXdoaWxlICgqcykKLQkJcHV0Y2hy
 KCpzKyspOwotfQotCi12b2lkCi1wdXRjaHIoaW50IGNjKQotewotCSpwdXRsb2NhdGlvbisrID0g
 Y2M7Ci19Ci0KICNpZmRlZiBfX0ZyZWVCU0RfXwogc3RhdGljIGNoYXIgZm10c3RyW10gPSB7ICIl
 KyIgfTsKICNlbHNlCkBAIC00MTYsMTEgKzM5OCwxMiBAQAogI2VuZGlmCiAKIHZvaWQKLXB1dGYo
 Y2hhciAqY3AsIGNoYXIgKndoZXJlKQorcHV0ZihjaGFyICpjcCwgY2hhciAqd2hlcmUsIHNpemVf
 dCB3aGVyZV9zaXplKQogewogCWNoYXIgKnNsYXNoOwogCXRpbWVfdCB0OwogCWNoYXIgZGJbMTAw
 XTsKKwljaGFyIGNoX3N0clsyXSA9IHswLCAwfTsKICNpZmRlZiBfX0ZyZWVCU0RfXwogCXN0YXRp
 YyBzdHJ1Y3QgdXRzbmFtZSBrZXJuaW5mbzsKIApAQCAtNDI4LDE5ICs0MTEsMTMgQEAKIAkJdW5h
 bWUoJmtlcm5pbmZvKTsKICNlbmRpZgogCi0JcHV0bG9jYXRpb24gPSB3aGVyZTsKLQotCXdoaWxl
 ICgqY3ApIHsKLQkJaWYgKCpjcCA9PSdcbicpIHsKLQkJCXB1dHN0cigiXHJcbiIpOwotCQkJY3Ar
 KzsKLQkJCWNvbnRpbnVlOworCXdoaWxlICgqY3AgIT0gMCkgeworCQlpZiAoKmNwID09ICdcbicp
 IHsKKwkJCXN0cmxjYXQod2hlcmUsICJcclxuIiwgd2hlcmVfc2l6ZSk7CiAJCX0gZWxzZSBpZiAo
 KmNwICE9ICclJykgewotCQkJcHV0Y2hyKCpjcCsrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXN3
 aXRjaCAoKisrY3ApIHsKLQorCQkJKmNoX3N0ciA9ICpjcDsKKwkJCXN0cmxjYXQod2hlcmUsIGNo
 X3N0ciwgd2hlcmVfc2l6ZSk7CisJCX0gZWxzZSBzd2l0Y2ggKCorK2NwKSB7CiAJCWNhc2UgJ3Qn
 OgogI2lmZGVmCVNUUkVBTVNQVFkKIAkJCS8qIG5hbWVzIGFyZSBsaWtlIC9kZXYvcHRzLzIgLS0g
 d2Ugd2FudCBwdHMvMiAqLwpAQCAtNDQ4LDQ2ICs0MjUsNDIgQEAKICNlbHNlCiAJCQlzbGFzaCA9
 IHN0cnJjaHIobGluZSwgJy8nKTsKICNlbmRpZgotCQkJaWYgKHNsYXNoID09IChjaGFyICopIDAp
 Ci0JCQkJcHV0c3RyKGxpbmUpOworCQkJaWYgKHNsYXNoID09IE5VTEwpCisJCQkJc3RybGNhdCh3
 aGVyZSwgbGluZSwgd2hlcmVfc2l6ZSk7CiAJCQllbHNlCi0JCQkJcHV0c3RyKCZzbGFzaFsxXSk7
 CisJCQkJc3RybGNhdCh3aGVyZSwgJnNsYXNoWzFdLCB3aGVyZV9zaXplKTsKIAkJCWJyZWFrOwot
 CiAJCWNhc2UgJ2gnOgotCQkJcHV0c3RyKGVkaXRlZGhvc3QpOworCQkJc3RybGNhdCh3aGVyZSwg
 ZWRpdGVkaG9zdCwgd2hlcmVfc2l6ZSk7CiAJCQlicmVhazsKLQogCQljYXNlICdkJzoKICNpZmRl
 ZiBfX0ZyZWVCU0RfXwogCQkJc2V0bG9jYWxlKExDX1RJTUUsICIiKTsKICNlbmRpZgogCQkJKHZv
 aWQpdGltZSgmdCk7CiAJCQkodm9pZClzdHJmdGltZShkYiwgc2l6ZW9mKGRiKSwgZm10c3RyLCBs
 b2NhbHRpbWUoJnQpKTsKLQkJCXB1dHN0cihkYik7CisJCQlzdHJsY2F0KHdoZXJlLCBkYiwgd2hl
 cmVfc2l6ZSk7CiAJCQlicmVhazsKLQogI2lmZGVmIF9fRnJlZUJTRF9fCiAJCWNhc2UgJ3MnOgot
 CQkJcHV0c3RyKGtlcm5pbmZvLnN5c25hbWUpOworCQkJc3RybGNhdCh3aGVyZSwga2VybmluZm8u
 c3lzbmFtZSwgd2hlcmVfc2l6ZSk7CiAJCQlicmVhazsKLQogCQljYXNlICdtJzoKLQkJCXB1dHN0
 cihrZXJuaW5mby5tYWNoaW5lKTsKKwkJCXN0cmxjYXQod2hlcmUsIGtlcm5pbmZvLm1hY2hpbmUs
 IHdoZXJlX3NpemUpOwogCQkJYnJlYWs7Ci0KIAkJY2FzZSAncic6Ci0JCQlwdXRzdHIoa2Vybmlu
 Zm8ucmVsZWFzZSk7CisJCQlzdHJsY2F0KHdoZXJlLCBrZXJuaW5mby5yZWxlYXNlLCB3aGVyZV9z
 aXplKTsKIAkJCWJyZWFrOwotCiAJCWNhc2UgJ3YnOgotCQkJcHV0c3RyKGtlcm5pbmZvLnZlcnNp
 b24pOworCQkJc3RybGNhdCh3aGVyZSwga2VybmluZm8udmVyc2lvbiwgd2hlcmVfc2l6ZSk7CiAJ
 CQlicmVhazsKICNlbmRpZgotCiAJCWNhc2UgJyUnOgotCQkJcHV0Y2hyKCclJyk7CisJCQkqY2hf
 c3RyID0gJyUnOworCQkJc3RybGNhdCh3aGVyZSwgY2hfc3RyLCB3aGVyZV9zaXplKTsKIAkJCWJy
 ZWFrOworCQljYXNlIDA6CisJCQlyZXR1cm47CiAJCX0KIAkJY3ArKzsKIAl9Cg==
 ------=_Part_2638_24198527.1115652492256--

From: Rostislav Krasny <rosti.bsd@gmail.com>
To: bug-followup@freebsd.org
Cc:  
Subject: Re: bin/80732: [PATCH]: getty(8) and telnetd(8) ignore the 'if' option of gettytab(5) and don't print initial message from a file (by default /etc/issue) before the login prompt
Date: Mon, 9 May 2005 17:48:51 +0200

 ------=_Part_2675_9870019.1115653731135
 Content-Type: text/plain; charset=ISO-8859-1
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: inline
 
 In my previous email the patch has been encoded by base64 by Gmail.
 I'm sending the patch again after renaming it to *.txt file. I hope
 this time Gmail will not use base64 encoding.
 
 ------=_Part_2675_9870019.1115653731135
 Content-Type: text/plain; name="telnetd.patch.txt"
 Content-Transfer-Encoding: base64
 Content-Disposition: attachment; filename="telnetd.patch.txt"
 
 ZGlmZiAtdXIgdGVsbmV0ZC5vcmlnL2V4dC5oIC91c3Ivc3JjL2NvbnRyaWIvdGVsbmV0L3RlbG5l
 dGQvZXh0LmgNCi0tLSB0ZWxuZXRkLm9yaWcvZXh0LmgJTW9uIE1heSAgOSAxNjo0MTo0NSAyMDA1
 DQorKysgL3Vzci9zcmMvY29udHJpYi90ZWxuZXQvdGVsbmV0ZC9leHQuaAlNb24gTWF5ICA5IDE3
 OjAxOjMwIDIwMDUNCkBAIC0xMTIsOCArMTEyLDcgQEANCiAjZW5kaWYNCiAJcHJvY2Vzc19zbGMo
 dW5zaWduZWQgY2hhciwgdW5zaWduZWQgY2hhciwgY2NfdCksDQogCXB0eWZsdXNoKHZvaWQpLA0K
 LQlwdXRjaHIoaW50KSwNCi0JcHV0ZihjaGFyICosIGNoYXIgKiksDQorCXB1dGYoY2hhciAqLCBj
 aGFyICosIHNpemVfdCksDQogCXJlY3ZfYXl0KHZvaWQpLA0KIAlzZW5kX2RvKGludCwgaW50KSwN
 CiAJc2VuZF9kb250KGludCwgaW50KSwNCmRpZmYgLXVyIHRlbG5ldGQub3JpZy90ZWxuZXRkLmMg
 L3Vzci9zcmMvY29udHJpYi90ZWxuZXQvdGVsbmV0ZC90ZWxuZXRkLmMNCi0tLSB0ZWxuZXRkLm9y
 aWcvdGVsbmV0ZC5jCU1vbiBNYXkgIDkgMTY6NDI6MTMgMjAwNQ0KKysrIC91c3Ivc3JjL2NvbnRy
 aWIvdGVsbmV0L3RlbG5ldGQvdGVsbmV0ZC5jCU1vbiBNYXkgIDkgMTc6MDE6NDUgMjAwNQ0KQEAg
 LTQyLDcgKzQyLDYgQEANCiAjaW5jbHVkZSAidGVsbmV0ZC5oIg0KICNpbmNsdWRlICJwYXRobmFt
 ZXMuaCINCiANCi0jaW5jbHVkZSA8c3lzL21tYW4uaD4NCiAjaW5jbHVkZSA8ZXJyLmg+DQogI2lu
 Y2x1ZGUgPGxpYnV0aWwuaD4NCiAjaW5jbHVkZSA8cGF0aHMuaD4NCkBAIC03NDAsNiArNzM5LDcg
 QEANCiAJY2hhciAqSEU7DQogCWNoYXIgKkhOOw0KIAljaGFyICpJTTsNCisJY2hhciAqSUY7DQog
 CWludCBuZmQ7DQogDQogCS8qDQpAQCAtOTAwLDIyICs5MDAsNDAgQEANCiAJICovDQogDQogCWlm
 IChnZXRlbnQoZGVmZW50LCAiZGVmYXVsdCIpID09IDEpIHsNCi0JCWNoYXIgKmNwPWRlZnN0cnM7
 DQorCQljaGFyICpjcCA9IGRlZnN0cnM7DQogDQogCQlIRSA9IEdldHN0cigiaGUiLCAmY3ApOw0K
 IAkJSE4gPSBHZXRzdHIoImhuIiwgJmNwKTsNCi0JCUlNID0gR2V0c3RyKCJpbSIsICZjcCk7DQot
 CQlpZiAoSE4gJiYgKkhOKQ0KKwkJSUYgPSBHZXRzdHIoImlmIiwgJmNwKTsNCisJCWlmIChITiAh
 PSBOVUxMICYmICpITiAhPSAwKQ0KIAkJCSh2b2lkKSBzdHJsY3B5KGhvc3RfbmFtZSwgSE4sIHNp
 emVvZihob3N0X25hbWUpKTsNCi0JCWlmIChJTSA9PSAwKQ0KLQkJCUlNID0gc3RyZHVwKCIiKTsN
 CisJCWlmIChJRiAhPSBOVUxMKSB7DQorCQkJaW50IGlmX2ZkOw0KKw0KKwkJCWlmICgoaWZfZmQg
 PSBvcGVuKElGLCBPX1JET05MWSkpICE9IC0xKSB7DQorCQkJCXN0cnVjdCBzdGF0IGlmX2ZzdDsN
 CisNCisJCQkJZnN0YXQoaWZfZmQsICZpZl9mc3QpOw0KKwkJCQlJTSA9IG1hbGxvYyhpZl9mc3Qu
 c3Rfc2l6ZSArIDEpOw0KKwkJCQlyZWFkKGlmX2ZkLCBJTSwgaWZfZnN0LnN0X3NpemUpOw0KKwkJ
 CQlJTVtpZl9mc3Quc3Rfc2l6ZV0gPSAwOw0KKwkJCQljbG9zZShpZl9mZCk7DQorCQkJfSBlbHNl
 IHsNCisJCQkJSUYgPSBOVUxMOw0KKwkJCX0NCisJCX0NCisJCWlmIChJRiA9PSBOVUxMKSB7DQor
 CQkJSU0gPSBHZXRzdHIoImltIiwgJmNwKTsNCisJCQlpZiAoSU0gPT0gTlVMTCkNCisJCQkJSU0g
 PSBzdHJkdXAoIiIpOw0KKwkJfQ0KIAl9IGVsc2Ugew0KIAkJSU0gPSBzdHJkdXAoREVGQVVMVF9J
 TSk7DQotCQlIRSA9IDA7DQorCQlIRSA9IE5VTEw7DQogCX0NCiAJZWRpdGhvc3QoSEUsIGhvc3Rf
 bmFtZSk7DQogCWlmIChob3N0aW5mbyAmJiAqSU0pDQotCQlwdXRmKElNLCBwdHlpYnVmMik7DQor
 CQlwdXRmKElNLCBwdHlpYnVmMiwgQlVGU0laKTsNCiANCiAJaWYgKHBjYykNCiAJCSh2b2lkKSBz
 dHJuY2F0KHB0eWlidWYyLCBwdHlpcCwgcGNjKzEpOw0KZGlmZiAtdXIgdGVsbmV0ZC5vcmlnL3V0
 aWxpdHkuYyAvdXNyL3NyYy9jb250cmliL3RlbG5ldC90ZWxuZXRkL3V0aWxpdHkuYw0KLS0tIHRl
 bG5ldGQub3JpZy91dGlsaXR5LmMJTW9uIE1heSAgOSAxNjo0MjoyMiAyMDA1DQorKysgL3Vzci9z
 cmMvY29udHJpYi90ZWxuZXQvdGVsbmV0ZC91dGlsaXR5LmMJTW9uIE1heSAgOSAxNzowMTozOCAy
 MDA1DQpAQCAtNjYsMTEgKzY2LDkgQEANCiAgKiBhbHNvIGZsdXNoIHRoZSBwdHkgaW5wdXQgYnVm
 ZmVyIChieSBkcm9wcGluZyBpdHMgZGF0YSkgaWYgaXQgYmVjb21lcw0KICAqIHRvbyBmdWxsLg0K
 ICAqLw0KLQ0KLSAgICB2b2lkDQotdHRsb29wKCkNCit2b2lkDQordHRsb29wKHZvaWQpDQogew0K
 LQ0KICAgICBESUFHKFREX1JFUE9SVCwgb3V0cHV0X2RhdGEoInRkOiB0dGxvb3BcclxuIikpOw0K
 ICAgICBpZiAobmZyb250cCAtIG5iYWNrcCA+IDApIHsNCiAJbmV0Zmx1c2goKTsNCkBAIC0zOTMs
 MjIgKzM5MSw2IEBADQogCWVkaXRlZGhvc3Rbc2l6ZW9mIGVkaXRlZGhvc3QgLSAxXSA9ICdcMCc7
 DQogfQ0KIA0KLXN0YXRpYyBjaGFyICpwdXRsb2NhdGlvbjsNCi0NCi1zdGF0aWMgdm9pZA0KLXB1
 dHN0cihjb25zdCBjaGFyICpzKQ0KLXsNCi0NCi0Jd2hpbGUgKCpzKQ0KLQkJcHV0Y2hyKCpzKysp
 Ow0KLX0NCi0NCi12b2lkDQotcHV0Y2hyKGludCBjYykNCi17DQotCSpwdXRsb2NhdGlvbisrID0g
 Y2M7DQotfQ0KLQ0KICNpZmRlZiBfX0ZyZWVCU0RfXw0KIHN0YXRpYyBjaGFyIGZtdHN0cltdID0g
 eyAiJSsiIH07DQogI2Vsc2UNCkBAIC00MTYsMTEgKzM5OCwxMiBAQA0KICNlbmRpZg0KIA0KIHZv
 aWQNCi1wdXRmKGNoYXIgKmNwLCBjaGFyICp3aGVyZSkNCitwdXRmKGNoYXIgKmNwLCBjaGFyICp3
 aGVyZSwgc2l6ZV90IHdoZXJlX3NpemUpDQogew0KIAljaGFyICpzbGFzaDsNCiAJdGltZV90IHQ7
 DQogCWNoYXIgZGJbMTAwXTsNCisJY2hhciBjaF9zdHJbMl0gPSB7MCwgMH07DQogI2lmZGVmIF9f
 RnJlZUJTRF9fDQogCXN0YXRpYyBzdHJ1Y3QgdXRzbmFtZSBrZXJuaW5mbzsNCiANCkBAIC00Mjgs
 MTkgKzQxMSwxMyBAQA0KIAkJdW5hbWUoJmtlcm5pbmZvKTsNCiAjZW5kaWYNCiANCi0JcHV0bG9j
 YXRpb24gPSB3aGVyZTsNCi0NCi0Jd2hpbGUgKCpjcCkgew0KLQkJaWYgKCpjcCA9PSdcbicpIHsN
 Ci0JCQlwdXRzdHIoIlxyXG4iKTsNCi0JCQljcCsrOw0KLQkJCWNvbnRpbnVlOw0KKwl3aGlsZSAo
 KmNwICE9IDApIHsNCisJCWlmICgqY3AgPT0gJ1xuJykgew0KKwkJCXN0cmxjYXQod2hlcmUsICJc
 clxuIiwgd2hlcmVfc2l6ZSk7DQogCQl9IGVsc2UgaWYgKCpjcCAhPSAnJScpIHsNCi0JCQlwdXRj
 aHIoKmNwKyspOw0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQkJc3dpdGNoICgqKytjcCkgew0KLQ0K
 KwkJCSpjaF9zdHIgPSAqY3A7DQorCQkJc3RybGNhdCh3aGVyZSwgY2hfc3RyLCB3aGVyZV9zaXpl
 KTsNCisJCX0gZWxzZSBzd2l0Y2ggKCorK2NwKSB7DQogCQljYXNlICd0JzoNCiAjaWZkZWYJU1RS
 RUFNU1BUWQ0KIAkJCS8qIG5hbWVzIGFyZSBsaWtlIC9kZXYvcHRzLzIgLS0gd2Ugd2FudCBwdHMv
 MiAqLw0KQEAgLTQ0OCw0NiArNDI1LDQyIEBADQogI2Vsc2UNCiAJCQlzbGFzaCA9IHN0cnJjaHIo
 bGluZSwgJy8nKTsNCiAjZW5kaWYNCi0JCQlpZiAoc2xhc2ggPT0gKGNoYXIgKikgMCkNCi0JCQkJ
 cHV0c3RyKGxpbmUpOw0KKwkJCWlmIChzbGFzaCA9PSBOVUxMKQ0KKwkJCQlzdHJsY2F0KHdoZXJl
 LCBsaW5lLCB3aGVyZV9zaXplKTsNCiAJCQllbHNlDQotCQkJCXB1dHN0cigmc2xhc2hbMV0pOw0K
 KwkJCQlzdHJsY2F0KHdoZXJlLCAmc2xhc2hbMV0sIHdoZXJlX3NpemUpOw0KIAkJCWJyZWFrOw0K
 LQ0KIAkJY2FzZSAnaCc6DQotCQkJcHV0c3RyKGVkaXRlZGhvc3QpOw0KKwkJCXN0cmxjYXQod2hl
 cmUsIGVkaXRlZGhvc3QsIHdoZXJlX3NpemUpOw0KIAkJCWJyZWFrOw0KLQ0KIAkJY2FzZSAnZCc6
 DQogI2lmZGVmIF9fRnJlZUJTRF9fDQogCQkJc2V0bG9jYWxlKExDX1RJTUUsICIiKTsNCiAjZW5k
 aWYNCiAJCQkodm9pZCl0aW1lKCZ0KTsNCiAJCQkodm9pZClzdHJmdGltZShkYiwgc2l6ZW9mKGRi
 KSwgZm10c3RyLCBsb2NhbHRpbWUoJnQpKTsNCi0JCQlwdXRzdHIoZGIpOw0KKwkJCXN0cmxjYXQo
 d2hlcmUsIGRiLCB3aGVyZV9zaXplKTsNCiAJCQlicmVhazsNCi0NCiAjaWZkZWYgX19GcmVlQlNE
 X18NCiAJCWNhc2UgJ3MnOg0KLQkJCXB1dHN0cihrZXJuaW5mby5zeXNuYW1lKTsNCisJCQlzdHJs
 Y2F0KHdoZXJlLCBrZXJuaW5mby5zeXNuYW1lLCB3aGVyZV9zaXplKTsNCiAJCQlicmVhazsNCi0N
 CiAJCWNhc2UgJ20nOg0KLQkJCXB1dHN0cihrZXJuaW5mby5tYWNoaW5lKTsNCisJCQlzdHJsY2F0
 KHdoZXJlLCBrZXJuaW5mby5tYWNoaW5lLCB3aGVyZV9zaXplKTsNCiAJCQlicmVhazsNCi0NCiAJ
 CWNhc2UgJ3InOg0KLQkJCXB1dHN0cihrZXJuaW5mby5yZWxlYXNlKTsNCisJCQlzdHJsY2F0KHdo
 ZXJlLCBrZXJuaW5mby5yZWxlYXNlLCB3aGVyZV9zaXplKTsNCiAJCQlicmVhazsNCi0NCiAJCWNh
 c2UgJ3YnOg0KLQkJCXB1dHN0cihrZXJuaW5mby52ZXJzaW9uKTsNCisJCQlzdHJsY2F0KHdoZXJl
 LCBrZXJuaW5mby52ZXJzaW9uLCB3aGVyZV9zaXplKTsNCiAJCQlicmVhazsNCiAjZW5kaWYNCi0N
 CiAJCWNhc2UgJyUnOg0KLQkJCXB1dGNocignJScpOw0KKwkJCSpjaF9zdHIgPSAnJSc7DQorCQkJ
 c3RybGNhdCh3aGVyZSwgY2hfc3RyLCB3aGVyZV9zaXplKTsNCiAJCQlicmVhazsNCisJCWNhc2Ug
 MDoNCisJCQlyZXR1cm47DQogCQl9DQogCQljcCsrOw0KIAl9DQo=
 ------=_Part_2675_9870019.1115653731135--

From: Maxim Konovalov <maxim@macomnet.ru>
To: bug-followup@freebsd.org
Cc:  
Subject: bin/80732
Date: Mon, 9 May 2005 20:07:45 +0400 (MSD)

 Added to the audit trail.
 
 diff -ur telnetd.orig/ext.h /usr/src/contrib/telnet/telnetd/ext.h
 --- telnetd.orig/ext.h	Mon May  9 16:41:45 2005
 +++ /usr/src/contrib/telnet/telnetd/ext.h	Mon May  9 17:01:30 2005
 @@ -112,8 +112,7 @@
  #endif
  	process_slc(unsigned char, unsigned char, cc_t),
  	ptyflush(void),
 -	putchr(int),
 -	putf(char *, char *),
 +	putf(char *, char *, size_t),
  	recv_ayt(void),
  	send_do(int, int),
  	send_dont(int, int),
 diff -ur telnetd.orig/telnetd.c /usr/src/contrib/telnet/telnetd/telnetd.c
 --- telnetd.orig/telnetd.c	Mon May  9 16:42:13 2005
 +++ /usr/src/contrib/telnet/telnetd/telnetd.c	Mon May  9 17:01:45 2005
 @@ -42,7 +42,6 @@
  #include "telnetd.h"
  #include "pathnames.h"
 
 -#include <sys/mman.h>
  #include <err.h>
  #include <libutil.h>
  #include <paths.h>
 @@ -740,6 +739,7 @@
  	char *HE;
  	char *HN;
  	char *IM;
 +	char *IF;
  	int nfd;
 
  	/*
 @@ -900,22 +900,40 @@
  	 */
 
  	if (getent(defent, "default") == 1) {
 -		char *cp=defstrs;
 +		char *cp = defstrs;
 
  		HE = Getstr("he", &cp);
  		HN = Getstr("hn", &cp);
 -		IM = Getstr("im", &cp);
 -		if (HN && *HN)
 +		IF = Getstr("if", &cp);
 +		if (HN != NULL && *HN != 0)
  			(void) strlcpy(host_name, HN, sizeof(host_name));
 -		if (IM == 0)
 -			IM = strdup("");
 +		if (IF != NULL) {
 +			int if_fd;
 +
 +			if ((if_fd = open(IF, O_RDONLY)) != -1) {
 +				struct stat if_fst;
 +
 +				fstat(if_fd, &if_fst);
 +				IM = malloc(if_fst.st_size + 1);
 +				read(if_fd, IM, if_fst.st_size);
 +				IM[if_fst.st_size] = 0;
 +				close(if_fd);
 +			} else {
 +				IF = NULL;
 +			}
 +		}
 +		if (IF == NULL) {
 +			IM = Getstr("im", &cp);
 +			if (IM == NULL)
 +				IM = strdup("");
 +		}
  	} else {
  		IM = strdup(DEFAULT_IM);
 -		HE = 0;
 +		HE = NULL;
  	}
  	edithost(HE, host_name);
  	if (hostinfo && *IM)
 -		putf(IM, ptyibuf2);
 +		putf(IM, ptyibuf2, BUFSIZ);
 
  	if (pcc)
  		(void) strncat(ptyibuf2, ptyip, pcc+1);
 diff -ur telnetd.orig/utility.c /usr/src/contrib/telnet/telnetd/utility.c
 --- telnetd.orig/utility.c	Mon May  9 16:42:22 2005
 +++ /usr/src/contrib/telnet/telnetd/utility.c	Mon May  9 17:01:38 2005
 @@ -66,11 +66,9 @@
   * also flush the pty input buffer (by dropping its data) if it becomes
   * too full.
   */
 -
 -    void
 -ttloop()
 +void
 +ttloop(void)
  {
 -
      DIAG(TD_REPORT, output_data("td: ttloop\r\n"));
      if (nfrontp - nbackp > 0) {
  	netflush();
 @@ -393,22 +391,6 @@
  	editedhost[sizeof editedhost - 1] = '\0';
  }
 
 -static char *putlocation;
 -
 -static void
 -putstr(const char *s)
 -{
 -
 -	while (*s)
 -		putchr(*s++);
 -}
 -
 -void
 -putchr(int cc)
 -{
 -	*putlocation++ = cc;
 -}
 -
  #ifdef __FreeBSD__
  static char fmtstr[] = { "%+" };
  #else
 @@ -416,11 +398,12 @@
  #endif
 
  void
 -putf(char *cp, char *where)
 +putf(char *cp, char *where, size_t where_size)
  {
  	char *slash;
  	time_t t;
  	char db[100];
 +	char ch_str[2] = {0, 0};
  #ifdef __FreeBSD__
  	static struct utsname kerninfo;
 
 @@ -428,19 +411,13 @@
  		uname(&kerninfo);
  #endif
 
 -	putlocation = where;
 -
 -	while (*cp) {
 -		if (*cp =='\n') {
 -			putstr("\r\n");
 -			cp++;
 -			continue;
 +	while (*cp != 0) {
 +		if (*cp == '\n') {
 +			strlcat(where, "\r\n", where_size);
  		} else if (*cp != '%') {
 -			putchr(*cp++);
 -			continue;
 -		}
 -		switch (*++cp) {
 -
 +			*ch_str = *cp;
 +			strlcat(where, ch_str, where_size);
 +		} else switch (*++cp) {
  		case 't':
  #ifdef	STREAMSPTY
  			/* names are like /dev/pts/2 -- we want pts/2 */
 @@ -448,46 +425,42 @@
  #else
  			slash = strrchr(line, '/');
  #endif
 -			if (slash == (char *) 0)
 -				putstr(line);
 +			if (slash == NULL)
 +				strlcat(where, line, where_size);
  			else
 -				putstr(&slash[1]);
 +				strlcat(where, &slash[1], where_size);
  			break;
 -
  		case 'h':
 -			putstr(editedhost);
 +			strlcat(where, editedhost, where_size);
  			break;
 -
  		case 'd':
  #ifdef __FreeBSD__
  			setlocale(LC_TIME, "");
  #endif
  			(void)time(&t);
  			(void)strftime(db, sizeof(db), fmtstr, localtime(&t));
 -			putstr(db);
 +			strlcat(where, db, where_size);
  			break;
 -
  #ifdef __FreeBSD__
  		case 's':
 -			putstr(kerninfo.sysname);
 +			strlcat(where, kerninfo.sysname, where_size);
  			break;
 -
  		case 'm':
 -			putstr(kerninfo.machine);
 +			strlcat(where, kerninfo.machine, where_size);
  			break;
 -
  		case 'r':
 -			putstr(kerninfo.release);
 +			strlcat(where, kerninfo.release, where_size);
  			break;
 -
  		case 'v':
 -			putstr(kerninfo.version);
 +			strlcat(where, kerninfo.version, where_size);
  			break;
  #endif
 -
  		case '%':
 -			putchr('%');
 +			*ch_str = '%';
 +			strlcat(where, ch_str, where_size);
  			break;
 +		case 0:
 +			return;
  		}
  		cp++;
  	}

From: Maxim Konovalov <maxim@macomnet.ru>
To: Rostislav Krasny <rosti.bsd@gmail.com>
Cc: bug-followup@freebsd.org
Subject: bin/80732
Date: Wed, 25 May 2005 10:40:52 +0400 (MSD)

 Why didn't you check the return code from malloc(3) and read(2)?
 Could you please fix that?  Could you remove all style(9) changes
 from your diff?
 
 -- 
 Maxim Konovalov

From: Rostislav Krasny <rosti.bsd@gmail.com>
To: Maxim Konovalov <maxim@macomnet.ru>
Cc: bug-followup@freebsd.org
Subject: Re: bin/80732
Date: Fri, 27 May 2005 04:22:06 +0200

 This is a multi-part message in MIME format.
 --------------070103080705040905030601
 Content-Type: text/plain; charset=us-ascii; format=flowed
 Content-Transfer-Encoding: 7bit
 
 Maxim Konovalov wrote:
 > Why didn't you check the return code from malloc(3) and read(2)?
 > Could you please fix that?  Could you remove all style(9) changes
 > from your diff?
 
 Fixed. Thank you for the comment. New diff of telnetd(8) is attached to 
 this email (inline).
 
 P.S. The original diff of getty(8) doesn't need any change so far.
 
 --------------070103080705040905030601
 Content-Type: text/plain;
  name="telnetd2.patch"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
  filename="telnetd2.patch"
 
 diff -ur telnetd.orig/ext.h /usr/src/contrib/telnet/telnetd/ext.h
 --- telnetd.orig/ext.h	Sat Dec  1 00:28:07 2001
 +++ /usr/src/contrib/telnet/telnetd/ext.h	Thu May 26 23:37:30 2005
 @@ -112,8 +112,7 @@
  #endif
  	process_slc(unsigned char, unsigned char, cc_t),
  	ptyflush(void),
 -	putchr(int),
 -	putf(char *, char *),
 +	putf(char *, char *, size_t),
  	recv_ayt(void),
  	send_do(int, int),
  	send_dont(int, int),
 diff -ur telnetd.orig/telnetd.c /usr/src/contrib/telnet/telnetd/telnetd.c
 --- telnetd.orig/telnetd.c	Sun Feb 13 15:17:23 2005
 +++ /usr/src/contrib/telnet/telnetd/telnetd.c	Fri May 27 03:00:29 2005
 @@ -42,7 +42,6 @@
  #include "telnetd.h"
  #include "pathnames.h"
  
 -#include <sys/mman.h>
  #include <err.h>
  #include <libutil.h>
  #include <paths.h>
 @@ -740,6 +739,7 @@
  	char *HE;
  	char *HN;
  	char *IM;
 +	char *IF;
  	int nfd;
  
  	/*
 @@ -904,18 +904,39 @@
  
  		HE = Getstr("he", &cp);
  		HN = Getstr("hn", &cp);
 -		IM = Getstr("im", &cp);
 +		IF = Getstr("if", &cp);
  		if (HN && *HN)
  			(void) strlcpy(host_name, HN, sizeof(host_name));
 -		if (IM == 0)
 -			IM = strdup("");
 +		if (IF != NULL) {
 +			int if_fd;
 +
 +			if ((if_fd = open(IF, O_RDONLY)) != -1) {
 +				struct stat if_fst;
 +				ssize_t if_r;
 +
 +				fstat(if_fd, &if_fst);
 +				IM = malloc(if_fst.st_size + 1);
 +				if (IM != NULL) {
 +					if_r = read(if_fd, IM, if_fst.st_size);
 +					IM[(if_r != -1)? if_r : 0] = 0;
 +				}
 +				close(if_fd);
 +			} else {
 +				IF = NULL;
 +			}
 +		}
 +		if (IF == NULL) {
 +			IM = Getstr("im", &cp);
 +			if (IM == NULL)
 +				IM = strdup("");
 +		}
  	} else {
  		IM = strdup(DEFAULT_IM);
  		HE = 0;
  	}
  	edithost(HE, host_name);
  	if (hostinfo && *IM)
 -		putf(IM, ptyibuf2);
 +		putf(IM, ptyibuf2, BUFSIZ);
  
  	if (pcc)
  		(void) strncat(ptyibuf2, ptyip, pcc+1);
 diff -ur telnetd.orig/utility.c /usr/src/contrib/telnet/telnetd/utility.c
 --- telnetd.orig/utility.c	Sun May  4 05:54:49 2003
 +++ /usr/src/contrib/telnet/telnetd/utility.c	Thu May 26 23:37:42 2005
 @@ -393,22 +393,6 @@
  	editedhost[sizeof editedhost - 1] = '\0';
  }
  
 -static char *putlocation;
 -
 -static void
 -putstr(const char *s)
 -{
 -
 -	while (*s)
 -		putchr(*s++);
 -}
 -
 -void
 -putchr(int cc)
 -{
 -	*putlocation++ = cc;
 -}
 -
  #ifdef __FreeBSD__
  static char fmtstr[] = { "%+" };
  #else
 @@ -416,11 +400,12 @@
  #endif
  
  void
 -putf(char *cp, char *where)
 +putf(char *cp, char *where, size_t where_size)
  {
  	char *slash;
  	time_t t;
  	char db[100];
 +	char ch_str[2] = {0, 0};
  #ifdef __FreeBSD__
  	static struct utsname kerninfo;
  
 @@ -428,19 +413,13 @@
  		uname(&kerninfo);
  #endif
  
 -	putlocation = where;
 -
  	while (*cp) {
  		if (*cp =='\n') {
 -			putstr("\r\n");
 -			cp++;
 -			continue;
 +			strlcat(where, "\r\n", where_size);
  		} else if (*cp != '%') {
 -			putchr(*cp++);
 -			continue;
 -		}
 -		switch (*++cp) {
 -
 +			*ch_str = *cp;
 +			strlcat(where, ch_str, where_size);
 +		} else switch (*++cp) {
  		case 't':
  #ifdef	STREAMSPTY
  			/* names are like /dev/pts/2 -- we want pts/2 */
 @@ -448,14 +427,14 @@
  #else
  			slash = strrchr(line, '/');
  #endif
 -			if (slash == (char *) 0)
 -				putstr(line);
 +			if (slash == NULL)
 +				strlcat(where, line, where_size);
  			else
 -				putstr(&slash[1]);
 +				strlcat(where, &slash[1], where_size);
  			break;
  
  		case 'h':
 -			putstr(editedhost);
 +			strlcat(where, editedhost, where_size);
  			break;
  
  		case 'd':
 @@ -464,30 +443,34 @@
  #endif
  			(void)time(&t);
  			(void)strftime(db, sizeof(db), fmtstr, localtime(&t));
 -			putstr(db);
 +			strlcat(where, db, where_size);
  			break;
  
  #ifdef __FreeBSD__
  		case 's':
 -			putstr(kerninfo.sysname);
 +			strlcat(where, kerninfo.sysname, where_size);
  			break;
  
  		case 'm':
 -			putstr(kerninfo.machine);
 +			strlcat(where, kerninfo.machine, where_size);
  			break;
  
  		case 'r':
 -			putstr(kerninfo.release);
 +			strlcat(where, kerninfo.release, where_size);
  			break;
  
  		case 'v':
 -			putstr(kerninfo.version);
 +			strlcat(where, kerninfo.version, where_size);
  			break;
  #endif
  
  		case '%':
 -			putchr('%');
 +			*ch_str = '%';
 +			strlcat(where, ch_str, where_size);
  			break;
 +
 +		case 0:
 +			return;
  		}
  		cp++;
  	}
 
 --------------070103080705040905030601--

From: Rostislav Krasny <rosti.bsd@gmail.com>
To: bug-followup@freebsd.org
Cc: Maxim Konovalov <maxim@macomnet.ru>
Subject: Re: bin/80732
Date: Wed, 08 Jun 2005 06:05:23 +0200

 This is a multi-part message in MIME format.
 --------------030108020503080009020802
 Content-Type: text/plain; charset=us-ascii; format=flowed
 Content-Transfer-Encoding: 7bit
 
 During a private discussion with Maxim Konovalov I've realized that the 
 original getty(8) actually does print the IF file (/etc/issue) but only 
 once - before the very first IM message. When I did make the getty(8) 
 and the telnetd(8) patches I thought that the IM is really an initial 
 message and there should be no super-initial message before it; i.e. if 
 the IF file is defined and accessible, its contents should be a 
 replacement of the IM.
 
 I still think so, but also I think getty(8) and telnetd(8) should behave 
 by the same way during a login process. Try doing following experiment 
 with the original getty(8) on any pseudo-terminal:
 
 1. Press the Enter key a few times. After each pressing you'll see the 
 IM message before each "login:" prompt.
 2. Try login with a wrong password or a wrong username and after you get 
 a new "login:" prompt press the Enter key a few times again. Now you'll 
 see only the "login:" prompts, without the IM message before any of them.
 
 If you do the same experiment with the original telnetd(8) you see the 
 IM message only once - before the very first "login:" prompt.
 
 Therefore, in addition to the last version of telnetd(8) patch, I made a 
 new version of getty(8) patch that makes getty(8) to be with the same 
 behavior like telnetd(8).
 
 --------------030108020503080009020802
 Content-Type: text/plain;
  name="main.c.diff"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
  filename="main.c.diff"
 
 --- main.c.orig	Mon Jun  6 09:16:37 2005
 +++ main.c	Mon Jun  6 09:21:45 2005
 @@ -312,24 +312,23 @@
  			putpad(CL);
  		edithost(HE);
  
 -		/* if this is the first time through this, and an
 -		   issue file has been given, then send it */
 -		if (first_time && IF) {
 -			int fd;
 +		if (first_time && !(PL && PP)) {
 +			int fd = -1;
  
 -			if ((fd = open(IF, O_RDONLY)) != -1) {
 -				char * cp;
 +			if (IF) {
 +				if ((fd = open(IF, O_RDONLY)) != -1) {
 +					char * cp;
  
 -				while ((cp = getline(fd)) != NULL) {
 -					  putf(cp);
 +					while ((cp = getline(fd)) != NULL)
 +						putf(cp);
 +					close(fd);
  				}
 -				close(fd);
  			}
 +			if (fd == -1 && IM && *IM)
 +				putf(IM);
 +			first_time = 0;
  		}
 -		first_time = 0;
  
 -		if (IM && *IM && !(PL && PP))
 -			putf(IM);
  		if (setjmp(timeout)) {
  			cfsetispeed(&tmode, B0);
  			cfsetospeed(&tmode, B0);
 
 --------------030108020503080009020802--
 
>Unformatted:
