summaryrefslogtreecommitdiffstats
path: root/contrib/telnet/telnetd
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2008-11-13 19:05:27 +0000
committered <ed@FreeBSD.org>2008-11-13 19:05:27 +0000
commitc737fde5da8ad82be2a77a725aa2efdea4213788 (patch)
tree9bb27ba397c1269eb811cb12755d0f59d1c0d053 /contrib/telnet/telnetd
parent4ee5cbf821c9553c41dfee8833555d7d9515f2e6 (diff)
downloadFreeBSD-src-c737fde5da8ad82be2a77a725aa2efdea4213788.zip
FreeBSD-src-c737fde5da8ad82be2a77a725aa2efdea4213788.tar.gz
Convert telnetd(8) to use posix_openpt(2).
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
Diffstat (limited to 'contrib/telnet/telnetd')
-rw-r--r--contrib/telnet/telnetd/ext.h2
-rw-r--r--contrib/telnet/telnetd/sys_term.c55
2 files changed, 21 insertions, 36 deletions
diff --git a/contrib/telnet/telnetd/ext.h b/contrib/telnet/telnetd/ext.h
index 448ba68..25db496 100644
--- a/contrib/telnet/telnetd/ext.h
+++ b/contrib/telnet/telnetd/ext.h
@@ -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
diff --git a/contrib/telnet/telnetd/sys_term.c b/contrib/telnet/telnetd/sys_term.c
index 151c5b4..02a7b7c 100644
--- a/contrib/telnet/telnetd/sys_term.c
+++ b/contrib/telnet/telnetd/sys_term.c
@@ -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
OpenPOWER on IntegriCloud