1 /*
2 * Copyright (c) Red Hat Inc., 2008
3 * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
13 * the GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20 /* Author: Masatake YAMATO <yamato@redhat.com> */
21
22 #ifndef __LTP_COMPAT_16_H__
23 #define __LTP_COMPAT_16_H__
24
25 #include <errno.h>
26 #include <grp.h>
27 #if defined(__GLIBC__) || defined(__ANDROID__)
28 #include <sys/fsuid.h>
29 #endif
30 #include <sys/types.h>
31 #include <unistd.h>
32
33 #include "compat_gid.h"
34 #include "compat_uid.h"
35 #include "lapi/syscalls.h"
36
37 int setresuid(uid_t ruid, uid_t euid, uid_t suid);
38 int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);
39 int setresgid(gid_t rgid, gid_t egid, gid_t sgid);
40 int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid);
41
42
43 /* If the platform has __NR_sys_name32 defined it
44 * means that __NR_sys_name is a 16-bit version of
45 * sys_name() syscall
46 */
47 #ifdef TST_USE_COMPAT16_SYSCALL
48 # define LTP_CREATE_SYSCALL(sys_name, cleanup, ...) \
49 if (__NR_##sys_name##32 != __LTP__NR_INVALID_SYSCALL) { \
50 return ltp_syscall(__NR_##sys_name, ##__VA_ARGS__); \
51 } else { \
52 tst_brkm(TCONF, cleanup, \
53 "16-bit version of %s() is not supported on your " \
54 "platform", #sys_name); \
55 }
56 #else
57 # define LTP_CREATE_SYSCALL(sys_name, cleanup, ...) \
58 (void) cleanup; \
59 return sys_name(__VA_ARGS__)
60 #endif
61
62 #define UID16_CHECK(uid, sys_name, cleanup) \
63 if (!UID_SIZE_CHECK(uid)) { \
64 tst_brkm(TBROK, cleanup, \
65 "uid %d of %s is too large for testing 16-bit version " \
66 "of %s()", uid, #uid, #sys_name); \
67 }
68
69 #define GID16_CHECK(gid, sys_name, cleanup) \
70 if (!GID_SIZE_CHECK(gid)) { \
71 tst_brkm(TBROK, cleanup, \
72 "gid %d of %s is too large for testing 16-bit version " \
73 "of %s()", gid, #gid, #sys_name); \
74 }
75
76
SETGROUPS(void (cleanup)(void),size_t gidsetsize,GID_T * list)77 int SETGROUPS(void (cleanup)(void), size_t gidsetsize, GID_T *list)
78 {
79 LTP_CREATE_SYSCALL(setgroups, cleanup, gidsetsize, list);
80 }
81
GETGROUPS(void (cleanup)(void),size_t gidsetsize,GID_T * list)82 int GETGROUPS(void (cleanup)(void), size_t gidsetsize, GID_T *list)
83 {
84 LTP_CREATE_SYSCALL(getgroups, cleanup, gidsetsize, list);
85 }
86
SETUID(void (cleanup)(void),UID_T uid)87 int SETUID(void (cleanup)(void), UID_T uid)
88 {
89 LTP_CREATE_SYSCALL(setuid, cleanup, uid);
90 }
91
GETUID(void (cleanup)(void))92 UID_T GETUID(void (cleanup)(void))
93 {
94 LTP_CREATE_SYSCALL(getuid, cleanup);
95 }
96
SETGID(void (cleanup)(void),GID_T gid)97 int SETGID(void (cleanup)(void), GID_T gid)
98 {
99 LTP_CREATE_SYSCALL(setgid, cleanup, gid);
100 }
101
GETGID(void (cleanup)(void))102 GID_T GETGID(void (cleanup)(void))
103 {
104 LTP_CREATE_SYSCALL(getgid, cleanup);
105 }
106
GETEUID(void (cleanup)(void))107 UID_T GETEUID(void (cleanup)(void))
108 {
109 LTP_CREATE_SYSCALL(geteuid, cleanup);
110 }
111
GETEGID(void (cleanup)(void))112 GID_T GETEGID(void (cleanup)(void))
113 {
114 LTP_CREATE_SYSCALL(getegid, cleanup);
115 }
116
SETFSUID(void (cleanup)(void),UID_T uid)117 int SETFSUID(void (cleanup)(void), UID_T uid)
118 {
119 LTP_CREATE_SYSCALL(setfsuid, cleanup, uid);
120 }
121
SETFSGID(void (cleanup)(void),GID_T gid)122 int SETFSGID(void (cleanup)(void), GID_T gid)
123 {
124 LTP_CREATE_SYSCALL(setfsgid, cleanup, gid);
125 }
126
SETREUID(void (cleanup)(void),UID_T ruid,UID_T euid)127 int SETREUID(void (cleanup)(void), UID_T ruid, UID_T euid)
128 {
129 LTP_CREATE_SYSCALL(setreuid, cleanup, ruid, euid);
130 }
SETREGID(void (cleanup)(void),GID_T rgid,GID_T egid)131 int SETREGID(void (cleanup)(void), GID_T rgid, GID_T egid)
132 {
133 LTP_CREATE_SYSCALL(setregid, cleanup, rgid, egid);
134 }
135
SETRESUID(void (cleanup)(void),UID_T ruid,UID_T euid,UID_T suid)136 int SETRESUID(void (cleanup)(void), UID_T ruid, UID_T euid, UID_T suid)
137 {
138 LTP_CREATE_SYSCALL(setresuid, cleanup, ruid, euid, suid);
139 }
140
GETRESUID(void (cleanup)(void),UID_T * ruid,UID_T * euid,UID_T * suid)141 int GETRESUID(void (cleanup)(void), UID_T *ruid, UID_T *euid, UID_T *suid)
142 {
143 LTP_CREATE_SYSCALL(getresuid, cleanup, ruid, euid, suid);
144 }
145
SETRESGID(void (cleanup)(void),GID_T rgid,GID_T egid,GID_T sgid)146 int SETRESGID(void (cleanup)(void), GID_T rgid, GID_T egid, GID_T sgid)
147 {
148 LTP_CREATE_SYSCALL(setresgid, cleanup, rgid, egid, sgid);
149 }
150
GETRESGID(void (cleanup)(void),GID_T * rgid,GID_T * egid,GID_T * sgid)151 int GETRESGID(void (cleanup)(void), GID_T *rgid, GID_T *egid, GID_T *sgid)
152 {
153 LTP_CREATE_SYSCALL(getresgid, cleanup, rgid, egid, sgid);
154 }
155
FCHOWN(void (cleanup)(void),unsigned int fd,UID_T owner,GID_T group)156 int FCHOWN(void (cleanup)(void), unsigned int fd, UID_T owner, GID_T group)
157 {
158 LTP_CREATE_SYSCALL(fchown, cleanup, fd, owner, group);
159 }
160
LCHOWN(void (cleanup)(void),const char * path,UID_T owner,GID_T group)161 int LCHOWN(void (cleanup)(void), const char *path, UID_T owner, GID_T group)
162 {
163 LTP_CREATE_SYSCALL(lchown, cleanup, path, owner, group);
164 }
165
CHOWN(void (cleanup)(void),const char * path,UID_T owner,GID_T group)166 int CHOWN(void (cleanup)(void), const char *path, UID_T owner, GID_T group)
167 {
168 LTP_CREATE_SYSCALL(chown, cleanup, path, owner, group);
169 }
170 #endif /* __LTP_COMPAT_16_H__ */
171