summaryrefslogtreecommitdiff
path: root/kernel/sys.c
diff options
context:
space:
mode:
authorAlan Cox <alan@lxorguk.ukuu.org.uk>2003-07-17 19:46:25 -0700
committerLinus Torvalds <torvalds@home.osdl.org>2003-07-17 19:46:25 -0700
commit57989ed4a06caa9c988f4da6a12fac4dae745335 (patch)
tree12afbbf974dc8ef01973203e52edb716a2c0d284 /kernel/sys.c
parentda602a16830e2ef4b08200880a56e976d2bc3f5c (diff)
[PATCH] fix failed sethostname corrupting the data
(Stephan Maciej)
Diffstat (limited to 'kernel/sys.c')
-rw-r--r--kernel/sys.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/kernel/sys.c b/kernel/sys.c
index 4c3f48c93148..ccdd74fdb24a 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -1159,6 +1159,7 @@ asmlinkage long sys_newuname(struct new_utsname __user * name)
asmlinkage long sys_sethostname(char __user *name, int len)
{
int errno;
+ char tmp[__NEW_UTS_LEN];
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
@@ -1166,7 +1167,8 @@ asmlinkage long sys_sethostname(char __user *name, int len)
return -EINVAL;
down_write(&uts_sem);
errno = -EFAULT;
- if (!copy_from_user(system_utsname.nodename, name, len)) {
+ if (!copy_from_user(tmp, name, len)) {
+ memcpy(system_utsname.nodename, tmp, len);
system_utsname.nodename[len] = 0;
errno = 0;
}
@@ -1198,6 +1200,7 @@ asmlinkage long sys_gethostname(char __user *name, int len)
asmlinkage long sys_setdomainname(char __user *name, int len)
{
int errno;
+ char tmp[__NEW_UTS_LEN];
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
@@ -1206,9 +1209,10 @@ asmlinkage long sys_setdomainname(char __user *name, int len)
down_write(&uts_sem);
errno = -EFAULT;
- if (!copy_from_user(system_utsname.domainname, name, len)) {
- errno = 0;
+ if (!copy_from_user(tmp, name, len)) {
+ memcpy(system_utsname.domainname, tmp, len);
system_utsname.domainname[len] = 0;
+ errno = 0;
}
up_write(&uts_sem);
return errno;