Commit 3756f640 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Linus Torvalds

exec: avoid gcc-8 warning for get_task_comm

gcc-8 warns about using strncpy() with the source size as the limit:

  fs/exec.c:1223:32: error: argument to 'sizeof' in 'strncpy' call is the same expression as the source; did you mean to use the size of the destination? [-Werror=sizeof-pointer-memaccess]

This is indeed slightly suspicious, as it protects us from source
arguments without NUL-termination, but does not guarantee that the
destination is terminated.

This keeps the strncpy() to ensure we have properly padded target
buffer, but ensures that we use the correct length, by passing the
actual length of the destination buffer as well as adding a build-time
check to ensure it is exactly TASK_COMM_LEN.

There are only 23 callsites which I all reviewed to ensure this is
currently the case.  We could get away with doing only the check or
passing the right length, but it doesn't hurt to do both.

Link: http://lkml.kernel.org/r/20171205151724.1764896-1-arnd@arndb.deSigned-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Suggested-by: default avatarKees Cook <keescook@chromium.org>
Acked-by: default avatarKees Cook <keescook@chromium.org>
Acked-by: default avatarIngo Molnar <mingo@kernel.org>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: James Morris <james.l.morris@oracle.com>
Cc: Aleksa Sarai <asarai@suse.de>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Frederic Weisbecker <frederic@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 302ec300
...@@ -1216,15 +1216,14 @@ static int de_thread(struct task_struct *tsk) ...@@ -1216,15 +1216,14 @@ static int de_thread(struct task_struct *tsk)
return -EAGAIN; return -EAGAIN;
} }
char *get_task_comm(char *buf, struct task_struct *tsk) char *__get_task_comm(char *buf, size_t buf_size, struct task_struct *tsk)
{ {
/* buf must be at least sizeof(tsk->comm) in size */
task_lock(tsk); task_lock(tsk);
strncpy(buf, tsk->comm, sizeof(tsk->comm)); strncpy(buf, tsk->comm, buf_size);
task_unlock(tsk); task_unlock(tsk);
return buf; return buf;
} }
EXPORT_SYMBOL_GPL(get_task_comm); EXPORT_SYMBOL_GPL(__get_task_comm);
/* /*
* These functions flushes out all traces of the currently running executable * These functions flushes out all traces of the currently running executable
......
...@@ -1503,7 +1503,11 @@ static inline void set_task_comm(struct task_struct *tsk, const char *from) ...@@ -1503,7 +1503,11 @@ static inline void set_task_comm(struct task_struct *tsk, const char *from)
__set_task_comm(tsk, from, false); __set_task_comm(tsk, from, false);
} }
extern char *get_task_comm(char *to, struct task_struct *tsk); extern char *__get_task_comm(char *to, size_t len, struct task_struct *tsk);
#define get_task_comm(buf, tsk) ({ \
BUILD_BUG_ON(sizeof(buf) != TASK_COMM_LEN); \
__get_task_comm(buf, sizeof(buf), tsk); \
})
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
void scheduler_ipi(void); void scheduler_ipi(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment