@ -1176,18 +1176,19 @@ static int override_release(char __user *release, size_t len)
SYSCALL_DEFINE1 ( newuname , struct new_utsname __user * , name )
{
int errno = 0 ;
struct new_utsname tmp ;
down_read ( & uts_sem ) ;
if ( copy_to_user ( name , utsname ( ) , sizeof * name ) )
errno = - EFAULT ;
memcpy ( & tmp , utsname ( ) , sizeof ( tmp ) ) ;
up_read ( & uts_sem ) ;
if ( copy_to_user ( name , & tmp , sizeof ( tmp ) ) )
return - EFAULT ;
if ( ! errno & & override_release ( name - > release , sizeof ( name - > release ) ) )
errno = - EFAULT ;
if ( ! errno & & override_architecture ( name ) )
errno = - EFAULT ;
return errno ;
if ( override_release ( name - > release , sizeof ( name - > release ) ) )
return - EFAULT ;
if ( override_architecture ( name ) )
return - EFAULT ;
return 0 ;
}
# ifdef __ARCH_WANT_SYS_OLD_UNAME
@ -1196,55 +1197,46 @@ SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name)
*/
SYSCALL_DEFINE1 ( uname , struct old_utsname __user * , name )
{
int error = 0 ;
struct old_utsname tmp ;
if ( ! name )
return - EFAULT ;
down_read ( & uts_sem ) ;
if ( copy_to_user ( name , utsname ( ) , sizeof ( * name ) ) )
error = - EFAULT ;
memcpy ( & tmp , utsname ( ) , sizeof ( tmp ) ) ;
up_read ( & uts_sem ) ;
if ( copy_to_user ( name , & tmp , sizeof ( tmp ) ) )
return - EFAULT ;
if ( ! error & & override_release ( name - > release , sizeof ( name - > release ) ) )
error = - EFAULT ;
if ( ! error & & override_architecture ( name ) )
error = - EFAULT ;
return error ;
if ( override_release ( name - > release , sizeof ( name - > release ) ) )
return - EFAULT ;
if ( override_architecture ( name ) )
return - EFAULT ;
return 0 ;
}
SYSCALL_DEFINE1 ( olduname , struct oldold_utsname __user * , name )
{
int error ;
struct oldold_utsname tmp = { } ;
if ( ! name )
return - EFAULT ;
if ( ! access_ok ( VERIFY_WRITE , name , sizeof ( struct oldold_utsname ) ) )
return - EFAULT ;
down_read ( & uts_sem ) ;
error = __copy_to_user ( & name - > sysname , & utsname ( ) - > sysname ,
__OLD_UTS_LEN ) ;
error | = __put_user ( 0 , name - > sysname + __OLD_UTS_LEN ) ;
error | = __copy_to_user ( & name - > nodename , & utsname ( ) - > nodename ,
__OLD_UTS_LEN ) ;
error | = __put_user ( 0 , name - > nodename + __OLD_UTS_LEN ) ;
error | = __copy_to_user ( & name - > release , & utsname ( ) - > release ,
__OLD_UTS_LEN ) ;
error | = __put_user ( 0 , name - > release + __OLD_UTS_LEN ) ;
error | = __copy_to_user ( & name - > version , & utsname ( ) - > version ,
__OLD_UTS_LEN ) ;
error | = __put_user ( 0 , name - > version + __OLD_UTS_LEN ) ;
error | = __copy_to_user ( & name - > machine , & utsname ( ) - > machine ,
__OLD_UTS_LEN ) ;
error | = __put_user ( 0 , name - > machine + __OLD_UTS_LEN ) ;
memcpy ( & tmp . sysname , & utsname ( ) - > sysname , __OLD_UTS_LEN ) ;
memcpy ( & tmp . nodename , & utsname ( ) - > nodename , __OLD_UTS_LEN ) ;
memcpy ( & tmp . release , & utsname ( ) - > release , __OLD_UTS_LEN ) ;
memcpy ( & tmp . version , & utsname ( ) - > version , __OLD_UTS_LEN ) ;
memcpy ( & tmp . machine , & utsname ( ) - > machine , __OLD_UTS_LEN ) ;
up_read ( & uts_sem ) ;
if ( copy_to_user ( name , & tmp , sizeof ( tmp ) ) )
return - EFAULT ;
if ( ! error & & override_architecture ( name ) )
error = - EFAULT ;
if ( ! error & & override_release ( name - > release , sizeof ( name - > release ) ) )
error = - EFAULT ;
return error ? - EFAULT : 0 ;
if ( override_architecture ( name ) )
return - EFAULT ;
if ( override_release ( name - > release , sizeof ( name - > release ) ) )
return - EFAULT ;
return 0 ;
}
# endif
@ -1258,17 +1250,18 @@ SYSCALL_DEFINE2(sethostname, char __user *, name, int, len)
if ( len < 0 | | len > __NEW_UTS_LEN )
return - EINVAL ;
down_write ( & uts_sem ) ;
errno = - EFAULT ;
if ( ! copy_from_user ( tmp , name , len ) ) {
struct new_utsname * u = utsname ( ) ;
struct new_utsname * u ;
down_write ( & uts_sem ) ;
u = utsname ( ) ;
memcpy ( u - > nodename , tmp , len ) ;
memset ( u - > nodename + len , 0 , sizeof ( u - > nodename ) - len ) ;
errno = 0 ;
uts_proc_notify ( UTS_PROC_HOSTNAME ) ;
up_write ( & uts_sem ) ;
}
up_write ( & uts_sem ) ;
return errno ;
}
@ -1276,8 +1269,9 @@ SYSCALL_DEFINE2(sethostname, char __user *, name, int, len)
SYSCALL_DEFINE2 ( gethostname , char __user * , name , int , len )
{
int i , errno ;
int i ;
struct new_utsname * u ;
char tmp [ __NEW_UTS_LEN + 1 ] ;
if ( len < 0 )
return - EINVAL ;
@ -1286,11 +1280,11 @@ SYSCALL_DEFINE2(gethostname, char __user *, name, int, len)
i = 1 + strlen ( u - > nodename ) ;
if ( i > len )
i = len ;
errno = 0 ;
if ( copy_to_user ( name , u - > nodename , i ) )
errno = - EFAULT ;
memcpy ( tmp , u - > nodename , i ) ;
up_read ( & uts_sem ) ;
return errno ;
if ( copy_to_user ( name , tmp , i ) )
return - EFAULT ;
return 0 ;
}
# endif
@ -1309,17 +1303,18 @@ SYSCALL_DEFINE2(setdomainname, char __user *, name, int, len)
if ( len < 0 | | len > __NEW_UTS_LEN )
return - EINVAL ;
down_write ( & uts_sem ) ;
errno = - EFAULT ;
if ( ! copy_from_user ( tmp , name , len ) ) {
struct new_utsname * u = utsname ( ) ;
struct new_utsname * u ;
down_write ( & uts_sem ) ;
u = utsname ( ) ;
memcpy ( u - > domainname , tmp , len ) ;
memset ( u - > domainname + len , 0 , sizeof ( u - > domainname ) - len ) ;
errno = 0 ;
uts_proc_notify ( UTS_PROC_DOMAINNAME ) ;
up_write ( & uts_sem ) ;
}
up_write ( & uts_sem ) ;
return errno ;
}