1d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
2d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Check decoding of mq_open, mq_timedsend, mq_notify, mq_timedreceive and
3d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * mq_unlink syscalls.
4d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
5d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Copyright (c) 2016 Eugene Syromyatnikov <evgsyr@gmail.com>
639bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2016-2017 The strace developers.
7d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * All rights reserved.
8d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
9d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Redistribution and use in source and binary forms, with or without
10d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * modification, are permitted provided that the following conditions
11d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * are met:
12d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 1. Redistributions of source code must retain the above copyright
13d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *    notice, this list of conditions and the following disclaimer.
14d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright
15d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *    notice, this list of conditions and the following disclaimer in the
16d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *    documentation and/or other materials provided with the distribution.
17d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 3. The name of the author may not be used to endorse or promote products
18d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *    derived from this software without specific prior written permission.
19d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
20d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
31d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
32d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "tests.h"
33d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
34d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <asm/unistd.h>
35d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
36d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#if defined __NR_mq_open && __NR_mq_timedsend && __NR_mq_timedreceive && \
37d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	__NR_mq_notify && __NR_mq_unlink
38d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
39d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <assert.h>
40d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <errno.h>
41d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <fcntl.h>
42d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <inttypes.h>
43d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <signal.h>
44d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <stdbool.h>
45d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <stdio.h>
46d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <stdlib.h>
47d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <string.h>
48d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <time.h>
49d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <unistd.h>
50d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
51d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include "sigevent.h"
52d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
53d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# ifndef DUMPIO_READ
54d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#  define DUMPIO_READ 0
55d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif
56d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
57d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# ifndef DUMPIO_WRITE
58d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#  define DUMPIO_WRITE 0
59d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif
60d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
6139bac055674d23770b9a724221b728e443196ea7Elliott Hughesstatic char *mq_name;
62d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
63d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesenum {
64d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	NUM_ATTRS = 8,
65d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	MSG_CUT = 8,
66d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	MSG_MAX_UNCUT = 32,
67d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	MSG_SIZE = 64,
68d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	MSG_START = 0x80,
69d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes};
70d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
71d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
72d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
73d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesprintstr(unsigned char start, unsigned int count)
74d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
75d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	unsigned int i;
76d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
77d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("\"");
78d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	for (i = 0; i < count; i++) {
79d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("\\%hho", (unsigned char) (start + i));
80d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
81d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("\"");
82d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
83d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
84d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#if DUMPIO_READ || DUMPIO_WRITE
85d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
86d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesdumpstr(unsigned char start, unsigned int count)
87d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
88d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	unsigned int i;
89d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	unsigned int j;
90d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
91d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	for (i = 0; i < count; i++) {
92d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (i < count) {
93d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			if (!(i % 16))
94d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printf(" | %05x ", i);
95d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			if (!(i % 8))
96d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printf(" ");
97d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
98d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("%02hhx ", (unsigned char) (start + i));
99d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		}
100d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
101d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if ((i % 16 == 15) || (i == (count - 1))) {
102d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			if (i % 16 != 15)
103d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printf("%*s", 3 * (15 - i % 16) +
104d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				       ((i + 8) % 16) / 8, " ");
105d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
106d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf(" ");
107d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
108d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			for (j = 0; j <= (i % 16); j++)
109d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printf(".");
110d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			for (j = i % 16; j < 15; j++)
111d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printf(" ");
112d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
113d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf(" |\n");
114d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
115d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		}
116d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
117d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
118d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif /* DUMPIO_READ || DUMPIO_WRITE */
119d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
120d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
121d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescleanup(void)
122d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
123d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	long rc;
124d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
12539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	rc = syscall(__NR_mq_unlink, mq_name);
12639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("mq_unlink(\"%s\") = %s\n", mq_name, sprintrc(rc));
127d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
128d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	puts("+++ exited with 0 +++");
129d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
130d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
131d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
132d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesdo_send(int fd, char *msg, unsigned int msg_size, struct timespec *tmout,
133d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	bool cropped)
134d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
135d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	long rc;
136d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	long saved_errno;
137d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
138d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	do {
139d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		rc = syscall(__NR_mq_timedsend, fd, msg, msg_size, 42,
140d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			     tmout);
141d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		saved_errno = errno;
142d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("mq_timedsend(%d, ", fd);
143d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printstr(MSG_START, msg_size > MSG_MAX_UNCUT ? MSG_MAX_UNCUT :
144d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			 msg_size);
145d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (cropped)
146d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("...");
147d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		errno = saved_errno;
14839bac055674d23770b9a724221b728e443196ea7Elliott Hughes		printf(", %u, 42, {tv_sec=%lld, tv_nsec=%llu}) = %s\n", msg_size,
14939bac055674d23770b9a724221b728e443196ea7Elliott Hughes		       (long long) tmout->tv_sec,
15039bac055674d23770b9a724221b728e443196ea7Elliott Hughes		       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
151d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		errno = saved_errno;
152d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
153d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (rc == -1) {
154d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			if (errno == EINTR)
155d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				continue;
156d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_skip("mq_timedsend");
157d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		}
158d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if DUMPIO_WRITE
159d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		dumpstr(MSG_START, msg_size);
160d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif
161d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	} while (rc);
162d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
163d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
164d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
165d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesdo_recv(int fd, char *msg, unsigned int msg_size, struct timespec *tmout,
166d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	bool cropped)
167d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
168d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	long rc;
169d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	long saved_errno;
170d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	unsigned prio;
171d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
172d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	do {
173d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		rc = syscall(__NR_mq_timedreceive, fd, msg, MSG_SIZE, &prio,
174d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			     tmout);
175d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		saved_errno = errno;
176d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("mq_timedreceive(%d, ", fd);
177d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (rc >= 0) {
178d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printstr(MSG_START, rc > MSG_MAX_UNCUT ? MSG_MAX_UNCUT :
179d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				 rc);
180d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			if (cropped)
181d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printf("...");
182d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		} else {
183d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("%p", msg);
184d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		}
185d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		errno = saved_errno;
18639bac055674d23770b9a724221b728e443196ea7Elliott Hughes		printf(", %u, [42], {tv_sec=%lld, tv_nsec=%llu}) = %s\n", MSG_SIZE,
18739bac055674d23770b9a724221b728e443196ea7Elliott Hughes		       (long long) tmout->tv_sec,
18839bac055674d23770b9a724221b728e443196ea7Elliott Hughes		       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
189d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		errno = saved_errno;
190d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
191d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (rc == -1) {
192d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			if (errno == EINTR)
193d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				continue;
194d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			perror_msg_and_skip("mq_timedreceive");
195d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		}
196d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if ((rc >= 0) && ((unsigned long) rc != msg_size))
197d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			error_msg_and_skip("mq_timedreceive size mismatch"
198d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					   ": expected %u, got %ld",
199d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					   msg_size, rc);
200d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if DUMPIO_READ
201d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		dumpstr(MSG_START, rc);
202d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif
203d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	} while (rc < 0);
204d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
205d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
206d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesint
207d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesmain(void)
208d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
209d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static const kernel_ulong_t bogus_zero =
210d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(kernel_ulong_t) 0x8765432100000000ULL;
211d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static const kernel_ulong_t bogus_oflags =
212d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(kernel_ulong_t) 0xdefaced100000003ULL;
213d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static const kernel_ulong_t bogus_mode =
214d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(kernel_ulong_t) 0xdec0deadfacefeedULL;
215d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static const kernel_ulong_t bogus_fd =
216d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(kernel_ulong_t) 0xfeedfacedeadba5eULL;
217d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static const kernel_ulong_t bogus_zero_size =
218d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(sizeof(kernel_ulong_t) > sizeof(int)) ? (kernel_ulong_t) 0 :
219d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			(kernel_ulong_t) 0xface1e5500000000ULL;
220d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static const kernel_ulong_t bogus_size =
221d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(kernel_ulong_t) 0xbadc0dedda7a1057ULL;
222d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static const kernel_ulong_t bogus_prio =
223d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(kernel_ulong_t) 0xdec0ded1defaced3ULL;
224d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static const struct timespec bogus_tmout_data = {
225d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.tv_sec = (time_t) 0xdeadfacebeeff00dLL,
226d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.tv_nsec = (long) 0xfacefee1deadfeedLL,
227d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
228d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static const struct timespec future_tmout_data = {
229d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.tv_sec = (time_t) 0x7ea1fade7e57faceLL,
230d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.tv_nsec = 999999999,
231dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	};
232d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct_sigevent bogus_sev_data = {
233d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.sigev_notify = 0xdefaced,
234d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.sigev_signo = 0xfacefeed,
235d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		.sigev_value.sival_ptr = (unsigned long) 0xdeadbeefbadc0dedULL
236d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
237d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
238d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const char *errstr;
239d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	long rc;
240d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	kernel_long_t *bogus_attrs = tail_alloc(sizeof(*bogus_attrs) *
241d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		NUM_ATTRS);
242d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char *msg = tail_alloc(MSG_SIZE);
24339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned, bogus_prio_ptr);
244d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct timespec *bogus_tmout = tail_memdup(&bogus_tmout_data,
245d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		sizeof(*bogus_tmout));
246d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct timespec *future_tmout = tail_memdup(&future_tmout_data,
247d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		sizeof(*future_tmout));
248d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct_sigevent *bogus_sev = tail_memdup(&bogus_sev_data,
249d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		sizeof(*bogus_sev));
250d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	int fd = -1;
251d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
252d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
253d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	fill_memory_ex(msg, MSG_SIZE, MSG_START, MSG_SIZE);
254d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	fill_memory_ex(bogus_attrs, sizeof(*bogus_attrs) * NUM_ATTRS,
255d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       0xbb, 0x70);
256d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
257d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
258d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* mq_open */
259d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
260d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Zero values, non-O_CREAT mode */
261d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_open, NULL, bogus_zero, bogus_mode, NULL);
262d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_open(NULL, O_RDONLY) = %s\n", sprintrc(rc));
263d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
264d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* O_CREAT parsing, other flags, bogs values */
265d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_open, msg, O_CREAT | bogus_oflags, bogus_mode,
266d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		     NULL);
267d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_open(%p, O_ACCMODE|O_CREAT, %#o, NULL) = %s\n",
268d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       msg, (unsigned short) bogus_mode, sprintrc(rc));
269d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
270d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Partially invalid attributes structure */
271d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_open, msg, O_CREAT | bogus_oflags, bogus_mode,
272d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		     bogus_attrs + 1);
273d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_open(%p, O_ACCMODE|O_CREAT, %#o, %p) = %s\n",
274d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       msg, (unsigned short) bogus_mode, bogus_attrs + 1, sprintrc(rc));
275d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
276d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Valid attributes structure */
277d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_open, msg, O_CREAT | bogus_oflags, bogus_mode,
278d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		     bogus_attrs);
27939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("mq_open(%p, O_ACCMODE|O_CREAT, %#o, {mq_flags=%#llx"
28039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", mq_maxmsg=%lld, mq_msgsize=%lld, mq_curmsgs=%lld}) = %s\n",
281d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       msg, (unsigned short) bogus_mode,
282d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (unsigned long long) (kernel_ulong_t) bogus_attrs[0],
283d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (long long) bogus_attrs[1],
284d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (long long) bogus_attrs[2],
285d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (long long) bogus_attrs[3], sprintrc(rc));
286d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
287d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
288d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* mq_timedsend */
289d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
290d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Zero values*/
291d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_timedsend, bogus_zero, NULL, bogus_zero_size,
292d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		     bogus_zero, NULL);
293d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_timedsend(0, NULL, 0, 0, NULL) = %s\n", sprintrc(rc));
294d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
295d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Invalid pointers */
296d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_timedsend, bogus_fd, msg + MSG_SIZE, bogus_size,
297d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		     bogus_prio, bogus_tmout + 1);
298d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_timedsend(%d, %p, %llu, %u, %p) = %s\n",
299d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) bogus_fd, msg + MSG_SIZE, (unsigned long long) bogus_size,
300d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (unsigned) bogus_prio, bogus_tmout + 1, sprintrc(rc));
301d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
302d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Partially invalid message (memory only partially available) */
303d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_timedsend, bogus_fd, msg + MSG_SIZE - MSG_CUT,
304d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		     MSG_SIZE, bogus_prio, bogus_tmout);
30539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("mq_timedsend(%d, %p, %llu, %u, {tv_sec=%lld, tv_nsec=%llu})"
30639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       " = %s\n",
307d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) bogus_fd, msg + MSG_SIZE - MSG_CUT,
308d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (unsigned long long) MSG_SIZE, (unsigned) bogus_prio,
30939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       (long long) bogus_tmout->tv_sec,
31039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(bogus_tmout->tv_nsec), sprintrc(rc));
311d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
312d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Fully valid message, uncut */
313d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_timedsend, bogus_fd, msg + MSG_SIZE - MSG_CUT,
314d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		     MSG_CUT, bogus_prio, bogus_tmout);
315d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	errstr = sprintrc(rc);
316d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_timedsend(%d, ", (int) bogus_fd);
317d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printstr(MSG_START + MSG_SIZE - MSG_CUT, MSG_CUT);
31839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf(", %llu, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
319d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (unsigned long long) MSG_CUT, (unsigned) bogus_prio,
32039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       (long long) bogus_tmout->tv_sec,
32139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(bogus_tmout->tv_nsec), errstr);
322d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
323d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Partially invalid message, cut at maxstrlen */
324d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_timedsend, bogus_fd, msg + MSG_CUT, MSG_SIZE,
325d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		     bogus_prio, bogus_tmout);
326d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	errstr = sprintrc(rc);
327d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_timedsend(%d, ", (int) bogus_fd);
328d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printstr(MSG_START + MSG_CUT, MSG_MAX_UNCUT);
32939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("..., %llu, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
330d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (unsigned long long) MSG_SIZE, (unsigned) bogus_prio,
33139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       (long long) bogus_tmout->tv_sec,
33239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(bogus_tmout->tv_nsec), errstr);
333d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
334d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
335d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* mq_timedreceive */
336d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
337d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Zero values */
338d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_timedreceive, bogus_zero, NULL, bogus_zero_size,
339d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		     NULL, NULL);
340d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_timedreceive(0, NULL, 0, NULL, NULL) = %s\n", sprintrc(rc));
341d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
342d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Invalid addresses */
343d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_timedreceive, bogus_fd, msg + MSG_SIZE, bogus_size,
344d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		     bogus_prio_ptr + 1, bogus_tmout + 1);
345d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_timedreceive(%d, %p, %llu, %p, %p) = %s\n",
346d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) bogus_fd, msg + MSG_SIZE, (unsigned long long) bogus_size,
347d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       bogus_prio_ptr + 1, bogus_tmout + 1, sprintrc(rc));
348d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
349d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Invalid fd, valid msg pointer */
350d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_timedreceive, bogus_fd, msg, bogus_size,
351d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		     bogus_prio_ptr, bogus_tmout);
35239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("mq_timedreceive(%d, %p, %llu, %p, {tv_sec=%lld, tv_nsec=%llu}) "
35339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       "= %s\n",
354d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) bogus_fd, msg, (unsigned long long) bogus_size,
35539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       bogus_prio_ptr, (long long) bogus_tmout->tv_sec,
35639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(bogus_tmout->tv_nsec), sprintrc(rc));
357d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
358d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
359d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* mq_notify */
360d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
361d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Zero values */
362d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_notify, bogus_zero, NULL);
363d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_notify(0, NULL) = %s\n", sprintrc(rc));
364d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
365d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Invalid pointer */
366d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_notify, bogus_fd, bogus_sev + 1);
367d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_notify(%d, %p) = %s\n",
368d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) bogus_fd, bogus_sev + 1, sprintrc(rc));
369d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
370d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Invalid SIGEV_* */
371d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_notify, bogus_fd, bogus_sev);
372d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_notify(%d, {sigev_value={sival_int=%d, sival_ptr=%#lx}"
373d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       ", sigev_signo=%u, sigev_notify=%#x /* SIGEV_??? */}) = %s\n",
374d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) bogus_fd, bogus_sev->sigev_value.sival_int,
375d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       bogus_sev->sigev_value.sival_ptr,
376d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       bogus_sev->sigev_signo, bogus_sev->sigev_notify,
377d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       sprintrc(rc));
378d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
379d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* SIGEV_NONE */
380d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	bogus_sev->sigev_notify = SIGEV_NONE;
381d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_notify, bogus_fd, bogus_sev);
38239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("mq_notify(%d, {sigev_value={sival_int=%d, sival_ptr=%#lx}"
38339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", sigev_signo=%u, sigev_notify=SIGEV_NONE}) = %s\n",
384d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) bogus_fd, bogus_sev->sigev_value.sival_int,
385d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       bogus_sev->sigev_value.sival_ptr,
386d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       bogus_sev->sigev_signo, sprintrc(rc));
387d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
388d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* SIGEV_SIGNAL */
389d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	bogus_sev->sigev_notify = SIGEV_SIGNAL;
390d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	bogus_sev->sigev_signo = SIGALRM;
391d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_notify, bogus_fd, bogus_sev);
39239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("mq_notify(%d, {sigev_value={sival_int=%d, sival_ptr=%#lx}"
39339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", sigev_signo=SIGALRM, sigev_notify=SIGEV_SIGNAL}) = %s\n",
394d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) bogus_fd, bogus_sev->sigev_value.sival_int,
395d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       bogus_sev->sigev_value.sival_ptr, sprintrc(rc));
396d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
397d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* SIGEV_THREAD */
398d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	bogus_sev->sigev_notify = SIGEV_THREAD;
399d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	bogus_sev->sigev_un.sigev_thread.function =
400d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(unsigned long) 0xdeadbeefbadc0dedULL;
401d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	bogus_sev->sigev_un.sigev_thread.attribute =
402d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(unsigned long) 0xcafef00dfacefeedULL;
403d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_notify, bogus_fd, bogus_sev);
40439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("mq_notify(%d, {sigev_value={sival_int=%d, sival_ptr=%#lx}"
40539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", sigev_signo=SIGALRM, sigev_notify=SIGEV_THREAD"
40639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", sigev_notify_function=%#lx, sigev_notify_attributes=%#lx})"
40739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       " = %s\n",
408d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) bogus_fd, bogus_sev->sigev_value.sival_int,
409d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       bogus_sev->sigev_value.sival_ptr,
410d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       bogus_sev->sigev_un.sigev_thread.function,
411d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       bogus_sev->sigev_un.sigev_thread.attribute, sprintrc(rc));
412d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
413d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* mq_unlink */
414d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
415d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Zero values */
416d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_unlink, NULL);
417d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_unlink(NULL) = %s\n", sprintrc(rc));
418d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
419d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Invalid ptr */
420d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_unlink, msg + MSG_SIZE);
421d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_unlink(%p) = %s\n", msg + MSG_SIZE, sprintrc(rc));
422d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
423d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Long unterminated string */
424d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_unlink, msg);
425d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	errstr = sprintrc(rc);
426d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("mq_unlink(%p) = %s\n", msg, errstr);
427d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
428d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
429d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Sending and receiving test */
430d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
43139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	if (asprintf(&mq_name, "strace-mq_sendrecv-%u.sample", getpid()) < 0)
43239bac055674d23770b9a724221b728e443196ea7Elliott Hughes		perror_msg_and_fail("asprintf");
43339bac055674d23770b9a724221b728e443196ea7Elliott Hughes
434d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if DUMPIO_READ || DUMPIO_WRITE
435d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	close(0);
436d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif
437d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	bogus_attrs[1] = 2;
438d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	bogus_attrs[2] = MSG_SIZE;
43939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	fd = rc = syscall(__NR_mq_open, mq_name,
440dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes			  O_CREAT|O_RDWR|O_NONBLOCK, S_IRWXU, bogus_attrs);
441d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	errstr = sprintrc(rc);
442d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (rc < 0)
443d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		perror_msg_and_skip("mq_open");
444d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	else
445d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		atexit(cleanup);
446d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if DUMPIO_READ || DUMPIO_WRITE
447d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (fd != 0)
448d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		error_msg_and_skip("mq_open returned fd other than 0");
449d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif
450d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	fill_memory_ex(bogus_attrs, sizeof(*bogus_attrs) * NUM_ATTRS,
451d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       0xbb, 0x70);
45239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("mq_open(\"%s\", O_RDWR|O_CREAT|O_NONBLOCK, 0700"
45339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", {mq_flags=%#llx, mq_maxmsg=2, mq_msgsize=%u"
45439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", mq_curmsgs=%lld}) = %s\n",
45539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       mq_name, (unsigned long long) (kernel_ulong_t) bogus_attrs[0],
45639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       MSG_SIZE, (long long) bogus_attrs[3], errstr);
457d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
458d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = syscall(__NR_mq_getsetattr, fd, NULL, bogus_attrs);
459d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (rc < 0)
460d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		perror_msg_and_skip("mq_getsetattr");
461d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if ((bogus_attrs[1] < 2) || (bogus_attrs[2] < MSG_SIZE))
462d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		error_msg_and_skip("mq too small");
463d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
464d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	do_send(fd, msg, MSG_CUT, future_tmout, false);
465d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	do_send(fd, msg, MSG_SIZE, future_tmout, true);
466d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
467d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	memset(msg, '\0', MSG_SIZE);
468d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	do_recv(fd, msg, MSG_CUT, future_tmout, false);
469d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
470d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	memset(msg, '\0', MSG_SIZE);
471d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	do_recv(fd, msg, MSG_SIZE, future_tmout, true);
472d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
473d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	return 0;
474d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
475d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
476d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#else
477d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
478d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesSKIP_MAIN_UNDEFINED("__NR_mq_open && __NR_mq_timedsend && "
479d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	"__NR_mq_timedreceive && __NR_mq_notify && __NR_mq_unlink");
480d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
481d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
482