From eb3a715584cf010842c63e78a5a90377f9aee7e7 Mon Sep 17 00:00:00 2001 From: Nikodemus Siivola Date: Sat, 12 Feb 2011 15:18:59 +0000 Subject: [PATCH] 1.0.45.22: non-racy RUN-PROGRAM :PTY on OpenBSD Patch by Josh Elsasser, lp#669485. Lifts out the pty-setting logic into its own function for clarity. --- NEWS | 1 + src/runtime/run-program.c | 63 +++++++++++++++++++++++++++++++++------------ version.lisp-expr | 2 +- 3 files changed, 49 insertions(+), 17 deletions(-) diff --git a/NEWS b/NEWS index d4165fd..6679277 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ changes relative to sbcl-1.0.45: * bug fix: Solaris/x86-64 wasn't getting built with lutex support by mistake. (lp#667297). * bug fix: CONSTANTLY generated functions had bogus lambda-lists. (lp#713626) + * bug fix: RUN-PROGRAM :PTY option was racy on OpenBSD. (lp#669485) changes in sbcl-1.0.45 relative to sbcl-1.0.44: * enhancement: ~/ and ~user/ are treated specially in pathnames. diff --git a/src/runtime/run-program.c b/src/runtime/run-program.c index d1d98e6..64d9bdf 100644 --- a/src/runtime/run-program.c +++ b/src/runtime/run-program.c @@ -29,6 +29,10 @@ #include #include +#ifdef LISP_FEATURE_OPENBSD +/* FIXME: there has to be a better way to avoid ./util.h here */ +#include +#endif /* borrowed from detachtty's detachtty.c, in turn borrowed from APUE * example code found at @@ -54,6 +58,45 @@ int set_noecho(int fd) return 1; } +#if defined(LISP_FEATURE_OPENBSD) + +int +set_pty(char *pty_name) +{ + int fd; + + if ((fd = open(pty_name, O_RDWR, 0)) == -1 || + login_tty(fd) == -1) + return (0); + return (set_noecho(STDIN_FILENO)); +} + +#else /* !LISP_FEATURE_OPENBSD */ + +int +set_pty(char *pty_name) +{ + int fd; + +#if !defined(LISP_FEATURE_HPUX) && !defined(SVR4) + fd = open("/dev/tty", O_RDWR, 0); + if (fd >= 0) { + ioctl(fd, TIOCNOTTY, 0); + close(fd); + } +#endif + if ((fd = open(pty_name, O_RDWR, 0)) == -1) + return (-1); + dup2(fd, 0); + set_noecho(0); + dup2(fd, 1); + dup2(fd, 2); + close(fd); + return (0); +} + +#endif /* !LISP_FEATURE_OPENBSD */ + extern char **environ; int spawn(char *program, char *argv[], int sin, int sout, int serr, int search, char *envp[], char *pty_name, int wait) @@ -69,7 +112,7 @@ int spawn(char *program, char *argv[], int sin, int sout, int serr, * share stdin with our parent. In the latter case we claim * control of the terminal. */ if (sin >= 0) { -#if defined(LISP_FEATURE_HPUX) +#if defined(LISP_FEATURE_HPUX) || defined(LISP_FEATURE_OPENBSD) setsid(); #elif defined(LISP_FEATURE_DARWIN) setpgid(0, getpid()); @@ -87,21 +130,9 @@ int spawn(char *program, char *argv[], int sin, int sout, int serr, sigprocmask(SIG_SETMASK, &sset, NULL); /* If we are supposed to be part of some other pty, go for it. */ - if (pty_name) { -#if !defined(LISP_FEATURE_HPUX) && !defined(SVR4) - fd = open("/dev/tty", O_RDWR, 0); - if (fd >= 0) { - ioctl(fd, TIOCNOTTY, 0); - close(fd); - } -#endif - fd = open(pty_name, O_RDWR, 0); - dup2(fd, 0); - set_noecho(0); - dup2(fd, 1); - dup2(fd, 2); - close(fd); - } else{ + if (pty_name) + set_pty(pty_name); + else { /* Set up stdin, stdout, and stderr */ if (sin >= 0) dup2(sin, 0); diff --git a/version.lisp-expr b/version.lisp-expr index 1985c81..ee4c24c 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -20,4 +20,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"1.0.45.21" +"1.0.45.22" -- 1.7.10.4