1d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/* 2d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Copyright (c) 2015 Andreas Schwab <schwab@suse.de> 3d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org> 439bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2015-2017 The strace developers. 5d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * All rights reserved. 6d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 7d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Redistribution and use in source and binary forms, with or without 8d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * modification, are permitted provided that the following conditions 9d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * are met: 10d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 1. Redistributions of source code must retain the above copyright 11d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * notice, this list of conditions and the following disclaimer. 12d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright 13d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * notice, this list of conditions and the following disclaimer in the 14d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * documentation and/or other materials provided with the distribution. 15d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 3. The name of the author may not be used to endorse or promote products 16d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * derived from this software without specific prior written permission. 17d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 18d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */ 29d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 30d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "tests.h" 31d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <errno.h> 32d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <stdio.h> 33d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <stdlib.h> 34d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <sys/sem.h> 35d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 36d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat.h" 37d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/resource_flags.h" 38d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 39d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesunion semun { 40dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes int val; /* Value for SETVAL */ 41dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ 42dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes unsigned short *array; /* Array for GETALL, SETALL */ 43dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes struct seminfo *__buf; /* Buffer for IPC_INFO 44d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes (Linux-specific) */ 45d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}; 46d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 47d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic int id = -1; 48d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 49d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void 50d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescleanup(void) 51d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 52d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes semctl(id, 0, IPC_RMID, 0); 53d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("semctl\\(%d, 0, (IPC_64\\|)?IPC_RMID, \\[?NULL\\]?\\) += 0\n", 54d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes id); 55d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes id = -1; 56d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 57d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 58d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesint 59d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesmain(void) 60d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{ 61d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes static const key_t private_key = 62d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes (key_t) (0xffffffff00000000ULL | IPC_PRIVATE); 63d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL; 64d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes static const int bogus_semid = 0xfdb97531; 65d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes static const int bogus_semnum = 0xeca86420; 66d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes static const int bogus_size = 0xdec0ded1; 67d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes static const int bogus_flags = 0xface1e55; 68d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes static const int bogus_cmd = 0xdeadbeef; 69d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes static const unsigned long bogus_arg = 70d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes (unsigned long) 0xbadc0dedfffffaceULL; 71d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 72d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes int rc; 73d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes union semun un; 74d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes struct semid_ds ds; 75d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes struct seminfo info; 76d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 77d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes rc = semget(bogus_key, bogus_size, bogus_flags); 78d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("semget\\(%#llx, %d, %s%s%s%#x\\|%#04o\\) += %s\n", 79d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes zero_extend_signed_to_ull(bogus_key), bogus_size, 80d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes IPC_CREAT & bogus_flags ? "IPC_CREAT\\|" : "", 81d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes IPC_EXCL & bogus_flags ? "IPC_EXCL\\|" : "", 82d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes IPC_NOWAIT & bogus_flags ? "IPC_NOWAIT\\|" : "", 83d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes bogus_flags & ~(0777 | IPC_CREAT | IPC_EXCL | IPC_NOWAIT), 84d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes bogus_flags & 0777, sprintrc_grep(rc)); 85d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 86d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes id = semget(private_key, 1, 0600); 87d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (id < 0) 88d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_skip("semget"); 89d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("semget\\(IPC_PRIVATE, 1, 0600\\) += %d\n", id); 90d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes atexit(cleanup); 91d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 92d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes rc = semctl(bogus_semid, bogus_semnum, bogus_cmd, bogus_arg); 93d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#define SEMCTL_BOGUS_ARG_FMT "(%#lx|\\[(%#lx|NULL)\\]|NULL)" 94d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("semctl\\(%d, %d, (IPC_64\\|)?%#x /\\* SEM_\\?\\?\\? \\*/" 95d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes ", " SEMCTL_BOGUS_ARG_FMT "\\) += %s\n", 96d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes bogus_semid, bogus_semnum, bogus_cmd, 97d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes bogus_arg, bogus_arg, sprintrc_grep(rc)); 98d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 99d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes un.buf = &ds; 100d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes if (semctl(id, 0, IPC_STAT, un)) 101d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes perror_msg_and_skip("semctl IPC_STAT"); 102d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("semctl\\(%d, 0, (IPC_64\\|)?IPC_STAT, \\[?%p\\]?\\) += 0\n", 103d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes id, &ds); 104d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 105d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes un.__buf = &info; 106d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes rc = semctl(0, 0, SEM_INFO, un); 107d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("semctl\\(0, 0, (IPC_64\\|)?SEM_INFO, \\[?%p\\]?\\) += %s\n", 108d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes &info, sprintrc_grep(rc)); 109d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 110d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes un.buf = &ds; 111d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes rc = semctl(id, 0, SEM_STAT, un); 112d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("semctl\\(%d, 0, (IPC_64\\|)?SEM_STAT, \\[?%p\\]?\\) += %s\n", 113d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes id, &ds, sprintrc_grep(rc)); 114d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes 115d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes return 0; 116d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} 117