138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin/* 238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 2015 Andreas Schwab <schwab@suse.de> 3efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org> 439bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2015-2017 The strace developers. 538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * All rights reserved. 638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Redistribution and use in source and binary forms, with or without 838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * modification, are permitted provided that the following conditions 938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * are met: 1038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright 1138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * notice, this list of conditions and the following disclaimer. 1238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright 1338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * notice, this list of conditions and the following disclaimer in the 1438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * documentation and/or other materials provided with the distribution. 1538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products 1638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * derived from this software without specific prior written permission. 1738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 1838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin */ 2938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin 30efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin#include "tests.h" 317230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin#include <errno.h> 32efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin#include <stdio.h> 33efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin#include <stdlib.h> 3412e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin#include <sys/sem.h> 3512e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin 361bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov#include "xlat.h" 371bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov#include "xlat/resource_flags.h" 381bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov 39fa5ce3724646faf3d1a1f379e4046e307df92952Andreas Schwabunion 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 44fa5ce3724646faf3d1a1f379e4046e307df92952Andreas Schwab (Linux-specific) */ 45fa5ce3724646faf3d1a1f379e4046e307df92952Andreas Schwab}; 46fa5ce3724646faf3d1a1f379e4046e307df92952Andreas Schwab 47efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levinstatic int id = -1; 48efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin 49efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levinstatic void 50efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levincleanup(void) 51efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin{ 52efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin semctl(id, 0, IPC_RMID, 0); 53d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes printf("semctl\\(%d, 0, (IPC_64\\|)?IPC_RMID, \\[?NULL\\]?\\) += 0\n", 54d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes id); 55efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin id = -1; 56efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin} 57efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin 5812e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levinint 5912e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levinmain(void) 6012e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin{ 617b93574bc705c2140fdc58fd30c5acefd043571bDmitry V. Levin static const key_t private_key = 627b93574bc705c2140fdc58fd30c5acefd043571bDmitry V. Levin (key_t) (0xffffffff00000000ULL | IPC_PRIVATE); 631bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL; 641bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov static const int bogus_semid = 0xfdb97531; 651bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov static const int bogus_semnum = 0xeca86420; 661bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov static const int bogus_size = 0xdec0ded1; 671bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov static const int bogus_flags = 0xface1e55; 681bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov static const int bogus_cmd = 0xdeadbeef; 691bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov static const unsigned long bogus_arg = 701bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov (unsigned long) 0xbadc0dedfffffaceULL; 711bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov 72efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin int rc; 73fa5ce3724646faf3d1a1f379e4046e307df92952Andreas Schwab union semun un; 747230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin struct semid_ds ds; 757230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin struct seminfo info; 767230d0a38862a286776aedd2e8b6fe86f5891e59Dmitry V. Levin 771bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov rc = semget(bogus_key, bogus_size, bogus_flags); 781bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov printf("semget\\(%#llx, %d, %s%s%s%#x\\|%#04o\\) += %s\n", 791bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov zero_extend_signed_to_ull(bogus_key), bogus_size, 801bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov IPC_CREAT & bogus_flags ? "IPC_CREAT\\|" : "", 811bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov IPC_EXCL & bogus_flags ? "IPC_EXCL\\|" : "", 821bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov IPC_NOWAIT & bogus_flags ? "IPC_NOWAIT\\|" : "", 831bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov bogus_flags & ~(0777 | IPC_CREAT | IPC_EXCL | IPC_NOWAIT), 841bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov bogus_flags & 0777, sprintrc_grep(rc)); 851bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov 867b93574bc705c2140fdc58fd30c5acefd043571bDmitry V. Levin id = semget(private_key, 1, 0600); 8712e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin if (id < 0) 88efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin perror_msg_and_skip("semget"); 8912e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin printf("semget\\(IPC_PRIVATE, 1, 0600\\) += %d\n", id); 90efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin atexit(cleanup); 9112e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin 921bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov rc = semctl(bogus_semid, bogus_semnum, bogus_cmd, bogus_arg); 93d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#define SEMCTL_BOGUS_ARG_FMT "(%#lx|\\[(%#lx|NULL)\\]|NULL)" 941bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov printf("semctl\\(%d, %d, (IPC_64\\|)?%#x /\\* SEM_\\?\\?\\? \\*/" 951ae660572fcc4ea02b889120458f2e1cf2488b83Dmitry V. Levin ", " SEMCTL_BOGUS_ARG_FMT "\\) += %s\n", 961ae660572fcc4ea02b889120458f2e1cf2488b83Dmitry V. Levin bogus_semid, bogus_semnum, bogus_cmd, 971ae660572fcc4ea02b889120458f2e1cf2488b83Dmitry V. Levin bogus_arg, bogus_arg, sprintrc_grep(rc)); 981bc727fc2fe023bad35f6ad451e638d5eaafc737Eugene Syromyatnikov 99fa5ce3724646faf3d1a1f379e4046e307df92952Andreas Schwab un.buf = &ds; 100fa5ce3724646faf3d1a1f379e4046e307df92952Andreas Schwab if (semctl(id, 0, IPC_STAT, un)) 101efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin perror_msg_and_skip("semctl IPC_STAT"); 102499c5aad0c2a4204ce28bd7761cabe9ceba57becDmitry V. Levin printf("semctl\\(%d, 0, (IPC_64\\|)?IPC_STAT, \\[?%p\\]?\\) += 0\n", 103499c5aad0c2a4204ce28bd7761cabe9ceba57becDmitry V. Levin id, &ds); 10412e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin 105fa5ce3724646faf3d1a1f379e4046e307df92952Andreas Schwab un.__buf = &info; 1063138893026bfdeb4880e2129b1c44258164f382bDmitry V. Levin rc = semctl(0, 0, SEM_INFO, un); 1073138893026bfdeb4880e2129b1c44258164f382bDmitry V. Levin printf("semctl\\(0, 0, (IPC_64\\|)?SEM_INFO, \\[?%p\\]?\\) += %s\n", 1083138893026bfdeb4880e2129b1c44258164f382bDmitry V. Levin &info, sprintrc_grep(rc)); 10912e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin 110fa5ce3724646faf3d1a1f379e4046e307df92952Andreas Schwab un.buf = &ds; 111fa5ce3724646faf3d1a1f379e4046e307df92952Andreas Schwab rc = semctl(id, 0, SEM_STAT, un); 1123138893026bfdeb4880e2129b1c44258164f382bDmitry V. Levin printf("semctl\\(%d, 0, (IPC_64\\|)?SEM_STAT, \\[?%p\\]?\\) += %s\n", 1133138893026bfdeb4880e2129b1c44258164f382bDmitry V. Levin id, &ds, sprintrc_grep(rc)); 11412e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin 115efb134041e946e94a80e3b4bb89de5d03eca4f71Dmitry V. Levin return 0; 11612e24427845a1e97e6ffd65153a3752c6d02de7dDmitry V. Levin} 117