blob: f316d805dfb66411cab2cc707f2f67fe0e7464cc [file] [log] [blame]
Dmitry V. Levin1da7c952014-12-13 18:24:13 +00001#ifdef HAVE_CONFIG_H
2# include "config.h"
3#endif
4#include <assert.h>
Dmitry V. Levin530bed02014-12-14 13:30:54 +00005#include <stdlib.h>
Dmitry V. Levin1da7c952014-12-13 18:24:13 +00006#include <unistd.h>
7#include <sys/syscall.h>
8
9int
10main(void)
11{
Dmitry V. Levin8ef54392015-07-16 09:09:11 +000012#if (defined __NR_getuid || defined __NR_getxuid) \
Dmitry V. Levin1da7c952014-12-13 18:24:13 +000013 && defined(__NR_setuid) \
14 && defined(__NR_getresuid) \
15 && defined(__NR_setreuid) \
16 && defined(__NR_setresuid) \
Dmitry V. Levin68804b32015-03-16 18:10:21 +000017 && defined(__NR_fchown) \
Dmitry V. Levin530bed02014-12-14 13:30:54 +000018 && defined(__NR_getgroups)
Dmitry V. Levin3a15bc82015-03-02 01:13:47 +000019 int uid;
Dmitry V. Levin530bed02014-12-14 13:30:54 +000020 int size;
21 int *list = 0;
Dmitry V. Levin1da7c952014-12-13 18:24:13 +000022
Dmitry V. Levin8ef54392015-07-16 09:09:11 +000023#ifndef __NR_getuid
24# define __NR_getuid __NR_getxuid
25#endif
Dmitry V. Levin3a15bc82015-03-02 01:13:47 +000026 uid = syscall(__NR_getuid);
27 assert(syscall(__NR_setuid, uid) == 0);
28 {
29 /*
30 * uids returned by getresuid should be ignored
31 * to avoid 16bit vs 32bit issues.
32 */
33 int r, e, s;
34 assert(syscall(__NR_getresuid, &r, &e, &s) == 0);
35 }
Dmitry V. Levin1da7c952014-12-13 18:24:13 +000036 assert(syscall(__NR_setreuid, -1, -1L) == 0);
Dmitry V. Levin3a15bc82015-03-02 01:13:47 +000037 assert(syscall(__NR_setresuid, uid, -1, -1L) == 0);
Dmitry V. Levin68804b32015-03-16 18:10:21 +000038 assert(syscall(__NR_fchown, 1, -1, -1L) == 0);
Dmitry V. Levin530bed02014-12-14 13:30:54 +000039 assert((size = syscall(__NR_getgroups, 0, list)) >= 0);
40 assert(list = calloc(size + 1, sizeof(*list)));
41 assert(syscall(__NR_getgroups, size, list) == size);
Dmitry V. Levin1da7c952014-12-13 18:24:13 +000042 return 0;
43#else
44 return 77;
45#endif
46}