>Number:         148915
>Category:       bin
>Synopsis:       [patch] fix telnetd if and im options to behave like getty
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Jul 25 01:50:01 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Dan Ponte
>Release:        FreeBSD 8.1-PRERELEASE amd64
>Organization:
D3ath D3sk Records
>Environment:
System: FreeBSD fez.theamigan.net 8.1-PRERELEASE FreeBSD 8.1-PRERELEASE #2: Wed 
Jul 14 14:05:35 EDT 2010 [email protected]:/usr/obj/usr/src/sys/FEZ8 amd64


>Description:
        This patch fixes telnetd to behave exactly as getty does when
if and im are encountered. If both are encountered, if= outputs before
im=. Otherwise, whichever is set in gettytab is output.
This patch improves upon bin/80732 and bin/23562 to make telnetd's handling
of these options similar to getty's. It also makes sure that %h works inside
the issue file (which requires the putf() to occur after the hostname editing
is complete).

>How-To-Repeat:
        
>Fix:
        Apply the following patch to src/contrib/telnet/telnetd/telnetd.c.

--- telnetd.c.diff begins here ---
--- telnetd.c.orig      2009-08-03 04:13:06.000000000 -0400
+++ telnetd.c   2010-07-24 19:58:11.000000000 -0400
@@ -742,6 +742,8 @@
        char *HE;
        char *HN;
        char *IM;
+       char *IF = NULL;
+       char issbuf[BUFSIZ];
        int nfd;
 
        /*
@@ -907,17 +909,47 @@
                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)
+               else
+                       gethostname(host_name, sizeof(host_name));
+
+               if(IM == NULL)
                        IM = strdup("");
+
+
        } else {
                IM = strdup(DEFAULT_IM);
                HE = 0;
        }
        edithost(HE, host_name);
+
+       bzero(issbuf, sizeof(issbuf));
+
+       if (IF != NULL) {
+               int tfd;
+               struct stat tst;
+               char *tbf;
+
+               tfd = open(IF, O_RDONLY);
+               if (tfd == -1) {
+                       IF = NULL;
+               } else {
+                       fstat(tfd, &tst);
+                       tbf = (char*)mmap(NULL, tst.st_size, PROT_READ,
+                               0, tfd, 0);
+                       strlcpy(issbuf, tbf, sizeof(issbuf));
+                       munmap(tbf, tst.st_size);
+                       close(tfd);
+               }
+       }
+       
        if (hostinfo && *IM)
-               putf(IM, ptyibuf2);
+               strlcat(issbuf, IM, sizeof(issbuf));
+
+       putf(issbuf, ptyibuf2);
 
        if (pcc)
                (void) strncat(ptyibuf2, ptyip, pcc+1);
--- telnetd.c.diff ends here ---

Thanks.
-Dan
>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "[email protected]"

Reply via email to