2016-04-14 01:38:17 +03:00
/*
* Copyright ( c ) 2014 - 2016 Dmitry V . Levin < ldv @ altlinux . org >
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ` ` AS IS ' ' AND ANY EXPRESS OR
* IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED .
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
# include "tests.h"
# include <errno.h>
# include <fcntl.h>
# include <stdlib.h>
# include <unistd.h>
2016-07-04 01:15:38 +03:00
int
read_int_from_file ( const char * const fname , int * const pvalue )
{
const int fd = open ( fname , O_RDONLY ) ;
if ( fd < 0 )
return - 1 ;
long lval ;
char buf [ sizeof ( lval ) * 3 ] ;
int n = read ( fd , buf , sizeof ( buf ) - 1 ) ;
int saved_errno = errno ;
close ( fd ) ;
if ( n < 0 ) {
errno = saved_errno ;
return - 1 ;
}
buf [ n ] = ' \0 ' ;
char * endptr = 0 ;
errno = 0 ;
lval = strtol ( buf , & endptr , 10 ) ;
if ( ! endptr | | ( * endptr & & ' \n ' ! = * endptr )
# if INT_MAX < LONG_MAX
| | lval > INT_MAX | | lval < INT_MIN
# endif
| | ERANGE = = errno ) {
if ( ! errno )
errno = EINVAL ;
return - 1 ;
}
* pvalue = ( int ) lval ;
return 0 ;
}
2016-04-14 01:38:17 +03:00
static void
check_overflow_id ( const int id , const char * overflowid )
{
2016-07-04 01:15:38 +03:00
int n ;
if ( read_int_from_file ( overflowid , & n ) ) {
2016-04-14 01:38:17 +03:00
if ( ENOENT = = errno )
return ;
2016-07-04 01:15:38 +03:00
perror_msg_and_fail ( " read_int_from_file: %s " , overflowid ) ;
2016-04-14 01:38:17 +03:00
}
2016-07-04 01:15:38 +03:00
if ( id = = n )
error_msg_and_skip ( " %d matches %s " , id , overflowid ) ;
2016-04-14 01:38:17 +03:00
}
void
check_overflowuid ( const int uid )
{
check_overflow_id ( uid , " /proc/sys/kernel/overflowuid " ) ;
}
void
check_overflowgid ( const int gid )
{
check_overflow_id ( gid , " /proc/sys/kernel/overflowgid " ) ;
}