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