On 2/28/23 16:52, Oleg Nesterov wrote: > On 02/27, Dmitry Safonov wrote: >> >>> +int syscall_user_dispatch_set_config(struct task_struct *task, unsigned long size, >>> + void __user *data) >>> +{ >>> + int rc; >>> + struct ptrace_sud_config cfg; >>> + >>> + if (size != sizeof(struct ptrace_sud_config)) >>> + return -EINVAL; >>> + >>> + if (copy_from_user(&cfg, data, sizeof(struct ptrace_sud_config))) >>> + return -EFAULT; >> >> It seems that the tool you want here would be copy_struct_from_user(), >> which is designed for extendable syscalls. > > Hmm. Why? > > In this case ksize == usize, so why do we need copy_struct_from_user ? In case the structure extends in future, that will let newer userspace run on an older kernel (as long as it doesn't use [set] any new fields). With regular sizeof(struct ptrace_sud_config) instead of adding size-related defines. It was Christian's idea how-to add/design new syscalls in an "extensible" manner. Here are his LPC slides: https://lpc.events/event/7/contributions/657/attachments/639/1159/extensible_syscalls.pdf [7/18 slide on checks] And an LWN article: https://lwn.net/Articles/830666/ Thanks, Dmitry