Print this page
12306 XPG4v2 slave pty behaviour should generally be disabled
Reviewed by: Robert Mustacchi <rm@fingolfin.org>
Change-ID: I7ccd399c22866f34dd20c6bb9d28e77ba4e24c67

*** 20,67 **** */ /* * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* Copyright (c) 1988 AT&T */ /* All Rights Reserved */ #include "lint.h" - #include <sys/mkdev.h> #include <limits.h> #include <stdarg.h> #include <unistd.h> - #include <strings.h> - #include <errno.h> - #include <sys/stat.h> #include <sys/fcntl.h> - #include <sys/stropts.h> - #include <sys/stream.h> - #include <sys/ptms.h> #include <sys/syscall.h> #include "libc.h" - static int xpg4_fixup(int fd); - static void push_module(int fd); - static int isptsfd(int fd); - static void itoa(int i, char *ptr); - int __openat(int dfd, const char *path, int oflag, mode_t mode) { ! int fd = syscall(SYS_openat, dfd, path, oflag, mode); ! return (xpg4_fixup(fd)); } int __open(const char *path, int oflag, mode_t mode) { #if defined(_RETAIN_OLD_SYSCALLS) ! int fd = syscall(SYS_open, path, oflag, mode); ! return (xpg4_fixup(fd)); #else return (__openat(AT_FDCWD, path, oflag, mode)); #endif } --- 20,55 ---- */ /* * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * + * Copyright 2020 OmniOS Community Edition (OmniOSce) Association. */ /* Copyright (c) 1988 AT&T */ /* All Rights Reserved */ #include "lint.h" #include <limits.h> #include <stdarg.h> #include <unistd.h> #include <sys/fcntl.h> #include <sys/syscall.h> #include "libc.h" int __openat(int dfd, const char *path, int oflag, mode_t mode) { ! return (syscall(SYS_openat, dfd, path, oflag, mode)); } int __open(const char *path, int oflag, mode_t mode) { #if defined(_RETAIN_OLD_SYSCALLS) ! return (syscall(SYS_open, path, oflag, mode)); #else return (__openat(AT_FDCWD, path, oflag, mode)); #endif }
*** 68,183 **** #if !defined(_LP64) int __openat64(int dfd, const char *path, int oflag, mode_t mode) { ! int fd = syscall(SYS_openat64, dfd, path, oflag, mode); ! return (xpg4_fixup(fd)); } int __open64(const char *path, int oflag, mode_t mode) { #if defined(_RETAIN_OLD_SYSCALLS) ! int fd = syscall(SYS_open64, path, oflag, mode); ! return (xpg4_fixup(fd)); #else return (__openat64(AT_FDCWD, path, oflag, mode)); #endif } #endif /* !_LP64 */ - - /* - * XPG4v2 requires that open of a slave pseudo terminal device - * provides the process with an interface that is identical to - * the terminal interface. For a more detailed discussion, - * see bugid 4025044. - */ - static int - xpg4_fixup(int fd) - { - if (libc__xpg4 != 0 && fd >= 0 && isptsfd(fd)) - push_module(fd); - return (fd); - } - - /* - * Check if the file matches an entry in the /dev/pts directory. - * Be careful to preserve errno. - */ - static int - isptsfd(int fd) - { - char buf[TTYNAME_MAX]; - char *str1 = buf; - const char *str2 = "/dev/pts/"; - struct stat64 fsb, stb; - int oerrno = errno; - int rval = 0; - - if (fstat64(fd, &fsb) == 0 && S_ISCHR(fsb.st_mode)) { - /* - * Do this without strcpy() or strlen(), - * to avoid invoking the dynamic linker. - */ - while (*str2 != '\0') - *str1++ = *str2++; - /* - * Inline version of minor(dev), to avoid the dynamic linker. - */ - itoa(fsb.st_rdev & MAXMIN, str1); - if (stat64(buf, &stb) == 0) - rval = (stb.st_rdev == fsb.st_rdev); - } - errno = oerrno; - return (rval); - } - - /* - * Converts a number to a string (null terminated). - */ - static void - itoa(int i, char *ptr) - { - int dig = 0; - int tempi; - - tempi = i; - do { - dig++; - tempi /= 10; - } while (tempi); - - ptr += dig; - *ptr = '\0'; - while (--dig >= 0) { - *(--ptr) = i % 10 + '0'; - i /= 10; - } - } - - /* - * Push modules to provide tty semantics - */ - static void - push_module(int fd) - { - struct strioctl istr; - int oerrno = errno; - - istr.ic_cmd = PTSSTTY; - istr.ic_len = 0; - istr.ic_timout = 0; - istr.ic_dp = NULL; - if (ioctl(fd, I_STR, &istr) != -1) { - (void) ioctl(fd, __I_PUSH_NOCTTY, "ptem"); - (void) ioctl(fd, __I_PUSH_NOCTTY, "ldterm"); - (void) ioctl(fd, __I_PUSH_NOCTTY, "ttcompat"); - istr.ic_cmd = PTSSTTY; - istr.ic_len = 0; - istr.ic_timout = 0; - istr.ic_dp = NULL; - (void) ioctl(fd, I_STR, &istr); - } - errno = oerrno; - } --- 56,74 ---- #if !defined(_LP64) int __openat64(int dfd, const char *path, int oflag, mode_t mode) { ! return (syscall(SYS_openat64, dfd, path, oflag, mode)); } int __open64(const char *path, int oflag, mode_t mode) { #if defined(_RETAIN_OLD_SYSCALLS) ! return (syscall(SYS_open64, path, oflag, mode)); #else return (__openat64(AT_FDCWD, path, oflag, mode)); #endif } #endif /* !_LP64 */