X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=kernel%2Fsys.c;h=8d58d872e0b882db71aa90a0f4dee4d4391d9835;hb=56cc217a918ed2dcf1556f6a5e6a0bf46f597c3e;hp=e7006eb6c1e4fdc3fa7967eaa45541609b5d499f;hpb=a7ca08038b990e2cbed324948664b2d8940fd782;p=cascardo%2Flinux.git diff --git a/kernel/sys.c b/kernel/sys.c index e7006eb6c1e4..8d58d872e0b8 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1179,13 +1179,13 @@ DECLARE_RWSEM(uts_sem); * Work around broken programs that cannot handle "Linux 3.0". * Instead we map 3.x to 2.6.40+x, so e.g. 3.0 would be 2.6.40 */ -static int override_release(char __user *release, int len) +static int override_release(char __user *release, size_t len) { int ret = 0; - char buf[65]; + char buf[65] = { 0 }; + const char *rest = UTS_RELEASE; if (current->personality & UNAME26) { - char *rest = UTS_RELEASE; int ndots = 0; unsigned v; @@ -1197,7 +1197,9 @@ static int override_release(char __user *release, int len) rest++; } v = ((LINUX_VERSION_CODE >> 8) & 0xff) + 40; - snprintf(buf, len, "2.6.%u%s", v, rest); + snprintf(buf, sizeof(buf), "2.6.%u%s", v, rest); + if (sizeof(buf) < len) + len = sizeof(buf); ret = copy_to_user(release, buf, len); } return ret; @@ -1908,7 +1910,7 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, error = prctl_get_seccomp(); break; case PR_SET_SECCOMP: - error = prctl_set_seccomp(arg2); + error = prctl_set_seccomp(arg2, (char __user *)arg3); break; case PR_GET_TSC: error = GET_TSC_CTL(arg2); @@ -1979,6 +1981,16 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, error = put_user(me->signal->is_child_subreaper, (int __user *) arg2); break; + case PR_SET_NO_NEW_PRIVS: + if (arg2 != 1 || arg3 || arg4 || arg5) + return -EINVAL; + + current->no_new_privs = 1; + break; + case PR_GET_NO_NEW_PRIVS: + if (arg2 || arg3 || arg4 || arg5) + return -EINVAL; + return current->no_new_privs ? 1 : 0; default: error = -EINVAL; break;