seq_file: seq_show_option_n() is used for precise sizes
authorKees Cook <keescook@chromium.org>
Wed, 26 Jul 2023 21:59:57 +0000 (14:59 -0700)
committerKees Cook <keescook@chromium.org>
Thu, 27 Jul 2023 15:48:12 +0000 (08:48 -0700)
When seq_show_option_n() is used, it is for non-string memory that
happens to be printable bytes. As such, we must use memcpy() to copy the
bytes and then explicitly NUL-terminate the result.

Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Muchun Song <muchun.song@linux.dev>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20230726215957.never.619-kees@kernel.org
Signed-off-by: Kees Cook <keescook@chromium.org>
include/linux/seq_file.h

index bd023dd..386ab58 100644 (file)
@@ -249,18 +249,19 @@ static inline void seq_show_option(struct seq_file *m, const char *name,
 
 /**
  * seq_show_option_n - display mount options with appropriate escapes
- *                    where @value must be a specific length.
+ *                    where @value must be a specific length (i.e.
+ *                    not NUL-terminated).
  * @m: the seq_file handle
  * @name: the mount option name
  * @value: the mount option name's value, cannot be NULL
- * @length: the length of @value to display
+ * @length: the exact length of @value to display, must be constant expression
  *
  * This is a macro since this uses "length" to define the size of the
  * stack buffer.
  */
 #define seq_show_option_n(m, name, value, length) {    \
        char val_buf[length + 1];                       \
-       strncpy(val_buf, value, length);                \
+       memcpy(val_buf, value, length);                 \
        val_buf[length] = '\0';                         \
        seq_show_option(m, name, val_buf);              \
 }