[PATCH v4] tests: Additional IPC checks

2016-09-13 Thread Eugene Syromyatnikov
* tests/ipc_msg.c: Additional msgget (parameter format), msgctl
  (parameter format, decoding of struct msqid_ds in IPC_SET/IPC_STAT
  commands) checks.
* tests/ipc_sem.c: Additional semget, semctl checks.
* tests/ipc_shm.c: Additional shmget, shmctl checks.
* tests/semop.c: Additional semop checks. Added checks for semtimedop.
* tests/semop.test: Add explicit -e parameter in order to trace both
  semop and semtimedop.
* tests/shmxt.c: Additional shmat/shmdt tests.
---
Changes since v3:
 * Assertions eliminated.
 * BROKEN_GLIBC macro renamed to SKIP_TEST_BOGUS_ADDR, commits merged.
 * Proper order of static and local variables (which was broken after
   yet another rebase) enforced.
 * tests/shmxt: explicit values converted to constants.

 tests/ipc_msg.c  |   66 ++
 tests/ipc_sem.c  |   28 +++
 tests/ipc_shm.c  |   52 ++
 tests/semop.c|   65 +
 tests/semop.test |2 +-
 tests/shmxt.c|   15 +
 6 files changed, 219 insertions(+), 9 deletions(-)

diff --git a/tests/ipc_msg.c b/tests/ipc_msg.c
index b6b3c99..97f0c80 100644
--- a/tests/ipc_msg.c
+++ b/tests/ipc_msg.c
@@ -31,6 +31,28 @@
 #include 
 #include 
 #include 
+#include 
+
+#include "xlat.h"
+#include "xlat/resource_flags.h"
+
+/*
+ * Before glibc-2.22-122-gbe48165, ppc64 code tried to retrieve data provided 
in
+ * third argument of msgctl call (in case of IPC_SET cmd) which led to
+ * segmentation fault.
+ */
+#if !(defined SKIP_TEST_BOGUS_ADDR)
+# if defined __GLIBC__ && defined POWERPC && defined POWERPC64
+#  if !(defined __GLIBC_MINOR__) || \
+((__GLIBC__ << 16) + __GLIBC_MINOR__ < (2 << 16) + 23)
+#   define SKIP_TEST_BOGUS_ADDR 1
+#  endif
+# endif /* __GLIBC__ && _powerpc__ && __ppc64__ */
+#endif /* !SKIP_TEST_BOGUS_ADDR */
+
+#ifndef SKIP_TEST_BOGUS_ADDR
+# define SKIP_TEST_BOGUS_ADDR 0
+#endif
 
 static int id = -1;
 
@@ -47,21 +69,50 @@ main(void)
 {
static const key_t private_key =
(key_t) (0xULL | IPC_PRIVATE);
+
+   static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
+   static const int bogus_msgid = 0xfdb97531;
+   static const int bogus_cmd = 0xdeadbeef;
+#if !SKIP_TEST_BOGUS_ADDR
+   static void * const bogus_addr = (void *) -1L;
+#endif
+   static const int bogus_flags = 0xface1e55 & ~IPC_CREAT;
+
int rc;
struct msqid_ds ds;
 
+   rc = msgget(bogus_key, bogus_flags);
+   printf("msgget\\(%#llx, %s%s%s%#x\\|%#04o\\) += %s\n",
+   zero_extend_signed_to_ull(bogus_key),
+   IPC_CREAT & bogus_flags ? "IPC_CREAT\\|" : "",
+   IPC_EXCL & bogus_flags ? "IPC_EXCL\\|" : "",
+   IPC_NOWAIT & bogus_flags ? "IPC_NOWAIT\\|" : "",
+   bogus_flags & ~(0777 | IPC_CREAT | IPC_EXCL | IPC_NOWAIT),
+   bogus_flags & 0777,
+   sprintrc_grep(rc));
+
id = msgget(private_key, 0600);
if (id < 0)
perror_msg_and_skip("msgget");
printf("msgget\\(IPC_PRIVATE, 0600\\) += %d\n", id);
atexit(cleanup);
 
+   rc = msgctl(bogus_msgid, bogus_cmd, NULL);
+   printf("msgctl\\(%d, (IPC_64\\|)?%#x /\\* MSG_\\?\\?\\? \\*/, NULL\\) "
+   "+= %s\n", bogus_msgid, bogus_cmd, sprintrc_grep(rc));
+
+#if !SKIP_TEST_BOGUS_ADDR
+   rc = msgctl(bogus_msgid, IPC_SET, bogus_addr);
+   printf("msgctl\\(%d, (IPC_64\\|)?IPC_SET, %p\\) += %s\n",
+   bogus_msgid, bogus_addr, sprintrc_grep(rc));
+#endif
+
if (msgctl(id, IPC_STAT, ))
perror_msg_and_skip("msgctl IPC_STAT");
-   printf("msgctl\\(%d, (IPC_64\\|)?IPC_STAT, \\{msg_perm=\\{uid=%u, 
gid=%u, "
-   "mode=%#o, key=%u, cuid=%u, cgid=%u\\}, msg_stime=%u, 
msg_rtime=%u, "
-   "msg_ctime=%u, msg_qnum=%u, msg_qbytes=%u, msg_lspid=%u, "
-   "msg_lrpid=%u\\}\\) += 0\n",
+   printf("msgctl\\(%d, (IPC_64\\|)?IPC_STAT, \\{msg_perm=\\{uid=%u, "
+   "gid=%u, mode=%#o, key=%u, cuid=%u, cgid=%u\\}, msg_stime=%u, "
+   "msg_rtime=%u, msg_ctime=%u, msg_qnum=%u, msg_qbytes=%u, "
+   "msg_lspid=%u, msg_lrpid=%u\\}\\) += 0\n",
id, (unsigned) ds.msg_perm.uid, (unsigned) ds.msg_perm.gid,
(unsigned) ds.msg_perm.mode, (unsigned) ds.msg_perm.__key,
(unsigned) ds.msg_perm.cuid, (unsigned) ds.msg_perm.cgid,
@@ -70,6 +121,13 @@ main(void)
(unsigned) ds.msg_qbytes, (unsigned) ds.msg_lspid,
(unsigned) ds.msg_lrpid);
 
+   if (msgctl(id, IPC_SET, ))
+   perror_msg_and_skip("msgctl IPC_SET");
+   printf("msgctl\\(%d, (IPC_64\\|)?IPC_SET, \\{msg_perm=\\{uid=%u, "
+   "gid=%u, mode=%#o\\}, ...\\}\\) += 0\n",
+   id, (unsigned) ds.msg_perm.uid, (unsigned) ds.msg_perm.gid,
+   

Re: [PATCH v3 2/2] tests: Workaroud for buggy glibc in ipc_msg test on ppc64

2016-09-13 Thread Dmitry V. Levin
On Tue, Sep 13, 2016 at 02:56:44AM +0300, Eugene Syromyatnikov wrote:
> glibc before 2.23 (glibc-2.22-122-gbe48165? to be more precise) tried to 
> access
> data pointed by third argument of msgctl call on 64-bit PowerPC which led to
> segmentataion fault (instead of EFAULT from kernel).
[...]
> +/*
> + * Before glibc-2.22-122-gbe48165, ppc64 code tried to retrieve data 
> provided in
> + * third argument of msgctl call (in case of IPC_SET cmd) which led to
> + * segmentation fault.
> + */
> +#if !(defined BROKEN_GLIBC)
> +# if defined __GLIBC__ && defined POWERPC && defined POWERPC64
> +#  if !(defined __GLIBC_MINOR__) || \
> +((__GLIBC__ << 16) + __GLIBC_MINOR__ < (2 << 16) + 23)
> +#   define BROKEN_GLIBC 1
> +#  endif
> +# endif /* __GLIBC__ && _powerpc__ && __ppc64__ */
> +#endif /* !BROKEN_GLIBC */
> +
> +#ifndef BROKEN_GLIBC
> +# define BROKEN_GLIBC 0
> +#endif
> +
>  static int id = -1;
>  
>  static void
> @@ -58,7 +76,9 @@ main(void)
>   static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
>   static const int bogus_msgid = 0xfdb97531;
>   static const int bogus_cmd = 0xdeadbeef;
> +#if !BROKEN_GLIBC
>   static void * const bogus_addr = (void *) -1L;
> +#endif
>   static const int bogus_flags = 0xface1e55 & ~IPC_CREAT;
>  
>   assert(msgget(bogus_key, bogus_flags) == -1);
> @@ -81,9 +101,11 @@ main(void)
>   printf("msgctl\\(%d, (IPC_64\\|)?%#x /\\* MSG_\\?\\?\\? \\*/, NULL\\) "
>   "+= %s\n", bogus_msgid, bogus_cmd, sprintrc_grep(-1));
>  
> +#if !BROKEN_GLIBC
>   assert(msgctl(bogus_msgid, IPC_SET, bogus_addr) == -1);
>   printf("msgctl\\(%d, (IPC_64\\|)?IPC_SET, %p\\) += %s\n",
>   bogus_msgid, bogus_addr, sprintrc_grep(-1));
> +#endif
>  
>   if (msgctl(id, IPC_STAT, ))
>   perror_msg_and_skip("msgctl IPC_STAT");

It isn't correct to blame glibc for being buggy if it dereferences
the bogus pointer passed to msgctl.
Could you rename BROKEN_GLIBC to e.g. SKIP_TEST_BOGUS_ADDR, please?

On Tue, Sep 13, 2016 at 09:32:11AM +0200, Andreas Schwab wrote:
> On Sep 13 2016, Eugene Syromyatnikov wrote:
> 
> > glibc before 2.23 (glibc-2.22-122-gbe48165? to be more precise) tried to 
> > access
> > data pointed by third argument of msgctl call on 64-bit PowerPC which led to
> > segmentataion fault (instead of EFAULT from kernel).
> 
> Which is a perfectly valid thing to do, as passing an invalid pointer to
> msgctl (the libc function) invokes undefined behaviour.  If you want to
> test the kernel behaviour you need to talk to the kernel directly.

To be honest, I don't quite like the idea of reimplementing complex
arch-specific syscall wrappers just for the sake of strace tests.
Well, not yet.


-- 
ldv


pgpwISMa0QGsp.pgp
Description: PGP signature
--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel


Re: [PATCH v3 2/2] tests: Workaroud for buggy glibc in ipc_msg test on ppc64

2016-09-13 Thread Andreas Schwab
On Sep 13 2016, Eugene Syromyatnikov 
 wrote:

> On Tue, Sep 13, 2016 at 7:32 AM, Andreas Schwab 
>  wrote:
>> On Sep 13 2016, Eugene Syromyatnikov 
>>  
>> wrote:
>>
>>> glibc before 2.23 (glibc-2.22-122-gbe48165? to be more precise) tried to 
>>> access
>>> data pointed by third argument of msgctl call on 64-bit PowerPC which led to
>>> segmentataion fault (instead of EFAULT from kernel).
>>
>> Which is a perfectly valid thing to do, as passing an invalid pointer to
>> msgctl (the libc function) invokes undefined behaviour.  If you want to
>> test the kernel behaviour you need to talk to the kernel directly.
> Well, http://man7.org/linux/man-pages/man2/msgctl.2.html documents
> this case as EFAULT (and I assume it documents glibc wrapper since it
> usually does so and kernel interface is architecture-dependent).

Section 2 manpages document the kernel syscalls.  You can never count on
EFAULT unless talking to the kernel directly.

Andreas.

-- 
Andreas Schwab, SUSE Labs, sch...@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel


Re: [PATCH v3 2/2] tests: Workaroud for buggy glibc in ipc_msg test on ppc64

2016-09-13 Thread Eugene Syromyatnikov
On Tue, Sep 13, 2016 at 7:32 AM, Andreas Schwab  wrote:
> On Sep 13 2016, Eugene Syromyatnikov 
>  wrote:
>
>> glibc before 2.23 (glibc-2.22-122-gbe48165? to be more precise) tried to 
>> access
>> data pointed by third argument of msgctl call on 64-bit PowerPC which led to
>> segmentataion fault (instead of EFAULT from kernel).
>
> Which is a perfectly valid thing to do, as passing an invalid pointer to
> msgctl (the libc function) invokes undefined behaviour.  If you want to
> test the kernel behaviour you need to talk to the kernel directly.
Well, http://man7.org/linux/man-pages/man2/msgctl.2.html documents
this case as EFAULT (and I assume it documents glibc wrapper since it
usually does so and kernel interface is architecture-dependent).

> Andreas.
>
> --
> Andreas Schwab, SUSE Labs, sch...@suse.de
> GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
> "And now for something completely different."
>
> --
> ___
> Strace-devel mailing list
> Strace-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/strace-devel



-- 
Eugene "eSyr" Syromyatnikov
mailto:evg...@gmail.com
xmpp:eSyr@jabber.{ru|org}

--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel


Re: [PATCH v3 2/2] tests: Workaroud for buggy glibc in ipc_msg test on ppc64

2016-09-13 Thread Andreas Schwab
On Sep 13 2016, Eugene Syromyatnikov 
 wrote:

> glibc before 2.23 (glibc-2.22-122-gbe48165? to be more precise) tried to 
> access
> data pointed by third argument of msgctl call on 64-bit PowerPC which led to
> segmentataion fault (instead of EFAULT from kernel).

Which is a perfectly valid thing to do, as passing an invalid pointer to
msgctl (the libc function) invokes undefined behaviour.  If you want to
test the kernel behaviour you need to talk to the kernel directly.

Andreas.

-- 
Andreas Schwab, SUSE Labs, sch...@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

--
___
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel