From patchwork Wed May 27 10:14:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 39365 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0C4BB388B00C; Wed, 27 May 2020 10:14:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0C4BB388B00C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1590574473; bh=9RcSwTuafktfrxsPZP4k9sPheWNzb39AagRFmLtwhRc=; h=To:Subject:In-Reply-To:References:Date:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=vK498mb1O22C7ppM/+PDeBw3pGtdG9flVBps2hOXrhA9wyGLj1ZvmLSbAc+jCTBtL q48wmjjZXgnBV4hTVhgZrRzMIgi1W4TmqBgbWwVN4X+JSubRr28mYDkqpdRPDo3eri Z3UDfIfYkhTBRv5GMjAExZyWhdYHInzU2o1W9TQs= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by sourceware.org (Postfix) with ESMTP id 80ED8386F023 for ; Wed, 27 May 2020 10:14:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 80ED8386F023 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-243-ePkgpd-uOMy6CeIKzCSqiA-1; Wed, 27 May 2020 06:14:26 -0400 X-MC-Unique: ePkgpd-uOMy6CeIKzCSqiA-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id A866C1855A08 for ; Wed, 27 May 2020 10:14:25 +0000 (UTC) Received: from oldenburg2.str.redhat.com (ovpn-113-106.ams2.redhat.com [10.36.113.106]) by smtp.corp.redhat.com (Postfix) with ESMTPS id EF10110013D5 for ; Wed, 27 May 2020 10:14:24 +0000 (UTC) To: libc-alpha@sourceware.org Subject: [PATCH 1/3] login/tst-grantpt: Convert to support framework, more error checking In-Reply-To: References: Message-Id: <9dff973d4e569a30243042a0e4c5ad45dd927c7a.1590574208.git.fweimer@redhat.com> Date: Wed, 27 May 2020 12:14:23 +0200 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Florian Weimer via Libc-alpha From: Florian Weimer Reply-To: Florian Weimer Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" The test now requires working /dev/pts pseudo-terminals. A new subtest (test_not_ptmx) attempts to call grantpt on a pseudo-terminal that is not a ptmx device. POSIX requires an EINVAL error in this case. Reviewed-by: Adhemerval Zanella --- login/tst-grantpt.c | 93 ++++++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 35 deletions(-) diff --git a/login/tst-grantpt.c b/login/tst-grantpt.c index 65bb344909..1d7a220fcf 100644 --- a/login/tst-grantpt.c +++ b/login/tst-grantpt.c @@ -1,3 +1,21 @@ +/* Test for grantpt error corner cases. + Copyright (C) 2001-2020 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + #include #include #include @@ -6,76 +24,81 @@ #include #include #include +#include +#include +#include -static int +/* Test grantpt with a closed descriptor. */ +static void test_ebadf (void) { int fd, ret, err; fd = posix_openpt (O_RDWR); if (fd == -1) - { - printf ("posix_openpt(O_RDWR) failed\nerrno %d (%s)\n", - errno, strerror (errno)); - /* We don't fail because of this; maybe the system does not have - SUS pseudo terminals. */ - return 0; - } - unlockpt (fd); - close (fd); + FAIL_EXIT1 ("posix_openpt(O_RDWR) failed\nerrno %d (%m)\n", errno); + TEST_COMPARE (unlockpt (fd), 0); + xclose (fd); ret = grantpt (fd); err = errno; if (ret != -1 || err != EBADF) { + support_record_failure (); printf ("grantpt(): expected: return = %d, errno = %d\n", -1, EBADF); printf (" got: return = %d, errno = %d\n", ret, err); - return 1; } - return 0; } -static int +/* Test grantpt on a regular file. */ +static void test_einval (void) { int fd, ret, err; - const char file[] = "./grantpt-einval"; - fd = open (file, O_RDWR | O_CREAT, 0600); - if (fd == -1) - { - printf ("open(\"%s\", O_RDWR) failed\nerrno %d (%s)\n", - file, errno, strerror (errno)); - return 0; - } - unlink (file); + fd = create_temp_file ("tst-grantpt-", NULL); + TEST_VERIFY_EXIT (fd >= 0); ret = grantpt (fd); err = errno; if (ret != -1 || err != EINVAL) { + support_record_failure (); printf ("grantpt(): expected: return = %d, errno = %d\n", -1, EINVAL); printf (" got: return = %d, errno = %d\n", ret, err); - ret = 1; } - else - ret = 0; - close (fd); + xclose (fd); +} + +/* Test grantpt on a non-ptmx pseudo-terminal. */ +static void +test_not_ptmx (void) +{ + int ptmx = posix_openpt (O_RDWR); + TEST_VERIFY_EXIT (ptmx >= 0); + TEST_COMPARE (grantpt (ptmx), 0); + TEST_COMPARE (unlockpt (ptmx), 0); + + const char *name = ptsname (ptmx); + TEST_VERIFY_EXIT (name != NULL); + int pts = open (name, O_RDWR | O_NOCTTY); + TEST_VERIFY_EXIT (pts >= 0); + + TEST_COMPARE (grantpt (pts), -1); + TEST_COMPARE (errno, EINVAL); - return ret; + xclose (pts); + xclose (ptmx); } static int do_test (void) { - int result = 0; - - result += test_ebadf (); - result += test_einval (); - - return result; + test_ebadf (); + test_einval (); + test_not_ptmx (); + return 0; } -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" +#include From patchwork Wed May 27 10:14:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 39366 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8EDBC3959E6F; Wed, 27 May 2020 10:14:36 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8EDBC3959E6F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1590574476; bh=UenAAsdwU6SEqyuJXFZhs/YKSu13qDKGLs1Akpat2y0=; h=To:Subject:In-Reply-To:References:Date:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=pVQ08g5Cma7jfiDKt0+6YvfG70n5fO6VvqF4ArNTNyo0tcRthjikZlcxEDTCPSxCh 1FiNP5EIS50zImG/QC6NA8tdHDGHk5zOQRA9tI2wAxyEGHcZZ9jyYnkjiI0s1KbLb7 h1B5NSyPXqOv45RvcRSEDnwpR1fcZZ4FMTpdpQPQ= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) by sourceware.org (Postfix) with ESMTP id 9FF0C386F023 for ; Wed, 27 May 2020 10:14:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 9FF0C386F023 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-17-ZU65lErgMSyL7Oy2bccjdA-1; Wed, 27 May 2020 06:14:32 -0400 X-MC-Unique: ZU65lErgMSyL7Oy2bccjdA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E52D91009613 for ; Wed, 27 May 2020 10:14:31 +0000 (UTC) Received: from oldenburg2.str.redhat.com (ovpn-113-106.ams2.redhat.com [10.36.113.106]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6843960E1C for ; Wed, 27 May 2020 10:14:31 +0000 (UTC) To: libc-alpha@sourceware.org Subject: [PATCH 2/3] Linux: unlockpt needs to fail with EINVAL, not ENOTTY (bug 26053) In-Reply-To: References: Message-Id: <102eb945daf454cce7c0dbd499ce3db1ebb734cd.1590574208.git.fweimer@redhat.com> Date: Wed, 27 May 2020 12:14:29 +0200 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Florian Weimer via Libc-alpha From: Florian Weimer Reply-To: Florian Weimer Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" The EINVAL error code is mandated by POSIX and documented in the manual. Also clean up the unlockpt implementation a bit, assuming that TIOCSPTLCK is always defined. Enhance login/tst-grantpt to cover unlockpt corner cases. Reviewed-by: Adhemerval Zanella --- login/tst-grantpt.c | 20 ++++++++++++++++---- sysdeps/unix/sysv/linux/unlockpt.c | 21 +++++---------------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/login/tst-grantpt.c b/login/tst-grantpt.c index 1d7a220fcf..8ca901ef94 100644 --- a/login/tst-grantpt.c +++ b/login/tst-grantpt.c @@ -1,4 +1,4 @@ -/* Test for grantpt error corner cases. +/* Test for grantpt, unlockpt error corner cases. Copyright (C) 2001-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -28,7 +28,7 @@ #include #include -/* Test grantpt with a closed descriptor. */ +/* Test grantpt, unlockpt with a closed descriptor. */ static void test_ebadf (void) { @@ -48,9 +48,12 @@ test_ebadf (void) printf ("grantpt(): expected: return = %d, errno = %d\n", -1, EBADF); printf (" got: return = %d, errno = %d\n", ret, err); } + + TEST_COMPARE (unlockpt (fd), -1); + TEST_COMPARE (errno, EBADF); } -/* Test grantpt on a regular file. */ +/* Test grantpt, unlockpt on a regular file. */ static void test_einval (void) { @@ -68,10 +71,13 @@ test_einval (void) printf (" got: return = %d, errno = %d\n", ret, err); } + TEST_COMPARE (unlockpt (fd), -1); + TEST_COMPARE (errno, EINVAL); + xclose (fd); } -/* Test grantpt on a non-ptmx pseudo-terminal. */ +/* Test grantpt, unlockpt on a non-ptmx pseudo-terminal. */ static void test_not_ptmx (void) { @@ -80,6 +86,9 @@ test_not_ptmx (void) TEST_COMPARE (grantpt (ptmx), 0); TEST_COMPARE (unlockpt (ptmx), 0); + /* A second unlock succeeds as well. */ + TEST_COMPARE (unlockpt (ptmx), 0); + const char *name = ptsname (ptmx); TEST_VERIFY_EXIT (name != NULL); int pts = open (name, O_RDWR | O_NOCTTY); @@ -88,6 +97,9 @@ test_not_ptmx (void) TEST_COMPARE (grantpt (pts), -1); TEST_COMPARE (errno, EINVAL); + TEST_COMPARE (unlockpt (pts), -1); + TEST_COMPARE (errno, EINVAL); + xclose (pts); xclose (ptmx); } diff --git a/sysdeps/unix/sysv/linux/unlockpt.c b/sysdeps/unix/sysv/linux/unlockpt.c index 3a0ac7a96c..4d98abece0 100644 --- a/sysdeps/unix/sysv/linux/unlockpt.c +++ b/sysdeps/unix/sysv/linux/unlockpt.c @@ -27,22 +27,11 @@ int unlockpt (int fd) { -#ifdef TIOCSPTLCK - int save_errno = errno; int unlock = 0; - if (__ioctl (fd, TIOCSPTLCK, &unlock)) - { - if (errno == EINVAL) - { - __set_errno (save_errno); - return 0; - } - else - return -1; - } -#endif - /* If we have no TIOCSPTLCK ioctl, all slave pseudo terminals are - unlocked by default. */ - return 0; + int ret = __ioctl (fd, TIOCSPTLCK, &unlock); + if (ret != 0 && errno == ENOTTY) + /* POSIX mandates EINVAL for non-ptmx descriptors. */ + __set_errno (EINVAL); + return ret; } From patchwork Wed May 27 10:14:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 39367 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2554F395A44F; Wed, 27 May 2020 10:14:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2554F395A44F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1590574486; bh=nm4FmanGxYQ7TaB/EwCRJ0ZhI8HMTmb1bUAT7n1gvV8=; h=To:Subject:In-Reply-To:References:Date:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=sJTmOQF+agKvQBbEzthYThoTnASeJypXVuCOVVQz0OHDEun+m41H6iXuj4A72GvXR fFfgf6ADz3BZEQObzBWXyNGa/t+cfPJB+vsNrjMiPy1XFnxId5ZgrMsiX5KK5Brz3j Am19dW8GnEf5zMa57egZWICxE6gJzTNErar8f6aY= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) by sourceware.org (Postfix) with ESMTP id 169DD383E82C for ; Wed, 27 May 2020 10:14:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 169DD383E82C Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-489-hEbbK8D6ObyG8-ABphO4ig-1; Wed, 27 May 2020 06:14:40 -0400 X-MC-Unique: hEbbK8D6ObyG8-ABphO4ig-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 003C61855A08 for ; Wed, 27 May 2020 10:14:40 +0000 (UTC) Received: from oldenburg2.str.redhat.com (ovpn-113-106.ams2.redhat.com [10.36.113.106]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E63B3648D7 for ; Wed, 27 May 2020 10:14:38 +0000 (UTC) To: libc-alpha@sourceware.org Subject: [PATCH 3/3] Linux: Require properly configured /dev/pts for PTYs In-Reply-To: References: Message-Id: Date: Wed, 27 May 2020 12:14:37 +0200 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Florian Weimer via Libc-alpha From: Florian Weimer Reply-To: Florian Weimer Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" Current systems do not have BSD terminals, so the fallback code in posix_openpt/getpt does not do anything. Also remove the file system check for /dev/pts. Current systems always have a devpts file system mounted there if /dev/ptmx exists. grantpt is now essentially a no-op. It only verifies that the argument is a ptmx-descriptor. Therefore, this change indirectly addresses bug 24941. Reviewed-by: Adhemerval Zanella --- NEWS | 12 ++++ sysdeps/unix/sysv/linux/getpt.c | 67 +--------------------- sysdeps/unix/sysv/linux/grantpt.c | 73 ++++++++++++------------ sysdeps/unix/sysv/linux/ptsname.c | 95 ++----------------------------- 4 files changed, 55 insertions(+), 192 deletions(-) diff --git a/NEWS b/NEWS index 55389b8466..b8e0408a56 100644 --- a/NEWS +++ b/NEWS @@ -52,6 +52,18 @@ Changes to build and runtime requirements: * powerpc64le requires GCC 7.4 or newer. This is required for supporting long double redirects. +* On Linux, the system administrator needs to configure /dev/pts with + the intended access modes for pseudo-terminals. glibc no longer + attemps to adjust permissions of terminal devices. The previous glibc + defaults ("tty" group, user read/write and group write) already + corresponded to what most systems used, so that grantpt did not + perform any adjustments. + +* On Linux, the posix_openpt and getpt functions no longer attempt to + use legacy (BSD) pseudo-terminals and assume that if /dev/ptmx exists + (and pseudo-terminals are supported), a devpts file system is mounted + on /dev/pts. Current systems already meet these requirements. + Security related changes: CVE-2020-10029: Trigonometric functions on x86 targets suffered from stack diff --git a/sysdeps/unix/sysv/linux/getpt.c b/sysdeps/unix/sysv/linux/getpt.c index 1803b232c9..3cc745e11a 100644 --- a/sysdeps/unix/sysv/linux/getpt.c +++ b/sysdeps/unix/sysv/linux/getpt.c @@ -16,69 +16,18 @@ License along with the GNU C Library; if not, see . */ -#include #include -#include #include #include -#include - -#include "linux_fsinfo.h" /* Path to the master pseudo terminal cloning device. */ #define _PATH_DEVPTMX _PATH_DEV "ptmx" -/* Directory containing the UNIX98 pseudo terminals. */ -#define _PATH_DEVPTS _PATH_DEV "pts" - -/* Prototype for function that opens BSD-style master pseudo-terminals. */ -extern int __bsd_getpt (void) attribute_hidden; /* Open a master pseudo terminal and return its file descriptor. */ int __posix_openpt (int oflag) { - static int have_no_dev_ptmx; - int fd; - - if (!have_no_dev_ptmx) - { - fd = __open (_PATH_DEVPTMX, oflag); - if (fd != -1) - { - struct statfs fsbuf; - static int devpts_mounted; - - /* Check that the /dev/pts filesystem is mounted - or if /dev is a devfs filesystem (this implies /dev/pts). */ - if (devpts_mounted - || (__statfs (_PATH_DEVPTS, &fsbuf) == 0 - && fsbuf.f_type == DEVPTS_SUPER_MAGIC) - || (__statfs (_PATH_DEV, &fsbuf) == 0 - && fsbuf.f_type == DEVFS_SUPER_MAGIC)) - { - /* Everything is ok. */ - devpts_mounted = 1; - return fd; - } - - /* If /dev/pts is not mounted then the UNIX98 pseudo terminals - are not usable. */ - __close (fd); - have_no_dev_ptmx = 1; - __set_errno (ENOENT); - } - else - { - if (errno == ENOENT || errno == ENODEV) - have_no_dev_ptmx = 1; - else - return -1; - } - } - else - __set_errno (ENOENT); - - return -1; + return __open (_PATH_DEVPTMX, oflag); } weak_alias (__posix_openpt, posix_openpt) @@ -86,16 +35,6 @@ weak_alias (__posix_openpt, posix_openpt) int __getpt (void) { - int fd = __posix_openpt (O_RDWR); - if (fd == -1) - fd = __bsd_getpt (); - return fd; + return __posix_openpt (O_RDWR); } - - -#define PTYNAME1 "pqrstuvwxyzabcde"; -#define PTYNAME2 "0123456789abcdef"; - -#define __getpt __bsd_getpt -#define HAVE_POSIX_OPENPT -#include +weak_alias (__getpt, getpt) diff --git a/sysdeps/unix/sysv/linux/grantpt.c b/sysdeps/unix/sysv/linux/grantpt.c index 2030e07fa6..43122f9a76 100644 --- a/sysdeps/unix/sysv/linux/grantpt.c +++ b/sysdeps/unix/sysv/linux/grantpt.c @@ -1,44 +1,41 @@ -#include -#include -#include -#include -#include -#include -#include -#include +/* grantpt implementation for Linux. + Copyright (C) 1998-2020 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Zack Weinberg , 1998. -#include + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. -#include "pty-private.h" + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. -#if HAVE_PT_CHOWN -/* Close all file descriptors except the one specified. */ -static void -close_all_fds (void) -{ - DIR *dir = __opendir ("/proc/self/fd"); - if (dir != NULL) - { - struct dirent64 *d; - while ((d = __readdir64 (dir)) != NULL) - if (isdigit (d->d_name[0])) - { - char *endp; - long int fd = strtol (d->d_name, &endp, 10); - if (*endp == '\0' && fd != PTY_FILENO && fd != dirfd (dir)) - __close_nocancel_nostatus (fd); - } + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include - __closedir (dir); +int +grantpt (int fd) +{ + /* Without pt_chown on Linux, we have delegated the creation of the + pty node with the right group and permission mode to the kernel, and + non-root users are unlikely to be able to change it. Therefore let's + consider that POSIX enforcement is the responsibility of the whole + system and not only the GNU libc. */ - int nullfd = __open_nocancel (_PATH_DEVNULL, O_RDONLY); - assert (nullfd == STDIN_FILENO); - nullfd = __open_nocancel (_PATH_DEVNULL, O_WRONLY); - assert (nullfd == STDOUT_FILENO); - __dup2 (STDOUT_FILENO, STDERR_FILENO); - } + /* Verify that fd refers to a ptmx descriptor. */ + unsigned int ptyno; + int ret = __ioctl (fd, TIOCGPTN, &ptyno); + if (ret != 0 && errno == ENOTTY) + /* POSIX requires EINVAL instead of ENOTTY provided by the kernel. */ + __set_errno (EINVAL); + return ret; } -# define CLOSE_ALL_FDS() close_all_fds() -#endif - -#include diff --git a/sysdeps/unix/sysv/linux/ptsname.c b/sysdeps/unix/sysv/linux/ptsname.c index 81d9d26f1e..3e9be3f0d4 100644 --- a/sysdeps/unix/sysv/linux/ptsname.c +++ b/sysdeps/unix/sysv/linux/ptsname.c @@ -21,39 +21,14 @@ #include #include #include -#include -#include #include #include #include <_itoa.h> -/* Check if DEV corresponds to a master pseudo terminal device. */ -#define MASTER_P(Dev) \ - (__gnu_dev_major ((Dev)) == 2 \ - || (__gnu_dev_major ((Dev)) == 4 \ - && __gnu_dev_minor ((Dev)) >= 128 && __gnu_dev_minor ((Dev)) < 192) \ - || (__gnu_dev_major ((Dev)) >= 128 && __gnu_dev_major ((Dev)) < 136)) - -/* Check if DEV corresponds to a slave pseudo terminal device. */ -#define SLAVE_P(Dev) \ - (__gnu_dev_major ((Dev)) == 3 \ - || (__gnu_dev_major ((Dev)) == 4 \ - && __gnu_dev_minor ((Dev)) >= 192 && __gnu_dev_minor ((Dev)) < 256) \ - || (__gnu_dev_major ((Dev)) >= 136 && __gnu_dev_major ((Dev)) < 144)) - -/* Note that major number 4 corresponds to the old BSD style pseudo - terminal devices. As of Linux 2.1.115 these are no longer - supported. They have been replaced by major numbers 2 (masters) - and 3 (slaves). */ - /* Directory where we can find the slave pty nodes. */ #define _PATH_DEVPTS "/dev/pts/" -/* The are declared in getpt.c. */ -extern const char __libc_ptyname1[] attribute_hidden; -extern const char __libc_ptyname2[] attribute_hidden; - /* Static buffer for `ptsname'. */ static char buffer[sizeof (_PATH_DEVPTS) + 20]; @@ -68,19 +43,15 @@ ptsname (int fd) } +/* Store at most BUFLEN characters of the pathname of the slave pseudo + terminal associated with the master FD is open on in BUF. + Return 0 on success, otherwise an error number. */ int -__ptsname_internal (int fd, char *buf, size_t buflen, struct stat64 *stp) +__ptsname_r (int fd, char *buf, size_t buflen) { int save_errno = errno; unsigned int ptyno; - if (!__isatty (fd)) - { - __set_errno (ENOTTY); - return ENOTTY; - } - -#ifdef TIOCGPTN if (__ioctl (fd, TIOCGPTN, &ptyno) == 0) { /* Buffer we use to print the number in. For a maximum size for @@ -101,67 +72,11 @@ __ptsname_internal (int fd, char *buf, size_t buflen, struct stat64 *stp) memcpy (__stpcpy (buf, devpts), p, &numbuf[sizeof (numbuf)] - p); } - else if (errno != EINVAL) - return errno; else -#endif - { - char *p; - - if (buflen < strlen (_PATH_TTY) + 3) - { - __set_errno (ERANGE); - return ERANGE; - } - - if (__fxstat64 (_STAT_VER, fd, stp) < 0) - return errno; - - /* Check if FD really is a master pseudo terminal. */ - if (! MASTER_P (stp->st_rdev)) - { - __set_errno (ENOTTY); - return ENOTTY; - } - - ptyno = __gnu_dev_minor (stp->st_rdev); - - if (ptyno / 16 >= strlen (__libc_ptyname1)) - { - __set_errno (ENOTTY); - return ENOTTY; - } - - p = __stpcpy (buf, _PATH_TTY); - p[0] = __libc_ptyname1[ptyno / 16]; - p[1] = __libc_ptyname2[ptyno % 16]; - p[2] = '\0'; - } - - if (__xstat64 (_STAT_VER, buf, stp) < 0) + /* Bad file descriptor, or not a ptmx descriptor. */ return errno; - /* Check if the name we're about to return really corresponds to a - slave pseudo terminal. */ - if (! S_ISCHR (stp->st_mode) || ! SLAVE_P (stp->st_rdev)) - { - /* This really is a configuration problem. */ - __set_errno (ENOTTY); - return ENOTTY; - } - __set_errno (save_errno); return 0; } - - -/* Store at most BUFLEN characters of the pathname of the slave pseudo - terminal associated with the master FD is open on in BUF. - Return 0 on success, otherwise an error number. */ -int -__ptsname_r (int fd, char *buf, size_t buflen) -{ - struct stat64 st; - return __ptsname_internal (fd, buf, buflen, &st); -} weak_alias (__ptsname_r, ptsname_r)