sys_msg_test: Fix msgsnd() argument passing msgsnd() takes the following arguments: 1. msqid: the message queue ID 2. msgp: a pointer to a struct whose first member is the message type (long) and the second the message itself (char array). 3. msgsz: the size of the message 4. msgflg: optional flags sys_msg.smoke does not correctly specify msgsz, as it provides the size of the whole struct instead of its message (data) member. sys_msg.msgsnd_failure does not provide a pointer to a full struct as msgp. In both cases, this results in the kernel reading garbage on the stack. Fix both issues by providing the appropriate size and struct pointer. Test: run bionic-tests --gtest_filter=sys_msg.* Change-Id: Iaa005e259d3ecfa28484dd66222ed6c4584ffc08
diff --git a/tests/sys_msg_test.cpp b/tests/sys_msg_test.cpp index da45087..b2d855d 100644 --- a/tests/sys_msg_test.cpp +++ b/tests/sys_msg_test.cpp
@@ -56,16 +56,17 @@ long type; char data[32]; } msg = { 1, "hello world" }; - ASSERT_EQ(0, msgsnd(id, &msg, sizeof(msg), 0)); + ASSERT_EQ(0, msgsnd(id, &msg, sizeof(msg.data), 0)); // Queue should be non-empty. ASSERT_EQ(0, msgctl(id, IPC_STAT, &ds)); ASSERT_EQ(1U, ds.msg_qnum); - ASSERT_EQ(sizeof(msg), ds.msg_cbytes); + ASSERT_EQ(sizeof(msg.data), ds.msg_cbytes); // Read the message. memset(&msg, 0, sizeof(msg)); - ASSERT_EQ(static_cast<ssize_t>(sizeof(msg)), msgrcv(id, &msg, sizeof(msg), 0, 0)); + ASSERT_EQ(static_cast<ssize_t>(sizeof(msg.data)), + msgrcv(id, &msg, sizeof(msg.data), 0, 0)); ASSERT_EQ(1, msg.type); ASSERT_STREQ("hello world", msg.data); @@ -98,7 +99,11 @@ } TEST(sys_msg, msgsnd_failure) { + struct { + long type; + char data[1]; + } msg = { 1, "" }; errno = 0; - ASSERT_EQ(-1, msgsnd(-1, "", 0, 0)); + ASSERT_EQ(-1, msgsnd(-1, &msg, sizeof(msg.data), 0)); ASSERT_TRUE(errno == EINVAL || errno == ENOSYS); }