]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
posix: Add invalid flags test for p{write,read}v2
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Mon, 5 Jun 2017 12:13:49 +0000 (09:13 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 21 Jun 2017 13:58:32 +0000 (10:58 -0300)
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.

ChangeLog
misc/tst-preadvwritev2-common.c [new file with mode: 0644]
misc/tst-preadvwritev2.c
misc/tst-preadvwritev64v2.c

index 7371bcbd83cb6e249620afc216538c2175cef0b8..3c9d6ba46118d1cf0297e32eefab17826787ea50 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/misc/tst-preadvwritev2-common.c b/misc/tst-preadvwritev2-common.c
new file mode 100644 (file)
index 0000000..4c53d56
--- /dev/null
@@ -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);
+}
index cf36272dd32dcc6f3c4f0e3163e2f77401ce2633..682c7579da8e2d3b37ab5abdb76728b9c297a0bb 100644 (file)
   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);
 }
index 8d0c48ea788e2ca76de5fc3fe610fdfe11a1e7d5..9ddc7625f043f00ff6d0decf1d17186c05518644 100644 (file)
   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);
 }