set_task_comm: kill the pointless memset() + wmb()
set_task_comm() does memset() + wmb() before strlcpy(). This buys nothing and to add to the confusion, the comment is wrong. - We do not need memset() to be "safe from non-terminating string reads", the final char is always zero and we never change it. - wmb() is paired with nothing, it cannot prevent from printing the mixture of the old/new data unless the reader takes the lock. Signed-off-by: Oleg Nesterov <oleg@redhat.com> Cc: Andi Kleen <andi@firstfloor.org> Cc: John Stultz <johnstul@us.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
830e0fc967
commit
12eaaf309a
10
fs/exec.c
10
fs/exec.c
@@ -1027,17 +1027,7 @@ EXPORT_SYMBOL_GPL(get_task_comm);
|
|||||||
void set_task_comm(struct task_struct *tsk, char *buf)
|
void set_task_comm(struct task_struct *tsk, char *buf)
|
||||||
{
|
{
|
||||||
task_lock(tsk);
|
task_lock(tsk);
|
||||||
|
|
||||||
trace_task_rename(tsk, buf);
|
trace_task_rename(tsk, buf);
|
||||||
|
|
||||||
/*
|
|
||||||
* Threads may access current->comm without holding
|
|
||||||
* the task lock, so write the string carefully.
|
|
||||||
* Readers without a lock may see incomplete new
|
|
||||||
* names but are safe from non-terminating string reads.
|
|
||||||
*/
|
|
||||||
memset(tsk->comm, 0, TASK_COMM_LEN);
|
|
||||||
wmb();
|
|
||||||
strlcpy(tsk->comm, buf, sizeof(tsk->comm));
|
strlcpy(tsk->comm, buf, sizeof(tsk->comm));
|
||||||
task_unlock(tsk);
|
task_unlock(tsk);
|
||||||
perf_event_comm(tsk);
|
perf_event_comm(tsk);
|
||||||
|
Reference in New Issue
Block a user