Skip to content

Commit

Permalink
Convert telnetd(8) to use posix_openpt(2).
Browse files Browse the repository at this point in the history
Some time ago I got some reports MPSAFE TTY broke telnetd(8). Even
though it turned out to be a different problem within the TTY code, I
spotted a small issue with telnetd(8). Instead of allocating PTY's using
openpty(3) or posix_openpt(2), it used its own PTY allocation routine.
This means that telnetd(8) still uses /dev/ptyXX-style devices.

I've also increased the size of line[]. Even though 16 should be enough,
we already use 13 bytes ("/dev/pts/999", including '\0'). 32 bytes gives
us a little more freedom.

Also enable -DSTREAMSPTY. Otherwise telnetd(8) strips the PTY's pathname
to the latest slash instead of just removing "/dev/" (e.g. /dev/pts/0 ->
0, instead of pts/0).

Reviewed by:	rink
  • Loading branch information
ed authored and ed committed Nov 13, 2008
1 parent 4ee5cbf commit c737fde
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 37 deletions.
2 changes: 1 addition & 1 deletion contrib/telnet/telnetd/ext.h
Expand Up @@ -77,7 +77,7 @@ extern char *neturg; /* one past last bye of urgent data */
extern int pcc, ncc;

extern int pty, net;
extern char line[16];
extern char line[32];
extern int SYNCHing; /* we are in TELNET SYNCH mode */

extern void
Expand Down
55 changes: 20 additions & 35 deletions contrib/telnet/telnetd/sys_term.c
Expand Up @@ -392,46 +392,31 @@ spcset(int func, cc_t *valp, cc_t **valpp)
*
* Returns the file descriptor of the opened pty.
*/
char alpha[] = "0123456789abcdefghijklmnopqrstuv";
char line[16];
char line[32];

int
getpty(int *ptynum __unused)
{
int p;
const char *cp;
char *p1, *p2;
int i;

(void) strcpy(line, _PATH_DEV);
(void) strcat(line, "ptyXX");
p1 = &line[8];
p2 = &line[9];

for (cp = "pqrsPQRS"; *cp; cp++) {
struct stat stb;

*p1 = *cp;
*p2 = '0';
/*
* This stat() check is just to keep us from
* looping through all 256 combinations if there
* aren't that many ptys available.
*/
if (stat(line, &stb) < 0)
break;
for (i = 0; i < 32; i++) {
*p2 = alpha[i];
p = open(line, 2);
if (p > 0) {
line[5] = 't';
chown(line, 0, 0);
chmod(line, 0600);
return(p);
}
}
}
return(-1);
const char *pn;

p = posix_openpt(O_RDWR|O_NOCTTY);
if (p < 0)
return (-1);

if (grantpt(p) == -1)
return (-1);

if (unlockpt(p) == -1)
return (-1);

pn = ptsname(p);
if (pn == NULL)
return (-1);

strcpy(line, pn);

return (p);
}

#ifdef LINEMODE
Expand Down
3 changes: 2 additions & 1 deletion libexec/telnetd/Makefile
Expand Up @@ -17,7 +17,8 @@ SRCS= global.c slc.c state.c sys_term.c telnetd.c \
WARNS?= 2
WFORMAT?= 0

CFLAGS+= -DLINEMODE -DUSE_TERMIO -DDIAGNOSTICS -DOLD_ENVIRON -DENV_HACK
CFLAGS+= -DLINEMODE -DUSE_TERMIO -DDIAGNOSTICS -DOLD_ENVIRON \
-DENV_HACK -DSTREAMSPTY

.if ${MK_INET6_SUPPORT} != "no"
CFLAGS+= -DINET6
Expand Down

0 comments on commit c737fde

Please sign in to comment.