Thread (6 messages) flat view 6 messages, 2 authors, 2020-09-30

Re: [PATCH] sched_getattr.2: update to include changed size semantics

From: Michael Kerrisk (man-pages) <hidden>
Date: 2020-04-25 19:12:29
Also in: linux-man

Hi Aleksa,

I don't think there was ever a follow-up to this patch. Would you be
willing to send one?

Thanks,

Michael

On Thu, 28 Nov 2019 at 14:55, Aleksa Sarai [off-list ref] wrote:
On 2019-11-28, Thadeu Lima de Souza Cascardo [off-list ref] wrote:
quoted
On Thu, Nov 28, 2019 at 11:01:40PM +1100, Aleksa Sarai wrote:
quoted
Due to a userspace breakage, commit 1251201c0d34 ("sched/core: Fix
uclamp ABI bug, clean up and robustify sched_read_attr() ABI logic and
code") changed the semantics of sched_getattr(2) when the userspace
struct is smaller than the kernel struct. Now, any trailing non-zero
data in the kernel structure is ignored when copying to userspace.

Ref: 1251201c0d34 ("sched/core: Fix uclamp ABI bug, clean up and
                    robustify sched_read_attr() ABI logic and code")
Signed-off-by: Aleksa Sarai <redacted>
---
 man2/sched_setattr.2 | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/man2/sched_setattr.2 b/man2/sched_setattr.2
index 76ffa14eba85..fbb67b8eb98b 100644
--- a/man2/sched_setattr.2
+++ b/man2/sched_setattr.2
@@ -284,10 +284,8 @@ structure,
 the additional bytes in the user-space structure are not touched.
 If the caller-provided structure is smaller than the kernel
 .I sched_attr
-structure and the kernel needs to return values outside the provided space,
-.BR sched_getattr ()
-fails with the error
-.BR E2BIG .
+structure, the kernel will silently not return any values which would be stored
+outside the provided space.
 As with
 .BR sched_setattr (),
 these semantics allow for future extensibility of the interface.
--
2.24.0
I was thinking about documenting the difference in behavior of older kernels,
before uclamp support.

However, in practice, for sched_getattr, the kernel never returned E2BIG (the
code uses EFBIG incorrectly, in fact). It does, however, return EINVAL for
sizes smaller than SCHED_ATTR_SIZE_VER0.
I've been told the EFBIG was actually a typo and it was always meant to
be E2BIG. But yes, the precise problem with the old semantics was that
they weren't tested "in the wild" with a proper struct upgrade -- hence
all of the headaches.

If we ever do implement a copy_struct_to_user() we are almost certainly
going to implement it with the new sched_getattr() semantics. To be
honest, I'm not sure I can imagine a case where an old userspace program
would benefit from being given an error saying that the kernel has some
properties that it doesn't understand. (sched_getattr() is also weird
for other reasons, such as the fact it takes a separate size argument.)
quoted
However, E2BIG is still mentioned below as a possible return value for
sched_getattr. Can you remove that too?
Will do.

--
Aleksa Sarai
Senior Software Engineer (Containers)
SUSE Linux GmbH
<https://www.cyphar.com/>


-- 
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help