2014-12-13 18:24:13 +00:00
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include <assert.h>
2014-12-14 13:30:54 +00:00
# include <stdlib.h>
2014-12-13 18:24:13 +00:00
# include <unistd.h>
2015-07-22 19:31:54 +00:00
# include <fcntl.h>
2014-12-13 18:24:13 +00:00
# include <sys/syscall.h>
int
main ( void )
{
2015-07-16 09:09:11 +00:00
# if (defined __NR_getuid || defined __NR_getxuid) \
2014-12-13 18:24:13 +00:00
& & defined ( __NR_setuid ) \
& & defined ( __NR_getresuid ) \
& & defined ( __NR_setreuid ) \
& & defined ( __NR_setresuid ) \
2015-03-16 18:10:21 +00:00
& & defined ( __NR_fchown ) \
2014-12-14 13:30:54 +00:00
& & defined ( __NR_getgroups )
2015-03-02 01:13:47 +00:00
int uid ;
2014-12-14 13:30:54 +00:00
int size ;
int * list = 0 ;
2014-12-13 18:24:13 +00:00
2015-07-16 09:09:11 +00:00
# ifndef __NR_getuid
# define __NR_getuid __NR_getxuid
# endif
2015-03-02 01:13:47 +00:00
uid = syscall ( __NR_getuid ) ;
2015-07-22 19:31:54 +00:00
( void ) close ( 0 ) ;
if ( open ( " /proc/sys/kernel/overflowuid " , O_RDONLY ) = = 0 ) {
/* we trust the kernel */
char buf [ sizeof ( int ) * 3 ] ;
int n = read ( 0 , buf , sizeof ( buf ) - 1 ) ;
if ( n ) {
buf [ n ] = ' \0 ' ;
n = atoi ( buf ) ;
if ( uid = = n )
return 77 ;
}
( void ) close ( 0 ) ;
}
2015-03-02 01:13:47 +00:00
assert ( syscall ( __NR_setuid , uid ) = = 0 ) ;
{
/*
* uids returned by getresuid should be ignored
* to avoid 16 bit vs 32 bit issues .
*/
int r , e , s ;
assert ( syscall ( __NR_getresuid , & r , & e , & s ) = = 0 ) ;
}
2014-12-13 18:24:13 +00:00
assert ( syscall ( __NR_setreuid , - 1 , - 1L ) = = 0 ) ;
2015-03-02 01:13:47 +00:00
assert ( syscall ( __NR_setresuid , uid , - 1 , - 1L ) = = 0 ) ;
2015-03-16 18:10:21 +00:00
assert ( syscall ( __NR_fchown , 1 , - 1 , - 1L ) = = 0 ) ;
2014-12-14 13:30:54 +00:00
assert ( ( size = syscall ( __NR_getgroups , 0 , list ) ) > = 0 ) ;
assert ( list = calloc ( size + 1 , sizeof ( * list ) ) ) ;
assert ( syscall ( __NR_getgroups , size , list ) = = size ) ;
2014-12-13 18:24:13 +00:00
return 0 ;
# else
return 77 ;
# endif
}