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:
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)
|
||||
{
|
||||
task_lock(tsk);
|
||||
|
||||
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));
|
||||
task_unlock(tsk);
|
||||
perf_event_comm(tsk);
|
||||
|
|
Loading…
Reference in New Issue