Messages in this thread Patch in this message | | | From | Shunyong Yang <> | Subject | [PATCH] vsprintf: replace space with readable '=' before crng is ready | Date | Tue, 13 Feb 2018 14:20:48 +0800 |
| |
Before crng is ready, output of "%p" composes of "(ptrval)" and left padding spaces for alignment as no random address can be generated. This seems a little strange when default string width is larger than strlen("(ptrval)").
For example, when irq domain names are built with "%p", the nodes under /sys/kernel/debug/irq/domains like this on AArch64 system,
[root@y irq]# ls domains/ default irqchip@ (ptrval)-2 irqchip@ (ptrval)-4 \_SB_.TCS0.QIC1 \_SB_.TCS0.QIC3 irqchip@ (ptrval) irqchip@ (ptrval)-3 \_SB_.TCS0.QIC0 \_SB_.TCS0.QIC2
The name "irqchip@ (ptrval)-2" is not so readable in console output.
This patch replaces space with readable "=" when output needs padding. Following is the output after applying the patch,
[root@y domains]# ls default irqchip@(====ptrval====)-2 irqchip@(====ptrval====)-4 \_SB_.TCS0.QIC1 \_SB_.TCS0.QIC3 irqchip@(====ptrval====) irqchip@(====ptrval====)-3 \_SB_.TCS0.QIC0 \_SB_.TCS0.QIC2
There is same problem in some subsystem's dmesg output. Moreover, someone may call "%p" in a similar case. In addition, the timing of crng initialization done may vary on different system. So, the change is made in vsprintf.c.
Link: https://patchwork.kernel.org/patch/10185199/
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Cc: Joey Zheng <yu.zheng@hxt-semitech.com> Suggested-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> Signed-off-by: Shunyong Yang <shunyong.yang@hxt-semitech.com> --- lib/vsprintf.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 77ee6ced11b1..9fdc8376752a 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -1700,9 +1700,25 @@ static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec) const int default_width = 2 * sizeof(ptr); if (unlikely(!have_filled_random_ptr_key)) { + char *ptrval_str = "(ptrval)"; + char str[default_width + 1]; + int len = strlen(ptrval_str); + + if (default_width > len) { + int pos; + + pos = (default_width - len) / 2; + memset(str, '=', default_width); + memcpy(str + pos + 1, ptrval_str + 1, len - 2); + str[0] = '('; + str[default_width - 1] = ')'; + str[default_width] = 0; + ptrval_str = str; + } + spec.field_width = default_width; /* string length must be less than default_width */ - return string(buf, end, "(ptrval)", spec); + return string(buf, end, ptrval_str, spec); } #ifdef CONFIG_64BIT -- 1.8.3.1
| |