aboutsummaryrefslogtreecommitdiff
path: root/tests/ipc_msg.c
diff options
context:
space:
mode:
authorEugene Syromyatnikov <evgsyr@gmail.com>2016-09-13 19:18:42 +0300
committerDmitry V. Levin <ldv@altlinux.org>2016-09-13 17:21:20 +0000
commit1bc727fc2fe023bad35f6ad451e638d5eaafc737 (patch)
tree76a3ad939b1f093b5764940d3d4994993be92434 /tests/ipc_msg.c
parentecc9fc1e49519ff0f916a2aef9ffff3a928ad755 (diff)
downloadstrace-1bc727fc2fe023bad35f6ad451e638d5eaafc737.tar.gz
tests: add more IPC decoding checks
* tests/ipc_msg.c: Additional msgget (parameter format) and msgctl (parameter format, decoding of struct msqid_ds in IPC_SET/IPC_STAT commands) checks. * tests/ipc_sem.c: Additional semget and semctl checks. * tests/ipc_shm.c: Additional shmget and shmctl checks. * tests/semop.c: Additional semop checks. Add checks for semtimedop. * tests/semop.test: Add explicit -e parameter in order to trace both semop and semtimedop. * tests/shmxt.c: Additional shmat and shmdt checks.
Diffstat (limited to 'tests/ipc_msg.c')
-rw-r--r--tests/ipc_msg.c76
1 files changed, 65 insertions, 11 deletions
diff --git a/tests/ipc_msg.c b/tests/ipc_msg.c
index b6b3c993..b4938439 100644
--- a/tests/ipc_msg.c
+++ b/tests/ipc_msg.c
@@ -32,6 +32,26 @@
#include <stdlib.h>
#include <sys/msg.h>
+#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.
+ */
+#undef TEST_MSGCTL_BOGUS_ADDR
+#if defined __GLIBC__ && defined POWERPC64
+# if !(defined __GLIBC_MINOR__) \
+ || ((__GLIBC__ << 16) + __GLIBC_MINOR__ < (2 << 16) + 23)
+# define TEST_MSGCTL_BOGUS_ADDR 0
+# endif
+#endif /* __GLIBC__ && POWERPC64 */
+
+#ifndef TEST_MSGCTL_BOGUS_ADDR
+# define TEST_MSGCTL_BOGUS_ADDR 1
+#endif
+
static int id = -1;
static void
@@ -47,28 +67,62 @@ main(void)
{
static const key_t private_key =
(key_t) (0xffffffff00000000ULL | IPC_PRIVATE);
+ static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
+ static const int bogus_msgid = 0xfdb97531;
+ static const int bogus_cmd = 0xdeadbeef;
+#if TEST_MSGCTL_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 TEST_MSGCTL_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, &ds))
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",
- 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,
- (unsigned) ds.msg_stime, (unsigned) ds.msg_rtime,
- (unsigned) ds.msg_ctime, (unsigned) ds.msg_qnum,
- (unsigned) ds.msg_qbytes, (unsigned) ds.msg_lspid,
- (unsigned) ds.msg_lrpid);
+ 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,
+ (unsigned) ds.msg_stime, (unsigned) ds.msg_rtime,
+ (unsigned) ds.msg_ctime, (unsigned) ds.msg_qnum,
+ (unsigned) ds.msg_qbytes, (unsigned) ds.msg_lspid,
+ (unsigned) ds.msg_lrpid);
+
+ if (msgctl(id, IPC_SET, &ds))
+ 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,
+ (unsigned) ds.msg_perm.mode);
rc = msgctl(0, MSG_INFO, &ds);
printf("msgctl\\(0, (IPC_64\\|)?MSG_INFO, %p\\) += %s\n",