* [PATCH v4 0/3] Add support for long task name @ 2025-05-21 6:23 Bhupesh 2025-05-21 6:23 ` [PATCH v4 1/3] exec: Remove obsolete comments Bhupesh ` (2 more replies) 0 siblings, 3 replies; 16+ messages in thread From: Bhupesh @ 2025-05-21 6:23 UTC (permalink / raw) To: akpm Cc: bhupesh, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, lkp, laoar.shao, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, keescook, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman, vschneid, linux-trace-kernel Changes since v3: ================ - v3 can be seen here: https://lore.kernel.org/lkml/20250507110444.963779-1-bhupesh@igalia.com/ - As suggested by Petr and Steven, used 'comm_ext' name instead of 'real_comm'. Correspondingly the macro name is changed to 'TASK_COMM_EXT_LEN' for the 64-byte extended comm. - Rebased this patchset on linux-next/master, which contain the following patch from Steven now: 155fd6c3e2f0 ("tracing/sched: Use __string() instead of fixed lengths for task->comm") - Accordingly, v4 drops the changes done for 'trace/sched' events in v3, but retains the 'safe' memcpy' changes for other kernel trace users. Changes since v2: ================ - v2 can be seen here: https://lore.kernel.org/lkml/20250331121820.455916-1-bhupesh@igalia.com/ - As suggested by Yafang and Kees, picked Linus' suggested approach for this version (see: <https://lore.kernel.org/all/CAHk-=wjAmmHUg6vho1KjzQi2=psR30+CogFd4aXrThr2gsiS4g@mail.gmail.com/>). - Dropped kthreads patch from this version. It would be sent out separately, if we have a consensus on this approach. Changes since v1: ================ - v1 can be seen here: https://lore.kernel.org/lkml/20250314052715.610377-1-bhupesh@igalia.com/ - As suggested by Kees, added [PATCH 3/3] to have a consistent 'full_name' entry inside 'task_struct' which both tasks and kthreads can use. - Fixed the commit message to indicate that the existing ABI '/proc/$pid/task/$tid/comm' remains untouched and a parallel '/proc/$pid/task/$tid/full_name' ABI for new (interested) users. While working with user-space debugging tools which work especially on linux gaming platforms, I found that the task name is truncated due to the limitation of TASK_COMM_LEN. Now, during debug tracing, seeing truncated names is not very useful, especially on gaming platforms where the number of tasks running can be very high. This patchset does not touch 'TASK_COMM_LEN' at all, i.e. 'TASK_COMM_LEN' and the 16-byte design remains untouched. Via this patchset, as Linus suggested, we can add the following union inside 'task_struct': union { char comm[TASK_COMM_LEN]; char comm_ext[TASK_COMM_EXT_LEN]; }; and then modify '__set_task_comm()' to pass 'tsk->comm_ext' to the existing users. So, eventually: - users who want the existing 'TASK_COMM_LEN' behavior will get it (existing ABIs would continue to work), - users who just print out 'tsk->comm' as a string will get the longer new "extended comm", - users who do 'sizeof(->comm)' will continue to get the old value because of the union. After this change, gdb is able to show full name of the task, using a simple app which generates threads with long names [see 1]: # gdb ./threadnames -ex "run info thread" -ex "detach" -ex "quit" > log # cat log NameThatIsTooLongForComm[4662] [1]. https://github.com/lostgoat/tasknames Bhupesh (3): exec: Remove obsolete comments treewide: Switch memcpy() users of 'task->comm' to a more safer implementation exec: Add support for 64 byte 'tsk->comm_ext' fs/exec.c | 6 +++--- include/linux/coredump.h | 3 ++- include/linux/sched.h | 14 ++++++++------ include/trace/events/block.h | 5 +++++ include/trace/events/oom.h | 1 + include/trace/events/osnoise.h | 1 + include/trace/events/signal.h | 1 + include/trace/events/task.h | 2 ++ 8 files changed, 23 insertions(+), 10 deletions(-) -- 2.38.1 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v4 1/3] exec: Remove obsolete comments 2025-05-21 6:23 [PATCH v4 0/3] Add support for long task name Bhupesh @ 2025-05-21 6:23 ` Bhupesh 2025-05-22 6:18 ` Yafang Shao 2025-05-21 6:23 ` [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation Bhupesh 2025-05-21 6:23 ` [PATCH v4 3/3] exec: Add support for 64 byte 'tsk->comm_ext' Bhupesh 2 siblings, 1 reply; 16+ messages in thread From: Bhupesh @ 2025-05-21 6:23 UTC (permalink / raw) To: akpm Cc: bhupesh, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, lkp, laoar.shao, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, keescook, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman, vschneid, linux-trace-kernel Patch 3a3f61ce5e0b ("exec: Make sure task->comm is always NUL-terminated"), replaced 'strscpy_pad()' with 'memcpy()' implementations inside '__set_task_comm()'. However a few left-over comments are still there, which mention the usage of 'strscpy_pad()' inside '__set_task_comm()'. Remove those obsolete comments. While at it, also remove an obsolete comment regarding 'task_lock()' usage while handing 'task->comm'. Signed-off-by: Bhupesh <bhupesh@igalia.com> --- include/linux/sched.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/include/linux/sched.h b/include/linux/sched.h index 8c60a42f9d00..704222114dcc 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1162,10 +1162,8 @@ struct task_struct { * * - normally initialized begin_new_exec() * - set it with set_task_comm() - * - strscpy_pad() to ensure it is always NUL-terminated and + * - logic inside set_task_comm() will ensure it is always NUL-terminated and * zero-padded - * - task_lock() to ensure the operation is atomic and the name is - * fully updated. */ char comm[TASK_COMM_LEN]; @@ -1997,7 +1995,7 @@ extern void __set_task_comm(struct task_struct *tsk, const char *from, bool exec * User space can randomly change their names anyway, so locking for readers * doesn't make sense. For writers, locking is probably necessary, as a race * condition could lead to long-term mixed results. - * The strscpy_pad() in __set_task_comm() can ensure that the task comm is + * The logic inside __set_task_comm() should ensure that the task comm is * always NUL-terminated and zero-padded. Therefore the race condition between * reader and writer is not an issue. * -- 2.38.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v4 1/3] exec: Remove obsolete comments 2025-05-21 6:23 ` [PATCH v4 1/3] exec: Remove obsolete comments Bhupesh @ 2025-05-22 6:18 ` Yafang Shao 0 siblings, 0 replies; 16+ messages in thread From: Yafang Shao @ 2025-05-22 6:18 UTC (permalink / raw) To: Bhupesh Cc: akpm, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, lkp, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, keescook, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman, vschneid, linux-trace-kernel On Wed, May 21, 2025 at 2:24 PM Bhupesh <bhupesh@igalia.com> wrote: > > Patch 3a3f61ce5e0b ("exec: Make sure task->comm is always NUL-terminated"), > replaced 'strscpy_pad()' with 'memcpy()' implementations inside > '__set_task_comm()'. > > However a few left-over comments are still there, which mention > the usage of 'strscpy_pad()' inside '__set_task_comm()'. > > Remove those obsolete comments. > > While at it, also remove an obsolete comment regarding 'task_lock()' > usage while handing 'task->comm'. > > Signed-off-by: Bhupesh <bhupesh@igalia.com> Acked-by: Yafang Shao <laoar.shao@gmail.com> > --- > include/linux/sched.h | 6 ++---- > 1 file changed, 2 insertions(+), 4 deletions(-) > > diff --git a/include/linux/sched.h b/include/linux/sched.h > index 8c60a42f9d00..704222114dcc 100644 > --- a/include/linux/sched.h > +++ b/include/linux/sched.h > @@ -1162,10 +1162,8 @@ struct task_struct { > * > * - normally initialized begin_new_exec() > * - set it with set_task_comm() > - * - strscpy_pad() to ensure it is always NUL-terminated and > + * - logic inside set_task_comm() will ensure it is always NUL-terminated and > * zero-padded > - * - task_lock() to ensure the operation is atomic and the name is > - * fully updated. > */ > char comm[TASK_COMM_LEN]; > > @@ -1997,7 +1995,7 @@ extern void __set_task_comm(struct task_struct *tsk, const char *from, bool exec > * User space can randomly change their names anyway, so locking for readers > * doesn't make sense. For writers, locking is probably necessary, as a race > * condition could lead to long-term mixed results. > - * The strscpy_pad() in __set_task_comm() can ensure that the task comm is > + * The logic inside __set_task_comm() should ensure that the task comm is > * always NUL-terminated and zero-padded. Therefore the race condition between > * reader and writer is not an issue. > * > -- > 2.38.1 > -- Regards Yafang ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation 2025-05-21 6:23 [PATCH v4 0/3] Add support for long task name Bhupesh 2025-05-21 6:23 ` [PATCH v4 1/3] exec: Remove obsolete comments Bhupesh @ 2025-05-21 6:23 ` Bhupesh 2025-05-21 20:02 ` kernel test robot ` (2 more replies) 2025-05-21 6:23 ` [PATCH v4 3/3] exec: Add support for 64 byte 'tsk->comm_ext' Bhupesh 2 siblings, 3 replies; 16+ messages in thread From: Bhupesh @ 2025-05-21 6:23 UTC (permalink / raw) To: akpm Cc: bhupesh, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, lkp, laoar.shao, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, keescook, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman, vschneid, linux-trace-kernel As Linus mentioned in [1], currently we have several memcpy() use-cases which use 'current->comm' to copy the task name over to local copies. For an example: ... char comm[TASK_COMM_LEN]; memcpy(comm, current->comm, TASK_COMM_LEN); ... These should be modified so that we can later implement approaches to handle the task->comm's 16-byte length limitation (TASK_COMM_LEN) is a more modular way (follow-up patches do the same): ... char comm[TASK_COMM_LEN]; memcpy(comm, current->comm, TASK_COMM_LEN); comm[TASK_COMM_LEN - 1] = '\0'; ... The relevant 'memcpy()' users were identified using the following search pattern: $ git grep 'memcpy.*->comm\>' [1]. https://lore.kernel.org/all/CAHk-=wjAmmHUg6vho1KjzQi2=psR30+CogFd4aXrThr2gsiS4g@mail.gmail.com/ Signed-off-by: Bhupesh <bhupesh@igalia.com> --- include/linux/coredump.h | 3 ++- include/trace/events/block.h | 5 +++++ include/trace/events/oom.h | 1 + include/trace/events/osnoise.h | 1 + include/trace/events/signal.h | 1 + include/trace/events/task.h | 2 ++ 6 files changed, 12 insertions(+), 1 deletion(-) diff --git a/include/linux/coredump.h b/include/linux/coredump.h index 76e41805b92d..468abc308c24 100644 --- a/include/linux/coredump.h +++ b/include/linux/coredump.h @@ -54,7 +54,8 @@ extern void do_coredump(const kernel_siginfo_t *siginfo); do { \ char comm[TASK_COMM_LEN]; \ /* This will always be NUL terminated. */ \ - memcpy(comm, current->comm, sizeof(comm)); \ + memcpy(comm, current->comm, TASK_COMM_LEN); \ + comm[TASK_COMM_LEN] = '\0'; \ printk_ratelimited(Level "coredump: %d(%*pE): " Format "\n", \ task_tgid_vnr(current), (int)strlen(comm), comm, ##__VA_ARGS__); \ } while (0) \ diff --git a/include/trace/events/block.h b/include/trace/events/block.h index ad36e73b8579..11aa0b58176d 100644 --- a/include/trace/events/block.h +++ b/include/trace/events/block.h @@ -214,6 +214,7 @@ DECLARE_EVENT_CLASS(block_rq, blk_fill_rwbs(__entry->rwbs, rq->cmd_flags); __get_str(cmd)[0] = '\0'; memcpy(__entry->comm, current->comm, TASK_COMM_LEN); + __entry->comm[TASK_COMM_LEN - 1] = '\0'; ), TP_printk("%d,%d %s %u (%s) %llu + %u %s,%u,%u [%s]", @@ -352,6 +353,7 @@ DECLARE_EVENT_CLASS(block_bio, __entry->nr_sector = bio_sectors(bio); blk_fill_rwbs(__entry->rwbs, bio->bi_opf); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); + __entry->comm[TASK_COMM_LEN - 1] = '\0'; ), TP_printk("%d,%d %s %llu + %u [%s]", @@ -424,6 +426,7 @@ TRACE_EVENT(block_plug, TP_fast_assign( memcpy(__entry->comm, current->comm, TASK_COMM_LEN); + __entry->comm[TASK_COMM_LEN - 1] = '\0'; ), TP_printk("[%s]", __entry->comm) @@ -443,6 +446,7 @@ DECLARE_EVENT_CLASS(block_unplug, TP_fast_assign( __entry->nr_rq = depth; memcpy(__entry->comm, current->comm, TASK_COMM_LEN); + __entry->comm[TASK_COMM_LEN - 1] = '\0'; ), TP_printk("[%s] %d", __entry->comm, __entry->nr_rq) @@ -494,6 +498,7 @@ TRACE_EVENT(block_split, __entry->new_sector = new_sector; blk_fill_rwbs(__entry->rwbs, bio->bi_opf); memcpy(__entry->comm, current->comm, TASK_COMM_LEN); + __entry->comm[TASK_COMM_LEN - 1] = '\0'; ), TP_printk("%d,%d %s %llu / %llu [%s]", diff --git a/include/trace/events/oom.h b/include/trace/events/oom.h index 9f0a5d1482c4..a5641ed4285f 100644 --- a/include/trace/events/oom.h +++ b/include/trace/events/oom.h @@ -24,6 +24,7 @@ TRACE_EVENT(oom_score_adj_update, TP_fast_assign( __entry->pid = task->pid; memcpy(__entry->comm, task->comm, TASK_COMM_LEN); + __entry->comm[TASK_COMM_LEN - 1] = '\0'; __entry->oom_score_adj = task->signal->oom_score_adj; ), diff --git a/include/trace/events/osnoise.h b/include/trace/events/osnoise.h index 3f4273623801..0321b3f8d532 100644 --- a/include/trace/events/osnoise.h +++ b/include/trace/events/osnoise.h @@ -117,6 +117,7 @@ TRACE_EVENT(thread_noise, TP_fast_assign( memcpy(__entry->comm, t->comm, TASK_COMM_LEN); + __entry->comm[TASK_COMM_LEN - 1] = '\0'; __entry->pid = t->pid; __entry->start = start; __entry->duration = duration; diff --git a/include/trace/events/signal.h b/include/trace/events/signal.h index 1db7e4b07c01..7f490e553db5 100644 --- a/include/trace/events/signal.h +++ b/include/trace/events/signal.h @@ -68,6 +68,7 @@ TRACE_EVENT(signal_generate, __entry->sig = sig; TP_STORE_SIGINFO(__entry, info); memcpy(__entry->comm, task->comm, TASK_COMM_LEN); + __entry->comm[TASK_COMM_LEN - 1] = '\0'; __entry->pid = task->pid; __entry->group = group; __entry->result = result; diff --git a/include/trace/events/task.h b/include/trace/events/task.h index af535b053033..4ddf21b69372 100644 --- a/include/trace/events/task.h +++ b/include/trace/events/task.h @@ -22,6 +22,7 @@ TRACE_EVENT(task_newtask, TP_fast_assign( __entry->pid = task->pid; memcpy(__entry->comm, task->comm, TASK_COMM_LEN); + __entry->comm[TASK_COMM_LEN - 1] = '\0'; __entry->clone_flags = clone_flags; __entry->oom_score_adj = task->signal->oom_score_adj; ), @@ -45,6 +46,7 @@ TRACE_EVENT(task_rename, TP_fast_assign( memcpy(entry->oldcomm, task->comm, TASK_COMM_LEN); + entry->oldcomm[TASK_COMM_LEN - 1] = '\0'; strscpy(entry->newcomm, comm, TASK_COMM_LEN); __entry->oom_score_adj = task->signal->oom_score_adj; ), -- 2.38.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation 2025-05-21 6:23 ` [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation Bhupesh @ 2025-05-21 20:02 ` kernel test robot 2025-05-22 19:46 ` Bhupesh Sharma 2025-05-22 6:15 ` Yafang Shao 2025-05-23 9:40 ` Dan Carpenter 2 siblings, 1 reply; 16+ messages in thread From: kernel test robot @ 2025-05-21 20:02 UTC (permalink / raw) To: Bhupesh, akpm Cc: oe-kbuild-all, bhupesh, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, lkp, laoar.shao, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, keescook, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman Hi Bhupesh, kernel test robot noticed the following build warnings: [auto build test WARNING on trace/for-next] [also build test WARNING on tip/sched/core akpm-mm/mm-everything linus/master v6.15-rc7 next-20250521] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Bhupesh/exec-Remove-obsolete-comments/20250521-142443 base: https://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace for-next patch link: https://lore.kernel.org/r/20250521062337.53262-3-bhupesh%40igalia.com patch subject: [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation config: arc-randconfig-002-20250522 (https://download.01.org/0day-ci/archive/20250522/202505220326.5yDQHjnt-lkp@intel.com/config) compiler: arc-linux-gcc (GCC) 8.5.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250522/202505220326.5yDQHjnt-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202505220326.5yDQHjnt-lkp@intel.com/ All warnings (new ones prefixed by >>): In file included from fs/coredump.c:20: fs/coredump.c: In function 'do_coredump': >> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] comm[TASK_COMM_LEN] = '\0'; \ ~~~~^~~~~~~~~~~~~~~ include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) ^~~~~~~~~~~~~~~~~ fs/coredump.c:655:4: note: in expansion of macro 'coredump_report_failure' coredump_report_failure( ^~~~~~~~~~~~~~~~~~~~~~~ >> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] comm[TASK_COMM_LEN] = '\0'; \ ~~~~^~~~~~~~~~~~~~~ include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) ^~~~~~~~~~~~~~~~~ fs/coredump.c:730:4: note: in expansion of macro 'coredump_report_failure' coredump_report_failure("Core dump to %s aborted: " ^~~~~~~~~~~~~~~~~~~~~~~ >> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] comm[TASK_COMM_LEN] = '\0'; \ ~~~~^~~~~~~~~~~~~~~ include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) ^~~~~~~~~~~~~~~~~ fs/coredump.c:725:4: note: in expansion of macro 'coredump_report_failure' coredump_report_failure("Core dump to %s aborted: " ^~~~~~~~~~~~~~~~~~~~~~~ >> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] comm[TASK_COMM_LEN] = '\0'; \ ~~~~^~~~~~~~~~~~~~~ include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) ^~~~~~~~~~~~~~~~~ fs/coredump.c:618:4: note: in expansion of macro 'coredump_report_failure' coredump_report_failure("over core_pipe_limit, skipping core dump"); ^~~~~~~~~~~~~~~~~~~~~~~ >> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] comm[TASK_COMM_LEN] = '\0'; \ ~~~~^~~~~~~~~~~~~~~ include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) ^~~~~~~~~~~~~~~~~ fs/coredump.c:642:4: note: in expansion of macro 'coredump_report_failure' coredump_report_failure("|%s pipe failed", cn.corename); ^~~~~~~~~~~~~~~~~~~~~~~ >> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] comm[TASK_COMM_LEN] = '\0'; \ ~~~~^~~~~~~~~~~~~~~ include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) ^~~~~~~~~~~~~~~~~ fs/coredump.c:625:4: note: in expansion of macro 'coredump_report_failure' coredump_report_failure("%s failed to allocate memory", __func__); ^~~~~~~~~~~~~~~~~~~~~~~ >> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] comm[TASK_COMM_LEN] = '\0'; \ ~~~~^~~~~~~~~~~~~~~ include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) ^~~~~~~~~~~~~~~~~ fs/coredump.c:611:4: note: in expansion of macro 'coredump_report_failure' coredump_report_failure("RLIMIT_CORE is set to 1, aborting core"); ^~~~~~~~~~~~~~~~~~~~~~~ >> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] comm[TASK_COMM_LEN] = '\0'; \ ~~~~^~~~~~~~~~~~~~~ include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) ^~~~~~~~~~~~~~~~~ fs/coredump.c:591:4: note: in expansion of macro 'coredump_report_failure' coredump_report_failure("format_corename failed, aborting core"); ^~~~~~~~~~~~~~~~~~~~~~~ >> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] comm[TASK_COMM_LEN] = '\0'; \ ~~~~^~~~~~~~~~~~~~~ include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) ^~~~~~~~~~~~~~~~~ fs/coredump.c:752:4: note: in expansion of macro 'coredump_report_failure' coredump_report_failure("Core dump to |%s disabled", cn.corename); ^~~~~~~~~~~~~~~~~~~~~~~ fs/coredump.c: In function 'validate_coredump_safety': >> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] comm[TASK_COMM_LEN] = '\0'; \ ~~~~^~~~~~~~~~~~~~~ include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) ^~~~~~~~~~~~~~~~~ fs/coredump.c:1006:3: note: in expansion of macro 'coredump_report_failure' coredump_report_failure("Unsafe core_pattern used with fs.suid_dumpable=2: " ^~~~~~~~~~~~~~~~~~~~~~~ vim +57 include/linux/coredump.h 46 47 /* 48 * Logging for the coredump code, ratelimited. 49 * The TGID and comm fields are added to the message. 50 */ 51 52 #define __COREDUMP_PRINTK(Level, Format, ...) \ 53 do { \ 54 char comm[TASK_COMM_LEN]; \ 55 /* This will always be NUL terminated. */ \ 56 memcpy(comm, current->comm, TASK_COMM_LEN); \ > 57 comm[TASK_COMM_LEN] = '\0'; \ 58 printk_ratelimited(Level "coredump: %d(%*pE): " Format "\n", \ 59 task_tgid_vnr(current), (int)strlen(comm), comm, ##__VA_ARGS__); \ 60 } while (0) \ 61 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation 2025-05-21 20:02 ` kernel test robot @ 2025-05-22 19:46 ` Bhupesh Sharma 0 siblings, 0 replies; 16+ messages in thread From: Bhupesh Sharma @ 2025-05-22 19:46 UTC (permalink / raw) To: kernel test robot, Bhupesh, akpm Cc: oe-kbuild-all, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, laoar.shao, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, keescook, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman Hi, On 5/22/25 1:32 AM, kernel test robot wrote: > Hi Bhupesh, > > kernel test robot noticed the following build warnings: > > [auto build test WARNING on trace/for-next] > [also build test WARNING on tip/sched/core akpm-mm/mm-everything linus/master v6.15-rc7 next-20250521] > [If your patch is applied to the wrong git tree, kindly drop us a note. > And when submitting patch, we suggest to use '--base' as documented in > https://git-scm.com/docs/git-format-patch#_base_tree_information] > > url: https://github.com/intel-lab-lkp/linux/commits/Bhupesh/exec-Remove-obsolete-comments/20250521-142443 > base: https://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace for-next > patch link: https://lore.kernel.org/r/20250521062337.53262-3-bhupesh%40igalia.com > patch subject: [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation > config: arc-randconfig-002-20250522 (https://download.01.org/0day-ci/archive/20250522/202505220326.5yDQHjnt-lkp@intel.com/config) > compiler: arc-linux-gcc (GCC) 8.5.0 > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250522/202505220326.5yDQHjnt-lkp@intel.com/reproduce) > > If you fix the issue in a separate patch/commit (i.e. not just a new version of > the same patch/commit), kindly add following tags > | Reported-by: kernel test robot <lkp@intel.com> > | Closes: https://lore.kernel.org/oe-kbuild-all/202505220326.5yDQHjnt-lkp@intel.com/ > > All warnings (new ones prefixed by >>): > > In file included from fs/coredump.c:20: > fs/coredump.c: In function 'do_coredump': >>> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] > comm[TASK_COMM_LEN] = '\0'; \ > ~~~~^~~~~~~~~~~~~~~ > include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' > #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) > ^~~~~~~~~~~~~~~~~ > fs/coredump.c:655:4: note: in expansion of macro 'coredump_report_failure' > coredump_report_failure( > ^~~~~~~~~~~~~~~~~~~~~~~ >>> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] > comm[TASK_COMM_LEN] = '\0'; \ > ~~~~^~~~~~~~~~~~~~~ > include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' > #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) > ^~~~~~~~~~~~~~~~~ > fs/coredump.c:730:4: note: in expansion of macro 'coredump_report_failure' > coredump_report_failure("Core dump to %s aborted: " > ^~~~~~~~~~~~~~~~~~~~~~~ >>> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] > comm[TASK_COMM_LEN] = '\0'; \ > ~~~~^~~~~~~~~~~~~~~ > include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' > #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) > ^~~~~~~~~~~~~~~~~ > fs/coredump.c:725:4: note: in expansion of macro 'coredump_report_failure' > coredump_report_failure("Core dump to %s aborted: " > ^~~~~~~~~~~~~~~~~~~~~~~ >>> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] > comm[TASK_COMM_LEN] = '\0'; \ > ~~~~^~~~~~~~~~~~~~~ > include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' > #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) > ^~~~~~~~~~~~~~~~~ > fs/coredump.c:618:4: note: in expansion of macro 'coredump_report_failure' > coredump_report_failure("over core_pipe_limit, skipping core dump"); > ^~~~~~~~~~~~~~~~~~~~~~~ >>> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] > comm[TASK_COMM_LEN] = '\0'; \ > ~~~~^~~~~~~~~~~~~~~ > include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' > #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) > ^~~~~~~~~~~~~~~~~ > fs/coredump.c:642:4: note: in expansion of macro 'coredump_report_failure' > coredump_report_failure("|%s pipe failed", cn.corename); > ^~~~~~~~~~~~~~~~~~~~~~~ >>> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] > comm[TASK_COMM_LEN] = '\0'; \ > ~~~~^~~~~~~~~~~~~~~ > include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' > #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) > ^~~~~~~~~~~~~~~~~ > fs/coredump.c:625:4: note: in expansion of macro 'coredump_report_failure' > coredump_report_failure("%s failed to allocate memory", __func__); > ^~~~~~~~~~~~~~~~~~~~~~~ >>> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] > comm[TASK_COMM_LEN] = '\0'; \ > ~~~~^~~~~~~~~~~~~~~ > include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' > #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) > ^~~~~~~~~~~~~~~~~ > fs/coredump.c:611:4: note: in expansion of macro 'coredump_report_failure' > coredump_report_failure("RLIMIT_CORE is set to 1, aborting core"); > ^~~~~~~~~~~~~~~~~~~~~~~ >>> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] > comm[TASK_COMM_LEN] = '\0'; \ > ~~~~^~~~~~~~~~~~~~~ > include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' > #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) > ^~~~~~~~~~~~~~~~~ > fs/coredump.c:591:4: note: in expansion of macro 'coredump_report_failure' > coredump_report_failure("format_corename failed, aborting core"); > ^~~~~~~~~~~~~~~~~~~~~~~ >>> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] > comm[TASK_COMM_LEN] = '\0'; \ > ~~~~^~~~~~~~~~~~~~~ > include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' > #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) > ^~~~~~~~~~~~~~~~~ > fs/coredump.c:752:4: note: in expansion of macro 'coredump_report_failure' > coredump_report_failure("Core dump to |%s disabled", cn.corename); > ^~~~~~~~~~~~~~~~~~~~~~~ > fs/coredump.c: In function 'validate_coredump_safety': >>> include/linux/coredump.h:57:7: warning: array subscript 16 is above array bounds of 'char[16]' [-Warray-bounds] > comm[TASK_COMM_LEN] = '\0'; \ > ~~~~^~~~~~~~~~~~~~~ > include/linux/coredump.h:63:43: note: in expansion of macro '__COREDUMP_PRINTK' > #define coredump_report_failure(fmt, ...) __COREDUMP_PRINTK(KERN_WARNING, fmt, ##__VA_ARGS__) > ^~~~~~~~~~~~~~~~~ > fs/coredump.c:1006:3: note: in expansion of macro 'coredump_report_failure' > coredump_report_failure("Unsafe core_pattern used with fs.suid_dumpable=2: " > ^~~~~~~~~~~~~~~~~~~~~~~ > > > vim +57 include/linux/coredump.h > > 46 > 47 /* > 48 * Logging for the coredump code, ratelimited. > 49 * The TGID and comm fields are added to the message. > 50 */ > 51 > 52 #define __COREDUMP_PRINTK(Level, Format, ...) \ > 53 do { \ > 54 char comm[TASK_COMM_LEN]; \ > 55 /* This will always be NUL terminated. */ \ > 56 memcpy(comm, current->comm, TASK_COMM_LEN); \ > > 57 comm[TASK_COMM_LEN] = '\0'; \ > 58 printk_ratelimited(Level "coredump: %d(%*pE): " Format "\n", \ > 59 task_tgid_vnr(current), (int)strlen(comm), comm, ##__VA_ARGS__); \ > 60 } while (0) \ > 61 > Thanks, I will fix these in v5. Regards, Bhupesh ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation 2025-05-21 6:23 ` [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation Bhupesh 2025-05-21 20:02 ` kernel test robot @ 2025-05-22 6:15 ` Yafang Shao 2025-05-22 6:27 ` Yafang Shao 2025-05-23 9:40 ` Dan Carpenter 2 siblings, 1 reply; 16+ messages in thread From: Yafang Shao @ 2025-05-22 6:15 UTC (permalink / raw) To: Bhupesh Cc: akpm, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, lkp, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, keescook, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman, vschneid, linux-trace-kernel On Wed, May 21, 2025 at 2:24 PM Bhupesh <bhupesh@igalia.com> wrote: > > As Linus mentioned in [1], currently we have several memcpy() use-cases > which use 'current->comm' to copy the task name over to local copies. > For an example: > > ... > char comm[TASK_COMM_LEN]; > memcpy(comm, current->comm, TASK_COMM_LEN); > ... > > These should be modified so that we can later implement approaches > to handle the task->comm's 16-byte length limitation (TASK_COMM_LEN) > is a more modular way (follow-up patches do the same): > > ... > char comm[TASK_COMM_LEN]; > memcpy(comm, current->comm, TASK_COMM_LEN); > comm[TASK_COMM_LEN - 1] = '\0'; > ... > > The relevant 'memcpy()' users were identified using the following search > pattern: > $ git grep 'memcpy.*->comm\>' Hello Bhupesh, Several BPF programs currently read task->comm directly, as seen in: // tools/testing/selftests/bpf/progs/test_skb_helpers.c [0] bpf_probe_read_kernel_str(&comm, sizeof(comm), &task->comm); This approach may cause issues after the follow-up patch. I believe we should replace it with the safer bpf_get_current_comm() or explicitly null-terminate it with "comm[sizeof(comm) - 1] = '\0'". Out-of-tree BPF programs like BCC[1] or bpftrace[2] relying on direct task->comm access may also break and require updates. [0]. https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/tree/tools/testing/selftests/bpf/progs/test_skb_helpers.c#n26 [1]. https://github.com/iovisor/bcc [2]. https://github.com/bpftrace/bpftrace -- Regards Yafang ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation 2025-05-22 6:15 ` Yafang Shao @ 2025-05-22 6:27 ` Yafang Shao 2025-05-22 19:44 ` Bhupesh Sharma 0 siblings, 1 reply; 16+ messages in thread From: Yafang Shao @ 2025-05-22 6:27 UTC (permalink / raw) To: Bhupesh Cc: akpm, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, lkp, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, keescook, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman, vschneid, linux-trace-kernel On Thu, May 22, 2025 at 2:15 PM Yafang Shao <laoar.shao@gmail.com> wrote: > > On Wed, May 21, 2025 at 2:24 PM Bhupesh <bhupesh@igalia.com> wrote: > > > > As Linus mentioned in [1], currently we have several memcpy() use-cases > > which use 'current->comm' to copy the task name over to local copies. > > For an example: > > > > ... > > char comm[TASK_COMM_LEN]; > > memcpy(comm, current->comm, TASK_COMM_LEN); > > ... > > > > These should be modified so that we can later implement approaches > > to handle the task->comm's 16-byte length limitation (TASK_COMM_LEN) > > is a more modular way (follow-up patches do the same): > > > > ... > > char comm[TASK_COMM_LEN]; > > memcpy(comm, current->comm, TASK_COMM_LEN); > > comm[TASK_COMM_LEN - 1] = '\0'; > > ... > > > > The relevant 'memcpy()' users were identified using the following search > > pattern: > > $ git grep 'memcpy.*->comm\>' > > Hello Bhupesh, > > Several BPF programs currently read task->comm directly, as seen in: > > // tools/testing/selftests/bpf/progs/test_skb_helpers.c [0] > bpf_probe_read_kernel_str(&comm, sizeof(comm), &task->comm); > > This approach may cause issues after the follow-up patch. > I believe we should replace it with the safer bpf_get_current_comm() > or explicitly null-terminate it with "comm[sizeof(comm) - 1] = '\0'". > Out-of-tree BPF programs like BCC[1] or bpftrace[2] relying on direct > task->comm access may also break and require updates. > > [0]. https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/tree/tools/testing/selftests/bpf/progs/test_skb_helpers.c#n26 > [1]. https://github.com/iovisor/bcc > [2]. https://github.com/bpftrace/bpftrace Hmm, upon checking, I confirmed that bpf_probe_read_kernel_str() already ensures the destination string is null-terminated. Therefore, this change is unnecessary. Please disregard my previous comment. -- Regards Yafang ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation 2025-05-22 6:27 ` Yafang Shao @ 2025-05-22 19:44 ` Bhupesh Sharma 0 siblings, 0 replies; 16+ messages in thread From: Bhupesh Sharma @ 2025-05-22 19:44 UTC (permalink / raw) To: Yafang Shao, Bhupesh Cc: akpm, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, lkp, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, keescook, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman, vschneid, linux-trace-kernel Hi Yafang, Many thanks for the review. On 5/22/25 11:57 AM, Yafang Shao wrote: > On Thu, May 22, 2025 at 2:15 PM Yafang Shao <laoar.shao@gmail.com> wrote: >> On Wed, May 21, 2025 at 2:24 PM Bhupesh <bhupesh@igalia.com> wrote: >>> As Linus mentioned in [1], currently we have several memcpy() use-cases >>> which use 'current->comm' to copy the task name over to local copies. >>> For an example: >>> >>> ... >>> char comm[TASK_COMM_LEN]; >>> memcpy(comm, current->comm, TASK_COMM_LEN); >>> ... >>> >>> These should be modified so that we can later implement approaches >>> to handle the task->comm's 16-byte length limitation (TASK_COMM_LEN) >>> is a more modular way (follow-up patches do the same): >>> >>> ... >>> char comm[TASK_COMM_LEN]; >>> memcpy(comm, current->comm, TASK_COMM_LEN); >>> comm[TASK_COMM_LEN - 1] = '\0'; >>> ... >>> >>> The relevant 'memcpy()' users were identified using the following search >>> pattern: >>> $ git grep 'memcpy.*->comm\>' >> Hello Bhupesh, >> >> Several BPF programs currently read task->comm directly, as seen in: >> >> // tools/testing/selftests/bpf/progs/test_skb_helpers.c [0] >> bpf_probe_read_kernel_str(&comm, sizeof(comm), &task->comm); >> >> This approach may cause issues after the follow-up patch. >> I believe we should replace it with the safer bpf_get_current_comm() >> or explicitly null-terminate it with "comm[sizeof(comm) - 1] = '\0'". >> Out-of-tree BPF programs like BCC[1] or bpftrace[2] relying on direct >> task->comm access may also break and require updates. >> >> [0]. https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/tree/tools/testing/selftests/bpf/progs/test_skb_helpers.c#n26 >> [1]. https://github.com/iovisor/bcc >> [2]. https://github.com/bpftrace/bpftrace > Hmm, upon checking, I confirmed that bpf_probe_read_kernel_str() > already ensures the destination string is null-terminated. Therefore, > this change is unnecessary. Please disregard my previous comment. > Sure. Yes, bpf_probe_read_kernel_str() handles these cases. Thanks, Bhupesh ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation 2025-05-21 6:23 ` [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation Bhupesh 2025-05-21 20:02 ` kernel test robot 2025-05-22 6:15 ` Yafang Shao @ 2025-05-23 9:40 ` Dan Carpenter 2 siblings, 0 replies; 16+ messages in thread From: Dan Carpenter @ 2025-05-23 9:40 UTC (permalink / raw) To: oe-kbuild, Bhupesh, akpm Cc: lkp, oe-kbuild-all, bhupesh, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, laoar.shao, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, keescook, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman Hi Bhupesh, kernel test robot noticed the following build warnings: https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Bhupesh/exec-Remove-obsolete-comments/20250521-142443 base: https://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace for-next patch link: https://lore.kernel.org/r/20250521062337.53262-3-bhupesh%40igalia.com patch subject: [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation config: powerpc64-randconfig-r071-20250522 (https://download.01.org/0day-ci/archive/20250522/202505221104.qV4Iy0rA-lkp@intel.com/config) compiler: clang version 21.0.0git (https://github.com/llvm/llvm-project f819f46284f2a79790038e1f6649172789734ae8) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Reported-by: Dan Carpenter <dan.carpenter@linaro.org> | Closes: https://lore.kernel.org/r/202505221104.qV4Iy0rA-lkp@intel.com/ New smatch warnings: fs/coredump.c:591 do_coredump() error: buffer overflow 'comm' 16 <= 16 fs/coredump.c:1006 validate_coredump_safety() error: buffer overflow 'comm' 16 <= 16 vim +/comm +591 fs/coredump.c a78282e2c94f4c Linus Torvalds 2024-09-26 524 void do_coredump(const kernel_siginfo_t *siginfo) 10c28d937e2cca Alex Kelly 2012-09-26 525 { 10c28d937e2cca Alex Kelly 2012-09-26 526 struct core_state core_state; 10c28d937e2cca Alex Kelly 2012-09-26 527 struct core_name cn; 10c28d937e2cca Alex Kelly 2012-09-26 528 struct mm_struct *mm = current->mm; 10c28d937e2cca Alex Kelly 2012-09-26 529 struct linux_binfmt * binfmt; 10c28d937e2cca Alex Kelly 2012-09-26 530 const struct cred *old_cred; 10c28d937e2cca Alex Kelly 2012-09-26 531 struct cred *cred; a78282e2c94f4c Linus Torvalds 2024-09-26 532 int retval = 0; 10c28d937e2cca Alex Kelly 2012-09-26 533 int ispipe; 315c69261dd3fa Paul Wise 2019-08-02 534 size_t *argv = NULL; 315c69261dd3fa Paul Wise 2019-08-02 535 int argc = 0; fbb1816942c044 Jann Horn 2015-09-09 536 /* require nonrelative corefile path and be extra careful */ fbb1816942c044 Jann Horn 2015-09-09 537 bool need_suid_safe = false; acdedd99b0f3bf Oleg Nesterov 2013-04-30 538 bool core_dumped = false; 10c28d937e2cca Alex Kelly 2012-09-26 539 static atomic_t core_dump_count = ATOMIC_INIT(0); 10c28d937e2cca Alex Kelly 2012-09-26 540 struct coredump_params cprm = { 5ab1c309b34488 Denys Vlasenko 2012-10-04 541 .siginfo = siginfo, 10c28d937e2cca Alex Kelly 2012-09-26 542 .limit = rlimit(RLIMIT_CORE), 10c28d937e2cca Alex Kelly 2012-09-26 543 /* 10c28d937e2cca Alex Kelly 2012-09-26 544 * We must use the same mm->flags while dumping core to avoid 10c28d937e2cca Alex Kelly 2012-09-26 545 * inconsistency of bit flags, since this flag is not protected 10c28d937e2cca Alex Kelly 2012-09-26 546 * by any locks. 10c28d937e2cca Alex Kelly 2012-09-26 547 */ 10c28d937e2cca Alex Kelly 2012-09-26 548 .mm_flags = mm->flags, 95c5436a488384 Eric W. Biederman 2022-03-08 549 .vma_meta = NULL, 8603b6f58637ce Oleksandr Natalenko 2022-09-03 550 .cpu = raw_smp_processor_id(), 10c28d937e2cca Alex Kelly 2012-09-26 551 }; 10c28d937e2cca Alex Kelly 2012-09-26 552 5ab1c309b34488 Denys Vlasenko 2012-10-04 553 audit_core_dumps(siginfo->si_signo); 10c28d937e2cca Alex Kelly 2012-09-26 554 10c28d937e2cca Alex Kelly 2012-09-26 555 binfmt = mm->binfmt; a78282e2c94f4c Linus Torvalds 2024-09-26 556 if (!binfmt || !binfmt->core_dump) 10c28d937e2cca Alex Kelly 2012-09-26 557 goto fail; a78282e2c94f4c Linus Torvalds 2024-09-26 558 if (!__get_dumpable(cprm.mm_flags)) 10c28d937e2cca Alex Kelly 2012-09-26 559 goto fail; 10c28d937e2cca Alex Kelly 2012-09-26 560 10c28d937e2cca Alex Kelly 2012-09-26 561 cred = prepare_creds(); a78282e2c94f4c Linus Torvalds 2024-09-26 562 if (!cred) 10c28d937e2cca Alex Kelly 2012-09-26 563 goto fail; 10c28d937e2cca Alex Kelly 2012-09-26 564 /* 10c28d937e2cca Alex Kelly 2012-09-26 565 * We cannot trust fsuid as being the "true" uid of the process 10c28d937e2cca Alex Kelly 2012-09-26 566 * nor do we know its entire history. We only know it was tainted 10c28d937e2cca Alex Kelly 2012-09-26 567 * so we dump it as root in mode 2, and only into a controlled 10c28d937e2cca Alex Kelly 2012-09-26 568 * environment (pipe handler or fully qualified path). 10c28d937e2cca Alex Kelly 2012-09-26 569 */ e579d2c259be42 Kees Cook 2013-02-27 570 if (__get_dumpable(cprm.mm_flags) == SUID_DUMP_ROOT) { 10c28d937e2cca Alex Kelly 2012-09-26 571 /* Setuid core dump mode */ 10c28d937e2cca Alex Kelly 2012-09-26 572 cred->fsuid = GLOBAL_ROOT_UID; /* Dump root private */ fbb1816942c044 Jann Horn 2015-09-09 573 need_suid_safe = true; 10c28d937e2cca Alex Kelly 2012-09-26 574 } 10c28d937e2cca Alex Kelly 2012-09-26 575 5ab1c309b34488 Denys Vlasenko 2012-10-04 576 retval = coredump_wait(siginfo->si_signo, &core_state); 10c28d937e2cca Alex Kelly 2012-09-26 577 if (retval < 0) 10c28d937e2cca Alex Kelly 2012-09-26 578 goto fail_creds; 10c28d937e2cca Alex Kelly 2012-09-26 579 10c28d937e2cca Alex Kelly 2012-09-26 580 old_cred = override_creds(cred); 10c28d937e2cca Alex Kelly 2012-09-26 581 315c69261dd3fa Paul Wise 2019-08-02 582 ispipe = format_corename(&cn, &cprm, &argv, &argc); 10c28d937e2cca Alex Kelly 2012-09-26 583 10c28d937e2cca Alex Kelly 2012-09-26 584 if (ispipe) { 315c69261dd3fa Paul Wise 2019-08-02 585 int argi; 10c28d937e2cca Alex Kelly 2012-09-26 586 int dump_count; 10c28d937e2cca Alex Kelly 2012-09-26 587 char **helper_argv; 907ed1328d2a74 Lucas De Marchi 2013-04-30 588 struct subprocess_info *sub_info; 10c28d937e2cca Alex Kelly 2012-09-26 589 10c28d937e2cca Alex Kelly 2012-09-26 590 if (ispipe < 0) { c114e9948c2b6a Roman Kisel 2024-07-18 @591 coredump_report_failure("format_corename failed, aborting core"); e7fd1549aeb83e Oleg Nesterov 2013-07-03 592 goto fail_unlock; > /* This will always be NUL terminated. */ \ > - memcpy(comm, current->comm, sizeof(comm)); \ > + memcpy(comm, current->comm, TASK_COMM_LEN); \ > + comm[TASK_COMM_LEN] = '\0'; \ ^^^^^^^^^^^^^^ This was supposed to be "TASK_COMM_LEN - 1". Also the comment says it's not required... 10c28d937e2cca Alex Kelly 2012-09-26 593 } 10c28d937e2cca Alex Kelly 2012-09-26 594 10c28d937e2cca Alex Kelly 2012-09-26 595 if (cprm.limit == 1) { 10c28d937e2cca Alex Kelly 2012-09-26 596 /* See umh_pipe_setup() which sets RLIMIT_CORE = 1. -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v4 3/3] exec: Add support for 64 byte 'tsk->comm_ext' 2025-05-21 6:23 [PATCH v4 0/3] Add support for long task name Bhupesh 2025-05-21 6:23 ` [PATCH v4 1/3] exec: Remove obsolete comments Bhupesh 2025-05-21 6:23 ` [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation Bhupesh @ 2025-05-21 6:23 ` Bhupesh 2025-05-23 3:48 ` Kees Cook 2 siblings, 1 reply; 16+ messages in thread From: Bhupesh @ 2025-05-21 6:23 UTC (permalink / raw) To: akpm Cc: bhupesh, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, lkp, laoar.shao, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, keescook, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman, vschneid, linux-trace-kernel Historically due to the 16-byte length of TASK_COMM_LEN, the users of 'tsk->comm' are restricted to use a fixed-size target buffer also of TASK_COMM_LEN for 'memcpy()' like use-cases. To fix the same, Linus suggested in [1] that we can add the following union inside 'task_struct': union { char comm[TASK_COMM_LEN]; char comm_ext[TASK_COMM_EXT_LEN]; }; and then modify '__set_task_comm()' to pass 'tsk->comm_ext' to the existing users. This would mean that: (1) The old common pattern of just printing with '%s' and tsk->comm would just continue to work (as it is): pr_alert("BUG: Bad page state in process %s pfn:%05lx\n", current->comm, page_to_pfn(page)); (2) And, the memcpy() users of 'tsk->comm' would need to be made more stable by ensuring that the destination buffer always has a closing NUL character (done already in the preceding patch in this series). So, eventually: - users who want the existing 'TASK_COMM_LEN' behavior will get it (existing ABIs would continue to work), - users who just print out 'tsk->comm' as a string will get the longer new "extended comm", - users who do 'sizeof(->comm)' will continue to get the old value because of the union. [1]. https://lore.kernel.org/all/CAHk-=wjAmmHUg6vho1KjzQi2=psR30+CogFd4aXrThr2gsiS4g@mail.gmail.com Signed-off-by: Bhupesh <bhupesh@igalia.com> --- fs/exec.c | 6 +++--- include/linux/sched.h | 8 ++++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/fs/exec.c b/fs/exec.c index 1f5fdd2e096e..3b39fbfc8fe4 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1077,11 +1077,11 @@ static int unshare_sighand(struct task_struct *me) */ void __set_task_comm(struct task_struct *tsk, const char *buf, bool exec) { - size_t len = min(strlen(buf), sizeof(tsk->comm) - 1); + size_t len = min(strlen(buf), sizeof(tsk->comm_ext) - 1); trace_task_rename(tsk, buf); - memcpy(tsk->comm, buf, len); - memset(&tsk->comm[len], 0, sizeof(tsk->comm) - len); + memcpy(tsk->comm_ext, buf, len); + memset(&tsk->comm_ext[len], 0, sizeof(tsk->comm_ext) - len); perf_event_comm(tsk, exec); } diff --git a/include/linux/sched.h b/include/linux/sched.h index 704222114dcc..2605207170b4 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -316,6 +316,7 @@ struct user_event_mm; */ enum { TASK_COMM_LEN = 16, + TASK_COMM_EXT_LEN = 64, }; extern void sched_tick(void); @@ -1165,7 +1166,10 @@ struct task_struct { * - logic inside set_task_comm() will ensure it is always NUL-terminated and * zero-padded */ - char comm[TASK_COMM_LEN]; + union { + char comm[TASK_COMM_LEN]; + char comm_ext[TASK_COMM_EXT_LEN]; + }; struct nameidata *nameidata; @@ -2005,7 +2009,7 @@ extern void __set_task_comm(struct task_struct *tsk, const char *from, bool exec */ #define get_task_comm(buf, tsk) ({ \ BUILD_BUG_ON(sizeof(buf) < TASK_COMM_LEN); \ - strscpy_pad(buf, (tsk)->comm); \ + strscpy_pad(buf, (tsk)->comm_ext); \ buf; \ }) -- 2.38.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v4 3/3] exec: Add support for 64 byte 'tsk->comm_ext' 2025-05-21 6:23 ` [PATCH v4 3/3] exec: Add support for 64 byte 'tsk->comm_ext' Bhupesh @ 2025-05-23 3:48 ` Kees Cook 2025-05-23 12:31 ` Bhupesh Sharma 0 siblings, 1 reply; 16+ messages in thread From: Kees Cook @ 2025-05-23 3:48 UTC (permalink / raw) To: Bhupesh Cc: akpm, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, lkp, laoar.shao, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman, vschneid, linux-trace-kernel On Wed, May 21, 2025 at 11:53:37AM +0530, Bhupesh wrote: > Historically due to the 16-byte length of TASK_COMM_LEN, the > users of 'tsk->comm' are restricted to use a fixed-size target > buffer also of TASK_COMM_LEN for 'memcpy()' like use-cases. > > To fix the same, Linus suggested in [1] that we can add the > following union inside 'task_struct': > union { > char comm[TASK_COMM_LEN]; > char comm_ext[TASK_COMM_EXT_LEN]; > }; I remain unconvinced that this is at all safe. With the existing memcpy() and so many places using %s and task->comm, this feels very very risky to me. Can we just make it separate, instead of a union? Then we don't have to touch comm at all. > and then modify '__set_task_comm()' to pass 'tsk->comm_ext' > to the existing users. We can use set_task_comm() to set both still... -- Kees Cook ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 3/3] exec: Add support for 64 byte 'tsk->comm_ext' 2025-05-23 3:48 ` Kees Cook @ 2025-05-23 12:31 ` Bhupesh Sharma 2025-05-23 20:55 ` Kees Cook 0 siblings, 1 reply; 16+ messages in thread From: Bhupesh Sharma @ 2025-05-23 12:31 UTC (permalink / raw) To: Kees Cook, Bhupesh Cc: akpm, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, lkp, laoar.shao, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman, vschneid, linux-trace-kernel Hi Kees, Thanks for the review. On 5/23/25 9:18 AM, Kees Cook wrote: > On Wed, May 21, 2025 at 11:53:37AM +0530, Bhupesh wrote: >> Historically due to the 16-byte length of TASK_COMM_LEN, the >> users of 'tsk->comm' are restricted to use a fixed-size target >> buffer also of TASK_COMM_LEN for 'memcpy()' like use-cases. >> >> To fix the same, Linus suggested in [1] that we can add the >> following union inside 'task_struct': >> union { >> char comm[TASK_COMM_LEN]; >> char comm_ext[TASK_COMM_EXT_LEN]; >> }; > I remain unconvinced that this is at all safe. With the existing > memcpy() and so many places using %s and task->comm, this feels very > very risky to me. > > Can we just make it separate, instead of a union? Then we don't have to > touch comm at all. I understand your apprehensions, but I think we have covered _almost_ all the existing use-cases as of now: 1. memcpy() users: Handled by [PATCH 2/3] of this series, where we identify existing users using the following search pattern: $ git grep 'memcpy.*->comm\>' 2. %s usage: I checked this at multiple places and can confirm that %s usage to print out 'tsk->comm' (as a string), get the longer new "extended comm". 3. users who do 'sizeof(->comm)' will continue to get the old value because of the union. The problem with having two separate comms: tsk->comm and tsk->ext_comm, instead of a union is two fold: (a). If we keep two separate statically allocated comms: tsk->comm and tsk->ext_comm in struct task_struct, we need to basically keep supporting backward compatibility / ABI via tsk->comm and ask new user-land users to move to tsk->ext_comm. (b). If we keep one statically allocated comm: tsk->comm and one dynamically allocated tsk->ext_comm in struct task_struct, then we have the problem of allocating the tsk->ext_comm which _may_ be in the exec() hot path. I think the discussion between Linus and Yafang (see [1]), was more towards avoiding the approach in 3(a). Also we discussed the 3(b) approach, during the review of v2 of this series, where there was a apprehensions around: adding another field to store the task name and allocating tsk->ext_comm dynamically in the exec() hot path (see [2]). [1]. https://lore.kernel.org/all/CAHk-=wjAmmHUg6vho1KjzQi2=psR30+CogFd4aXrThr2gsiS4g@mail.gmail.com/ [2]. https://lore.kernel.org/lkml/CALOAHbB51b-reG6+ypr43sBJ-QpQhF39r5WPjuEp5rgabgRmoA@mail.gmail.com/ Please let me know your views. Thanks, Bhupesh >> and then modify '__set_task_comm()' to pass 'tsk->comm_ext' >> to the existing users. > We can use set_task_comm() to set both still... > ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 3/3] exec: Add support for 64 byte 'tsk->comm_ext' 2025-05-23 12:31 ` Bhupesh Sharma @ 2025-05-23 20:55 ` Kees Cook 2025-05-26 11:13 ` Bhupesh Sharma 0 siblings, 1 reply; 16+ messages in thread From: Kees Cook @ 2025-05-23 20:55 UTC (permalink / raw) To: Bhupesh Sharma Cc: Bhupesh, akpm, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, lkp, laoar.shao, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman, vschneid, linux-trace-kernel On Fri, May 23, 2025 at 06:01:41PM +0530, Bhupesh Sharma wrote: > 2. %s usage: I checked this at multiple places and can confirm that %s usage > to print out 'tsk->comm' (as a string), get the longer > new "extended comm". As an example of why I don't like this union is that this is now lying to the compiler. e.g. a %s of an object with a known size (sizeof(comm)) may now run off the end of comm without finding a %NUL character... this is "safe" in the sense that the "extended comm" is %NUL terminated, but it makes the string length ambiguous for the compiler (and any associated security hardening). > 3. users who do 'sizeof(->comm)' will continue to get the old value because > of the union. Right -- this is exactly where I think it can get very very wrong, leaving things unterminated. > The problem with having two separate comms: tsk->comm and tsk->ext_comm, > instead of a union is two fold: > (a). If we keep two separate statically allocated comms: tsk->comm and > tsk->ext_comm in struct task_struct, we need to basically keep supporting > backward compatibility / ABI via tsk->comm and ask new user-land users to > move to tsk->ext_comm. > > (b). If we keep one statically allocated comm: tsk->comm and one dynamically allocated tsk->ext_comm in struct task_struct, then we have the problem of allocating the tsk->ext_comm which _may_ be in the exec() hot path. > > I think the discussion between Linus and Yafang (see [1]), was more towards avoiding the approach in 3(a). > > Also we discussed the 3(b) approach, during the review of v2 of this series, where there was a apprehensions around: adding another field to store the task name and allocating tsk->ext_comm dynamically in the exec() hot path (see [2]). Right -- I agree we need them statically allocated. But I think a union is going to be really error-prone. How about this: rename task->comm to something else (task->comm_str?), increase its size and then add ABI-keeping wrappers for everything that _must_ have the old length. Doing this guarantees we won't miss anything (since "comm" got renamed), and during the refactoring all the places where the old length is required will be glaringly obvious. (i.e. it will be harder to make mistakes about leaving things unterminated.) -- Kees Cook ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 3/3] exec: Add support for 64 byte 'tsk->comm_ext' 2025-05-23 20:55 ` Kees Cook @ 2025-05-26 11:13 ` Bhupesh Sharma 2025-06-30 7:58 ` Bhupesh Sharma 0 siblings, 1 reply; 16+ messages in thread From: Bhupesh Sharma @ 2025-05-26 11:13 UTC (permalink / raw) To: Kees Cook Cc: Bhupesh, akpm, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, lkp, laoar.shao, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman, vschneid, linux-trace-kernel Hi Kees, On 5/24/25 2:25 AM, Kees Cook wrote: > On Fri, May 23, 2025 at 06:01:41PM +0530, Bhupesh Sharma wrote: >> 2. %s usage: I checked this at multiple places and can confirm that %s usage >> to print out 'tsk->comm' (as a string), get the longer >> new "extended comm". > As an example of why I don't like this union is that this is now lying > to the compiler. e.g. a %s of an object with a known size (sizeof(comm)) > may now run off the end of comm without finding a %NUL character... this > is "safe" in the sense that the "extended comm" is %NUL terminated, but > it makes the string length ambiguous for the compiler (and any > associated security hardening). Right. > >> 3. users who do 'sizeof(->comm)' will continue to get the old value because >> of the union. > Right -- this is exactly where I think it can get very very wrong, > leaving things unterminated. > >> The problem with having two separate comms: tsk->comm and tsk->ext_comm, >> instead of a union is two fold: >> (a). If we keep two separate statically allocated comms: tsk->comm and >> tsk->ext_comm in struct task_struct, we need to basically keep supporting >> backward compatibility / ABI via tsk->comm and ask new user-land users to >> move to tsk->ext_comm. >> >> (b). If we keep one statically allocated comm: tsk->comm and one dynamically allocated tsk->ext_comm in struct task_struct, then we have the problem of allocating the tsk->ext_comm which _may_ be in the exec() hot path. >> >> I think the discussion between Linus and Yafang (see [1]), was more towards avoiding the approach in 3(a). >> >> Also we discussed the 3(b) approach, during the review of v2 of this series, where there was a apprehensions around: adding another field to store the task name and allocating tsk->ext_comm dynamically in the exec() hot path (see [2]). > Right -- I agree we need them statically allocated. But I think a union > is going to be really error-prone. > > How about this: rename task->comm to something else (task->comm_str?), > increase its size and then add ABI-keeping wrappers for everything that > _must_ have the old length. > > Doing this guarantees we won't miss anything (since "comm" got renamed), > and during the refactoring all the places where the old length is required > will be glaringly obvious. (i.e. it will be harder to make mistakes > about leaving things unterminated.) > Ok, I got your point. Let me explore then how best a ABI-keeping wrapper can be introduced. I am thinking of something like: abi_wrapper_get_task_comm { if (requested_comm_length <= 16) return 16byte comm with NUL terminator; // old comm (16-bytes) else return 64byte comm with NUL terminator; // extended comm (64-bytes) .... } Please let me know if this looks better. Accordingly I will start with v5 changes. Thanks, Bhupesh ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v4 3/3] exec: Add support for 64 byte 'tsk->comm_ext' 2025-05-26 11:13 ` Bhupesh Sharma @ 2025-06-30 7:58 ` Bhupesh Sharma 0 siblings, 0 replies; 16+ messages in thread From: Bhupesh Sharma @ 2025-06-30 7:58 UTC (permalink / raw) To: Kees Cook Cc: Bhupesh, akpm, kernel-dev, linux-kernel, bpf, linux-perf-users, linux-fsdevel, linux-mm, oliver.sang, lkp, laoar.shao, pmladek, rostedt, mathieu.desnoyers, arnaldo.melo, alexei.starovoitov, andrii.nakryiko, mirq-linux, peterz, willy, david, viro, ebiederm, brauner, jack, mingo, juri.lelli, bsegall, mgorman, vschneid, linux-trace-kernel, torvalds, akpm On 5/26/25 4:43 PM, Bhupesh Sharma wrote: > Hi Kees, > > On 5/24/25 2:25 AM, Kees Cook wrote: >> On Fri, May 23, 2025 at 06:01:41PM +0530, Bhupesh Sharma wrote: >>> 2. %s usage: I checked this at multiple places and can confirm that >>> %s usage >>> to print out 'tsk->comm' (as a string), get the longer >>> new "extended comm". >> As an example of why I don't like this union is that this is now lying >> to the compiler. e.g. a %s of an object with a known size (sizeof(comm)) >> may now run off the end of comm without finding a %NUL character... this >> is "safe" in the sense that the "extended comm" is %NUL terminated, but >> it makes the string length ambiguous for the compiler (and any >> associated security hardening). > > Right. > >> >>> 3. users who do 'sizeof(->comm)' will continue to get the old value >>> because >>> of the union. >> Right -- this is exactly where I think it can get very very wrong, >> leaving things unterminated. >> >>> The problem with having two separate comms: tsk->comm and >>> tsk->ext_comm, >>> instead of a union is two fold: >>> (a). If we keep two separate statically allocated comms: tsk->comm and >>> tsk->ext_comm in struct task_struct, we need to basically keep >>> supporting >>> backward compatibility / ABI via tsk->comm and ask new user-land >>> users to >>> move to tsk->ext_comm. >>> >>> (b). If we keep one statically allocated comm: tsk->comm and one >>> dynamically allocated tsk->ext_comm in struct task_struct, then we >>> have the problem of allocating the tsk->ext_comm which _may_ be in >>> the exec() hot path. >>> >>> I think the discussion between Linus and Yafang (see [1]), was more >>> towards avoiding the approach in 3(a). >>> >>> Also we discussed the 3(b) approach, during the review of v2 of this >>> series, where there was a apprehensions around: adding another field >>> to store the task name and allocating tsk->ext_comm dynamically in >>> the exec() hot path (see [2]). >> Right -- I agree we need them statically allocated. But I think a union >> is going to be really error-prone. >> >> How about this: rename task->comm to something else (task->comm_str?), >> increase its size and then add ABI-keeping wrappers for everything that >> _must_ have the old length. >> >> Doing this guarantees we won't miss anything (since "comm" got renamed), >> and during the refactoring all the places where the old length is >> required >> will be glaringly obvious. (i.e. it will be harder to make mistakes >> about leaving things unterminated.) >> > > Ok, I got your point. Let me explore then how best a ABI-keeping > wrapper can be introduced. > I am thinking of something like: > > abi_wrapper_get_task_comm { > > if (requested_comm_length <= 16) > return 16byte comm with NUL terminator; // old comm (16-bytes) > else > return 64byte comm with NUL terminator; // extended comm > (64-bytes) > .... > } > > Please let me know if this looks better. Accordingly I will start with > v5 changes. Hi Everyone, sorry for the delay but I wanted the revive this discussion after the -rc1 and my PTO. I am looking for suggestions on how to implement v5 for this series. Here is some background of the version (and related discussions so far): In the v4, the implementation for tsk->comm handling (for supporting long 64byte task names) looked at handling the possible use-cases as follows: 1. memcpy() users: Handled by [PATCH 2/3] of this series, where we identify existing users using the following search pattern: $ git grep 'memcpy.*->comm\>' 2. %s usage: I checked this at multiple places and can confirm that %s usage to print out 'tsk->comm' (as a string), get the longer new "extended comm". 3. users who do 'sizeof(->comm)' will continue to get the old value because of the union. The above points were taken to address the points discussed earlier between Linus and Yafang (see [1]) As Kees, suggested in the v4 review (see [2]): 1. Let's rename task->comm to something else (task->comm_str?) and increase its size, and 2. Then add ABI-keeping wrappers for everything that _must_ have the old length. I am thinking of implementing it with something like: abi_wrapper_get_task_comm { if (requested_comm_length <= 16) return 16byte comm with NUL terminator; // old comm (16-bytes) else return 64byte comm with NUL terminator; // extended comm (64-bytes) .... } Kindly let me know your views on the above approach(es). [1]. https://lore.kernel.org/all/CAHk-=wjAmmHUg6vho1KjzQi2=psR30+CogFd4aXrThr2gsiS4g@mail.gmail.com/ [2]. https://lore.kernel.org/all/202505231346.52F291C54@keescook/ Thanks. ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2025-06-30 7:58 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-05-21 6:23 [PATCH v4 0/3] Add support for long task name Bhupesh 2025-05-21 6:23 ` [PATCH v4 1/3] exec: Remove obsolete comments Bhupesh 2025-05-22 6:18 ` Yafang Shao 2025-05-21 6:23 ` [PATCH v4 2/3] treewide: Switch memcpy() users of 'task->comm' to a more safer implementation Bhupesh 2025-05-21 20:02 ` kernel test robot 2025-05-22 19:46 ` Bhupesh Sharma 2025-05-22 6:15 ` Yafang Shao 2025-05-22 6:27 ` Yafang Shao 2025-05-22 19:44 ` Bhupesh Sharma 2025-05-23 9:40 ` Dan Carpenter 2025-05-21 6:23 ` [PATCH v4 3/3] exec: Add support for 64 byte 'tsk->comm_ext' Bhupesh 2025-05-23 3:48 ` Kees Cook 2025-05-23 12:31 ` Bhupesh Sharma 2025-05-23 20:55 ` Kees Cook 2025-05-26 11:13 ` Bhupesh Sharma 2025-06-30 7:58 ` Bhupesh Sharma
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).