Re: [PATCH v4] linux: Add openat2 (BZ 31664)
From: Arjun Shankar <hidden>
Date: 2025-09-03 12:10:00
Hello!
quoted
Earlier on in this thread, Aleksa mentioned sched_setattr as establishing precedent for the kernel modifying non-const objects. It looks like glibc actually does provide a sched_setattr wrapper since 2.41. The relevant argument hasn't been marked as const and the kernel does modify the contents, and glibc's syscall wrapper simply passes it through. So we already do this.given that SYSCALL_DEFINE3(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr, unsigned int, flags) calls sched_setattr(), which is defined thus: int sched_setattr(struct task_struct *p, const struct sched_attr *attr) { return __sched_setscheduler(p, attr, true, true); } i think that's just a copy & paste mistake in the kernel -- carefully preserved in glibc and bionic -- no? (i only see the kernel updating its own _copy_ of the passed-in struct.)
Based on my understanding, it all happens before the call to the const
marked sched_setattr. Starting from line 986 (as of today) on the same
syscalls.c file [1]:
retval = sched_copy_attr(uattr, &attr);
if (retval)
return retval;
Which inside sched_copy_attr does:
ret = copy_struct_from_user(attr, sizeof(*attr), uattr, size);
if (ret) {
if (ret == -E2BIG)
goto err_size;
And that leads to:
err_size:
put_user(sizeof(*attr), &uattr->size);
return -E2BIG;
Which writes to userspace.
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/kernel/sched/syscalls.c?id=e6b9dce0aeeb91dfc0974ab87f02454e24566182#n986
--
Arjun Shankar
he/him/his