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