posix: Add invalid flags test for p{write,read}v2

This patch add an extra test for passing invalid flags and check its
expected failure.  It shows an invalid LO_HI_LONG macro definition for
x86_64 with leads to passing invalid flags on some configurations.

The new tests fails on i686-linux-gnu and potentially on other 32 bits
architecture that uses the compat syscall definition due a kernel bug.
It is intended to be fixed upstream.

Checked on x86_64-linux-gnu

	* misc/tst-preadvwritev2-common.c: New file.
	* misc/tst-preadvwritev2.c (do_test): Add test for invalid flag.
	* misc/tst-preadvwritev64v2.c (do_test): Likewise.
This commit is contained in:
Adhemerval Zanella 2017-06-05 09:13:49 -03:00
parent e9177fba13
commit daa9bdb607
4 changed files with 60 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2017-06-21 Adhemerval Zanella <adhemerval.zanella@linaro.org>
* misc/tst-preadvwritev2-common.c: New file.
* misc/tst-preadvwritev2.c (do_test): Add test for invalid flag.
* misc/tst-preadvwritev64v2.c (do_test): Likewise.
2017-06-21 Szabolcs Nagy <szabolcs.nagy@arm.com>
* sysdeps/aarch64/dl-machine.h (RTLD_START_1): Change _dl_argv to the

View File

@ -0,0 +1,48 @@
/* Common function for preadv2 and pwritev2 tests.
Copyright (C) 2017 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
<http://www.gnu.org/licenses/>. */
#include <support/check.h>
static void
do_test_with_invalid_flags (void)
{
int invalid_flag = 0x1;
#ifdef RWF_HIPRI
invalid_flag <<= 1;
#endif
#ifdef RWF_DSYNC
invalid_flag <<= 1;
#endif
#ifdef RWF_SYNC
invalid_flag <<= 1;
#endif
char buf[32];
const struct iovec vec = { .iov_base = buf, .iov_len = sizeof (buf) };
if (preadv2 (temp_fd, &vec, 1, 0, invalid_flag) != -1)
FAIL_EXIT1 ("preadv2 did not fail with an invalid flag");
if (errno != ENOTSUP)
FAIL_EXIT1 ("preadv2 failure did not set errno to ENOTSUP (%d)", errno);
/* This might fail for compat syscall (32 bits running on 64 bits kernel)
due a kernel issue. */
if (pwritev2 (temp_fd, &vec, 1, 0, invalid_flag) != -1)
FAIL_EXIT1 ("pwritev2 did not fail with an invalid flag");
if (errno != ENOTSUP)
FAIL_EXIT1 ("pwritev2 failure did not set errno to ENOTSUP (%d)", errno);
}

View File

@ -23,9 +23,12 @@
pwritev2 (__fd, __iov, __iovcnt, __offset, 0)
#include "tst-preadvwritev-common.c"
#include "tst-preadvwritev2-common.c"
static int
do_test (void)
{
do_test_with_invalid_flags ();
return do_test_with_offset (0);
}

View File

@ -25,9 +25,12 @@
pwritev2 (__fd, __iov, __iovcnt, __offset, 0)
#include "tst-preadvwritev-common.c"
#include "tst-preadvwritev2-common.c"
static int
do_test (void)
{
do_test_with_invalid_flags ();
return do_test_with_offset (0);
}