On 01-Sep-26 14:57, Dawid Osuchowski wrote:
The name in struct vpu_tracing_buffer_header is a fixed-size array
populated by the NPU firmware. It is expected to be NUL-terminated,
but nothing on the host side enforces this, so printing it with an
unbounded string conversion would read past the field if the
terminator is ever missing and expose adjacent bytes of the shared
tracing BO through dmesg and the debugfs FW log output.

Print at most as many characters as the name field holds, so the output
never runs past it even if the string is not NUL-terminated.

Cc: [email protected]
Reported-by: sashiko-bot <[email protected]>
Closes: 
https://sashiko.dev/#/patchset/[email protected]?part=2
Fixes: d4e4257afa6e ("accel/ivpu: Add firmware tracing support")
Signed-off-by: Dawid Osuchowski <[email protected]>
---
  drivers/accel/ivpu/ivpu_fw_log.c | 15 +++++++++------
  1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/accel/ivpu/ivpu_fw_log.c b/drivers/accel/ivpu/ivpu_fw_log.c
index 4f9055aa9d33..9eafc42120b6 100644
--- a/drivers/accel/ivpu/ivpu_fw_log.c
+++ b/drivers/accel/ivpu/ivpu_fw_log.c
@@ -69,9 +69,9 @@ static int fw_log_from_bo(struct ivpu_device *vdev, struct 
ivpu_bo *bo, u32 *off
        *offset += size;
ivpu_dbg(vdev, FW_BOOT,
-                "FW log name \"%s\", write offset 0x%x size 0x%x, wrap count %d, 
hdr version %d size %d format %d, alignment %d",
-                log->name, log->write_index, size, log->wrap_count, 
log->header_version,
-                header_size, log->format, log->alignment);
+                "FW log name \"%.*s\", write offset 0x%x size 0x%x, wrap count %d, 
hdr version %d size %d format %d, alignment %d",
+                (int)ARRAY_SIZE(log->name), log->name, log->write_index, size, 
log->wrap_count,
+                log->header_version, header_size, log->format, log->alignment);
return 0;
  }
@@ -123,7 +123,8 @@ static void fw_log_print_buffer(struct ivpu_fw_log_desc 
*desc, const char *prefi
if (log->wrap_count == log->read_wrap_count) {
                if (log_end <= log_start) {
-                       drm_printf(p, "==== %s \"%s\" log empty ====\n", prefix, 
log->name);
+                       drm_printf(p, "==== %s \"%.*s\" log empty ====\n", 
prefix,
+                                  (int)ARRAY_SIZE(log->name), log->name);
                        return;
                }
        } else if (log->wrap_count == log->read_wrap_count + 1) {
@@ -133,7 +134,8 @@ static void fw_log_print_buffer(struct ivpu_fw_log_desc 
*desc, const char *prefi
                log_start = log_end;
        }
- drm_printf(p, "==== %s \"%s\" log start ====\n", prefix, log->name);
+       drm_printf(p, "==== %s \"%.*s\" log start ====\n", prefix, 
(int)ARRAY_SIZE(log->name),
+                  log->name);
        if (log_end > log_start) {
                fw_log_print_lines(log_data + log_start, log_end - log_start, 
p);
        } else {
@@ -141,7 +143,8 @@ static void fw_log_print_buffer(struct ivpu_fw_log_desc 
*desc, const char *prefi
                fw_log_print_lines(log_data, log_end, p);
        }
        drm_printf(p, "\n\x1b[0m"); /* add new line and clear formatting */
-       drm_printf(p, "==== %s \"%s\" log end   ====\n", prefix, log->name);
+       drm_printf(p, "==== %s \"%.*s\" log end   ====\n", prefix, 
(int)ARRAY_SIZE(log->name),
+                  log->name);
  }
static void

Reviewed-by: Karol Wachowski <[email protected]>

Reply via email to