aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sys.c
diff options
context:
space:
mode:
authorVegard Nossum <vegard.nossum@gmail.com>2008-10-16 01:01:51 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-10-16 14:21:31 -0400
commit87988815073918134c0dae059cf247a4472d78ed (patch)
treedbab51efdb95de92bbfb585dd1a90c49061e7cdf /kernel/sys.c
parent929f37cb3c3e0f4d23d7106693b7067cf72f4dbc (diff)
utsname: completely overwrite prior information
On sethostname() and setdomainname(), previous information may be retained if it was longer than than the new hostname/domainname. This can be demonstrated trivially by calling sethostname() first with a long name, then with a short name, and then calling uname() to retrieve the full buffer that contains the hostname (and possibly parts of the old hostname), one just has to look past the terminating zero. I don't know if we should really care that much (hence the RFC); the only scenarios I can possibly think of is administrator putting something sensitive in the hostname (or domain name) by accident, and changing it back will not undo the mistake entirely, though it's not like we can recover gracefully from "rm -rf /" either... The other scenario is namespaces (CLONE_NEWUTS) where some information may be unintentionally "inherited" from the previous namespace (a program wants to hide the original name and does clone + sethostname, but some information is still left). I think the patch may be defended on grounds of the principle of least surprise. But I am not adamant :-) (I guess the question now is whether userspace should be able to write embedded NULs into the buffer or not...) At least the observation has been made and the patch has been presented. Signed-off-by: Vegard Nossum <vegard.nossum@gmail.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: "Serge E. Hallyn" <serue@us.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/sys.c')
-rw-r--r--kernel/sys.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/kernel/sys.c b/kernel/sys.c
index d5b79f65ad9b..558b035965aa 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -1350,7 +1350,8 @@ asmlinkage long sys_sethostname(char __user *name, int len)
1350 errno = -EFAULT; 1350 errno = -EFAULT;
1351 if (!copy_from_user(tmp, name, len)) { 1351 if (!copy_from_user(tmp, name, len)) {
1352 memcpy(utsname()->nodename, tmp, len); 1352 memcpy(utsname()->nodename, tmp, len);
1353 utsname()->nodename[len] = 0; 1353 memset(utsname()->nodename + len, 0,
1354 sizeof(utsname()->nodename) - len);
1354 errno = 0; 1355 errno = 0;
1355 } 1356 }
1356 up_write(&uts_sem); 1357 up_write(&uts_sem);
@@ -1396,7 +1397,8 @@ asmlinkage long sys_setdomainname(char __user *name, int len)
1396 errno = -EFAULT; 1397 errno = -EFAULT;
1397 if (!copy_from_user(tmp, name, len)) { 1398 if (!copy_from_user(tmp, name, len)) {
1398 memcpy(utsname()->domainname, tmp, len); 1399 memcpy(utsname()->domainname, tmp, len);
1399 utsname()->domainname[len] = 0; 1400 memset(utsname()->domainname + len, 0,
1401 sizeof(utsname()->domainname) - len);
1400 errno = 0; 1402 errno = 0;
1401 } 1403 }
1402 up_write(&uts_sem); 1404 up_write(&uts_sem);