Home | History | Annotate | Download | only in utils
      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 (at) 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 setresgid(gid_t rgid, gid_t egid, gid_t sgid);
     39 
     40 
     41 /* If the platform has __NR_sys_name32 defined it
     42  * means that __NR_sys_name is a 16-bit version of
     43  * sys_name() syscall
     44  */
     45 #ifdef TST_USE_COMPAT16_SYSCALL
     46 # define LTP_CREATE_SYSCALL(sys_name, cleanup, ...) \
     47 	if (__NR_##sys_name##32 != __LTP__NR_INVALID_SYSCALL) { \
     48 		return ltp_syscall(__NR_##sys_name, ##__VA_ARGS__); \
     49 	} else { \
     50 		tst_brkm(TCONF, cleanup, \
     51 			"16-bit version of %s() is not supported on your " \
     52 			"platform", #sys_name); \
     53 	}
     54 #else
     55 # define LTP_CREATE_SYSCALL(sys_name, cleanup, ...) \
     56 	(void) cleanup;                             \
     57 	return sys_name(__VA_ARGS__)
     58 #endif
     59 
     60 #define UID16_CHECK(uid, sys_name, cleanup) \
     61 if (!UID_SIZE_CHECK(uid)) { \
     62 	tst_brkm(TBROK, cleanup, \
     63 		"uid %d of %s is too large for testing 16-bit version " \
     64 		"of %s()", uid, #uid, #sys_name); \
     65 }
     66 
     67 #define GID16_CHECK(gid, sys_name, cleanup) \
     68 if (!GID_SIZE_CHECK(gid)) { \
     69 	tst_brkm(TBROK, cleanup, \
     70 		"gid %d of %s is too large for testing 16-bit version " \
     71 		"of %s()", gid, #gid, #sys_name); \
     72 }
     73 
     74 
     75 int SETGROUPS(void (cleanup)(void), size_t gidsetsize, GID_T *list)
     76 {
     77 	LTP_CREATE_SYSCALL(setgroups, cleanup, gidsetsize, list);
     78 }
     79 
     80 int GETGROUPS(void (cleanup)(void), size_t gidsetsize, GID_T *list)
     81 {
     82 	LTP_CREATE_SYSCALL(getgroups, cleanup, gidsetsize, list);
     83 }
     84 
     85 int SETUID(void (cleanup)(void), UID_T uid)
     86 {
     87 	LTP_CREATE_SYSCALL(setuid, cleanup, uid);
     88 }
     89 
     90 UID_T GETUID(void (cleanup)(void))
     91 {
     92 	LTP_CREATE_SYSCALL(getuid, cleanup);
     93 }
     94 
     95 int SETGID(void (cleanup)(void), GID_T gid)
     96 {
     97 	LTP_CREATE_SYSCALL(setgid, cleanup, gid);
     98 }
     99 
    100 GID_T GETGID(void (cleanup)(void))
    101 {
    102 	LTP_CREATE_SYSCALL(getgid, cleanup);
    103 }
    104 
    105 UID_T GETEUID(void (cleanup)(void))
    106 {
    107 	LTP_CREATE_SYSCALL(geteuid, cleanup);
    108 }
    109 
    110 GID_T GETEGID(void (cleanup)(void))
    111 {
    112 	LTP_CREATE_SYSCALL(getegid, cleanup);
    113 }
    114 
    115 int SETFSUID(void (cleanup)(void), UID_T uid)
    116 {
    117 	LTP_CREATE_SYSCALL(setfsuid, cleanup, uid);
    118 }
    119 
    120 int SETFSGID(void (cleanup)(void), GID_T gid)
    121 {
    122 	LTP_CREATE_SYSCALL(setfsgid, cleanup, gid);
    123 }
    124 
    125 int SETREUID(void (cleanup)(void), UID_T ruid, UID_T euid)
    126 {
    127 	LTP_CREATE_SYSCALL(setreuid, cleanup, ruid, euid);
    128 }
    129 int SETREGID(void (cleanup)(void), GID_T rgid, GID_T egid)
    130 {
    131 	LTP_CREATE_SYSCALL(setregid, cleanup, rgid, egid);
    132 }
    133 
    134 int SETRESUID(void (cleanup)(void), UID_T ruid, UID_T euid, UID_T suid)
    135 {
    136 	LTP_CREATE_SYSCALL(setresuid, cleanup, ruid, euid, suid);
    137 }
    138 
    139 int SETRESGID(void (cleanup)(void), GID_T rgid, GID_T egid, GID_T sgid)
    140 {
    141 	LTP_CREATE_SYSCALL(setresgid, cleanup, rgid, egid, sgid);
    142 }
    143 
    144 int FCHOWN(void (cleanup)(void), unsigned int fd, UID_T owner, GID_T group)
    145 {
    146 	LTP_CREATE_SYSCALL(fchown, cleanup, fd, owner, group);
    147 }
    148 
    149 int LCHOWN(void (cleanup)(void), const char *path, UID_T owner, GID_T group)
    150 {
    151 	LTP_CREATE_SYSCALL(lchown, cleanup, path, owner, group);
    152 }
    153 
    154 int CHOWN(void (cleanup)(void), const char *path, UID_T owner, GID_T group)
    155 {
    156 	LTP_CREATE_SYSCALL(chown, cleanup, path, owner, group);
    157 }
    158 #endif /* __LTP_COMPAT_16_H__ */
    159