diff options
| author | Alan Cox <alan@lxorguk.ukuu.org.uk> | 2003-07-17 19:46:25 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.osdl.org> | 2003-07-17 19:46:25 -0700 |
| commit | 57989ed4a06caa9c988f4da6a12fac4dae745335 (patch) | |
| tree | 12afbbf974dc8ef01973203e52edb716a2c0d284 /kernel/sys.c | |
| parent | da602a16830e2ef4b08200880a56e976d2bc3f5c (diff) | |
[PATCH] fix failed sethostname corrupting the data
(Stephan Maciej)
Diffstat (limited to 'kernel/sys.c')
| -rw-r--r-- | kernel/sys.c | 10 |
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; |
