drm/msm/rd: fix crash with long process cmdlines

The [v]snprintf() functions return the size that *would have* been
written into the buffer, rather than the size *actually* written.
Which results in us trying to memcpy() past the end of the stack.

What we really want is [v]scnprintf().

Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
Rob Clark 2018-09-25 13:54:00 -04:00
parent 9027b8719b
commit b689a830f5
1 changed files with 3 additions and 3 deletions

View File

@ -366,7 +366,7 @@ void msm_rd_dump_submit(struct msm_rd_state *rd, struct msm_gem_submit *submit,
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
n = vsnprintf(msg, sizeof(msg), fmt, args); n = vscnprintf(msg, sizeof(msg), fmt, args);
va_end(args); va_end(args);
rd_write_section(rd, RD_CMD, msg, ALIGN(n, 4)); rd_write_section(rd, RD_CMD, msg, ALIGN(n, 4));
@ -375,11 +375,11 @@ void msm_rd_dump_submit(struct msm_rd_state *rd, struct msm_gem_submit *submit,
rcu_read_lock(); rcu_read_lock();
task = pid_task(submit->pid, PIDTYPE_PID); task = pid_task(submit->pid, PIDTYPE_PID);
if (task) { if (task) {
n = snprintf(msg, sizeof(msg), "%.*s/%d: fence=%u", n = scnprintf(msg, sizeof(msg), "%.*s/%d: fence=%u",
TASK_COMM_LEN, task->comm, TASK_COMM_LEN, task->comm,
pid_nr(submit->pid), submit->seqno); pid_nr(submit->pid), submit->seqno);
} else { } else {
n = snprintf(msg, sizeof(msg), "???/%d: fence=%u", n = scnprintf(msg, sizeof(msg), "???/%d: fence=%u",
pid_nr(submit->pid), submit->seqno); pid_nr(submit->pid), submit->seqno);
} }
rcu_read_unlock(); rcu_read_unlock();