mirror of
https://sourceware.org/git/glibc.git
synced 2025-10-12 19:04:54 +03:00
Linux: unlockpt needs to fail with EINVAL, not ENOTTY (bug 26053)
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 <adhemerval.zanella@linaro.org>
This commit is contained in:
@@ -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.
|
Copyright (C) 2001-2020 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
#include <support/temp_file.h>
|
#include <support/temp_file.h>
|
||||||
#include <support/xunistd.h>
|
#include <support/xunistd.h>
|
||||||
|
|
||||||
/* Test grantpt with a closed descriptor. */
|
/* Test grantpt, unlockpt with a closed descriptor. */
|
||||||
static void
|
static void
|
||||||
test_ebadf (void)
|
test_ebadf (void)
|
||||||
{
|
{
|
||||||
@@ -48,9 +48,12 @@ test_ebadf (void)
|
|||||||
printf ("grantpt(): expected: return = %d, errno = %d\n", -1, EBADF);
|
printf ("grantpt(): expected: return = %d, errno = %d\n", -1, EBADF);
|
||||||
printf (" got: return = %d, errno = %d\n", ret, err);
|
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
|
static void
|
||||||
test_einval (void)
|
test_einval (void)
|
||||||
{
|
{
|
||||||
@@ -68,10 +71,13 @@ test_einval (void)
|
|||||||
printf (" got: return = %d, errno = %d\n", ret, err);
|
printf (" got: return = %d, errno = %d\n", ret, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_COMPARE (unlockpt (fd), -1);
|
||||||
|
TEST_COMPARE (errno, EINVAL);
|
||||||
|
|
||||||
xclose (fd);
|
xclose (fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Test grantpt on a non-ptmx pseudo-terminal. */
|
/* Test grantpt, unlockpt on a non-ptmx pseudo-terminal. */
|
||||||
static void
|
static void
|
||||||
test_not_ptmx (void)
|
test_not_ptmx (void)
|
||||||
{
|
{
|
||||||
@@ -80,6 +86,9 @@ test_not_ptmx (void)
|
|||||||
TEST_COMPARE (grantpt (ptmx), 0);
|
TEST_COMPARE (grantpt (ptmx), 0);
|
||||||
TEST_COMPARE (unlockpt (ptmx), 0);
|
TEST_COMPARE (unlockpt (ptmx), 0);
|
||||||
|
|
||||||
|
/* A second unlock succeeds as well. */
|
||||||
|
TEST_COMPARE (unlockpt (ptmx), 0);
|
||||||
|
|
||||||
const char *name = ptsname (ptmx);
|
const char *name = ptsname (ptmx);
|
||||||
TEST_VERIFY_EXIT (name != NULL);
|
TEST_VERIFY_EXIT (name != NULL);
|
||||||
int pts = open (name, O_RDWR | O_NOCTTY);
|
int pts = open (name, O_RDWR | O_NOCTTY);
|
||||||
@@ -88,6 +97,9 @@ test_not_ptmx (void)
|
|||||||
TEST_COMPARE (grantpt (pts), -1);
|
TEST_COMPARE (grantpt (pts), -1);
|
||||||
TEST_COMPARE (errno, EINVAL);
|
TEST_COMPARE (errno, EINVAL);
|
||||||
|
|
||||||
|
TEST_COMPARE (unlockpt (pts), -1);
|
||||||
|
TEST_COMPARE (errno, EINVAL);
|
||||||
|
|
||||||
xclose (pts);
|
xclose (pts);
|
||||||
xclose (ptmx);
|
xclose (ptmx);
|
||||||
}
|
}
|
||||||
|
@@ -27,22 +27,11 @@
|
|||||||
int
|
int
|
||||||
unlockpt (int fd)
|
unlockpt (int fd)
|
||||||
{
|
{
|
||||||
#ifdef TIOCSPTLCK
|
|
||||||
int save_errno = errno;
|
|
||||||
int unlock = 0;
|
int unlock = 0;
|
||||||
|
|
||||||
if (__ioctl (fd, TIOCSPTLCK, &unlock))
|
int ret = __ioctl (fd, TIOCSPTLCK, &unlock);
|
||||||
{
|
if (ret != 0 && errno == ENOTTY)
|
||||||
if (errno == EINVAL)
|
/* POSIX mandates EINVAL for non-ptmx descriptors. */
|
||||||
{
|
__set_errno (EINVAL);
|
||||||
__set_errno (save_errno);
|
return ret;
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/* If we have no TIOCSPTLCK ioctl, all slave pseudo terminals are
|
|
||||||
unlocked by default. */
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user