1ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh/* 2ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * Copyright (c) Red Hat Inc., 2008 3ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. 4ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * 5ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * This program is free software; you can redistribute it and/or modify 6ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * it under the terms of the GNU General Public License as published by 7ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * the Free Software Foundation; either version 2 of the License, or 8ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * (at your option) any later version. 9ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * 10ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * This program is distributed in the hope that it will be useful, 11ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * but WITHOUT ANY WARRANTY; without even the implied warranty of 12ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * the GNU General Public License for more details. 14ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * 15ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * You should have received a copy of the GNU General Public License 16ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * along with this program; if not, write to the Free Software 17ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh */ 19ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh 20ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh/* Author: Masatake YAMATO <yamato@redhat.com> */ 21ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh 22ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#ifndef __LTP_COMPAT_16_H__ 23ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#define __LTP_COMPAT_16_H__ 24ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh 25ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#include <errno.h> 261c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh#include <grp.h> 27df61090ed94fd47e8a1b1e1c0cdd0de2708c9842Steven Jackson#if defined(__GLIBC__) || defined(__ANDROID__) 280e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh#include <sys/fsuid.h> 290e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh#endif 301c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh#include <sys/types.h> 311c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh#include <unistd.h> 321c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh 33ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#include "compat_gid.h" 341c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh#include "compat_uid.h" 35ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#include "linux_syscall_numbers.h" 36ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh 370a45153c159d7182a681db67a04cb948748611e1Stanislav Kholmanskikhint setresuid(uid_t ruid, uid_t euid, uid_t suid); 380a45153c159d7182a681db67a04cb948748611e1Stanislav Kholmanskikhint setresgid(gid_t rgid, gid_t egid, gid_t sgid); 390a45153c159d7182a681db67a04cb948748611e1Stanislav Kholmanskikh 400a45153c159d7182a681db67a04cb948748611e1Stanislav Kholmanskikh 41ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh/* If the platform has __NR_sys_name32 defined it 42ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * means that __NR_sys_name is a 16-bit version of 43ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh * sys_name() syscall 44ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh */ 45ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#ifdef TST_USE_COMPAT16_SYSCALL 46ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh# define LTP_CREATE_SYSCALL(sys_name, cleanup, ...) \ 47ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh if (__NR_##sys_name##32 != __LTP__NR_INVALID_SYSCALL) { \ 48ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh return ltp_syscall(__NR_##sys_name, ##__VA_ARGS__); \ 49ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh } else { \ 50ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh tst_brkm(TCONF, cleanup, \ 51ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh "16-bit version of %s() is not supported on your " \ 52ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh "platform", #sys_name); \ 53ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh } 54ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#else 55ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh# define LTP_CREATE_SYSCALL(sys_name, cleanup, ...) \ 569592ed451d67ec4d70fc9892db5c3dcb1b2d60beCyril Hrubis (void) cleanup; \ 57ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh return sys_name(__VA_ARGS__) 58ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#endif 59ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh 601c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh#define UID16_CHECK(uid, sys_name, cleanup) \ 611c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikhif (!UID_SIZE_CHECK(uid)) { \ 621c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh tst_brkm(TBROK, cleanup, \ 631c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh "uid %d of %s is too large for testing 16-bit version " \ 641c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh "of %s()", uid, #uid, #sys_name); \ 651c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh} 661c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh 671c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh#define GID16_CHECK(gid, sys_name, cleanup) \ 681c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikhif (!GID_SIZE_CHECK(gid)) { \ 691c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh tst_brkm(TBROK, cleanup, \ 701c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh "gid %d of %s is too large for testing 16-bit version " \ 711c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh "of %s()", gid, #gid, #sys_name); \ 721c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh} 731c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh 741c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh 75ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikhint SETGROUPS(void (cleanup)(void), size_t gidsetsize, GID_T *list) 76ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh{ 77ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh LTP_CREATE_SYSCALL(setgroups, cleanup, gidsetsize, list); 78ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh} 79ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh 80ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikhint GETGROUPS(void (cleanup)(void), size_t gidsetsize, GID_T *list) 81ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh{ 82ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh LTP_CREATE_SYSCALL(getgroups, cleanup, gidsetsize, list); 83ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh} 84ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh 851c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikhint SETUID(void (cleanup)(void), UID_T uid) 861c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh{ 871c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh LTP_CREATE_SYSCALL(setuid, cleanup, uid); 881c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh} 891c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh 901c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav KholmanskikhUID_T GETUID(void (cleanup)(void)) 911c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh{ 921c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh LTP_CREATE_SYSCALL(getuid, cleanup); 931c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh} 941c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh 951c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikhint SETGID(void (cleanup)(void), GID_T gid) 961c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh{ 971c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh LTP_CREATE_SYSCALL(setgid, cleanup, gid); 981c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh} 991c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh 1001c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav KholmanskikhGID_T GETGID(void (cleanup)(void)) 1011c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh{ 1021c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh LTP_CREATE_SYSCALL(getgid, cleanup); 1031c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh} 1044940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh 1054940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav KholmanskikhUID_T GETEUID(void (cleanup)(void)) 1064940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh{ 1074940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh LTP_CREATE_SYSCALL(geteuid, cleanup); 1084940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh} 1094940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh 1104940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav KholmanskikhGID_T GETEGID(void (cleanup)(void)) 1114940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh{ 1124940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh LTP_CREATE_SYSCALL(getegid, cleanup); 1134940d00b75ec0f7a375dce5542afd56cfc0267f0Stanislav Kholmanskikh} 1140e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh 1150e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhint SETFSUID(void (cleanup)(void), UID_T uid) 1160e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh{ 1170e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh LTP_CREATE_SYSCALL(setfsuid, cleanup, uid); 1180e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh} 1190e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh 1200e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhint SETFSGID(void (cleanup)(void), GID_T gid) 1210e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh{ 1220e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh LTP_CREATE_SYSCALL(setfsgid, cleanup, gid); 1230e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh} 124e0f8585542dc0cab1a31c8d6a3e0c92b5206bef4Stanislav Kholmanskikh 125e0f8585542dc0cab1a31c8d6a3e0c92b5206bef4Stanislav Kholmanskikhint SETREUID(void (cleanup)(void), UID_T ruid, UID_T euid) 126e0f8585542dc0cab1a31c8d6a3e0c92b5206bef4Stanislav Kholmanskikh{ 127e0f8585542dc0cab1a31c8d6a3e0c92b5206bef4Stanislav Kholmanskikh LTP_CREATE_SYSCALL(setreuid, cleanup, ruid, euid); 128e0f8585542dc0cab1a31c8d6a3e0c92b5206bef4Stanislav Kholmanskikh} 129de8b8db9324b78e62f79b4c7eca7dc1ed570425cStanislav Kholmanskikhint SETREGID(void (cleanup)(void), GID_T rgid, GID_T egid) 130de8b8db9324b78e62f79b4c7eca7dc1ed570425cStanislav Kholmanskikh{ 131de8b8db9324b78e62f79b4c7eca7dc1ed570425cStanislav Kholmanskikh LTP_CREATE_SYSCALL(setregid, cleanup, rgid, egid); 132de8b8db9324b78e62f79b4c7eca7dc1ed570425cStanislav Kholmanskikh} 133a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh 13475fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtianint SETRESUID(void (cleanup)(void), UID_T ruid, UID_T euid, UID_T suid) 13575fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian{ 13675fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian LTP_CREATE_SYSCALL(setresuid, cleanup, ruid, euid, suid); 13775fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian} 13875fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian 13975fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtianint SETRESGID(void (cleanup)(void), GID_T rgid, GID_T egid, GID_T sgid) 14075fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian{ 14175fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian LTP_CREATE_SYSCALL(setresgid, cleanup, rgid, egid, sgid); 14275fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian} 14375fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian 14475fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtianint FCHOWN(void (cleanup)(void), unsigned int fd, UID_T owner, GID_T group) 14575fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian{ 14675fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian LTP_CREATE_SYSCALL(fchown, cleanup, fd, owner, group); 14775fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian} 14875fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian 149a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikhint LCHOWN(void (cleanup)(void), const char *path, UID_T owner, GID_T group) 150a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh{ 151a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh LTP_CREATE_SYSCALL(lchown, cleanup, path, owner, group); 152a801ded4e27a92d96d75c2ea79a3b82c06e923c3Stanislav Kholmanskikh} 15375fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian 15475fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtianint CHOWN(void (cleanup)(void), const char *path, UID_T owner, GID_T group) 15575fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian{ 15675fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian LTP_CREATE_SYSCALL(chown, cleanup, path, owner, group); 15775fb057ebd66c8d8012ec5a53f1a187551296b00Han Pingtian} 158ce0dffef2ec0eecc73722d97feb2f81feea093f3Stanislav Kholmanskikh#endif /* __LTP_COMPAT_16_H__ */ 159