X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=fs%2Fexec.c;h=623a5cc3076a114af8808ca030f04bdd82638829;hb=1d81a181e07cec584d1ab142eb921addc81d9b73;hp=c0c636e34f60f5b347407f1c43599e088d7fedca;hpb=6eb7365db6f3a4a9d8d9922bb0b800f9cbaad641;p=~andy%2Flinux diff --git a/fs/exec.c b/fs/exec.c index c0c636e34f6..623a5cc3076 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -923,6 +923,15 @@ char *get_task_comm(char *buf, struct task_struct *tsk) void set_task_comm(struct task_struct *tsk, char *buf) { task_lock(tsk); + + /* + * 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);