diff options
Diffstat (limited to 'lib/vsprintf.c')
| -rw-r--r-- | lib/vsprintf.c | 19 | 
1 files changed, 19 insertions, 0 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 7c488a1ce318..7c47ad52ce2f 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -794,6 +794,13 @@ static char *ptr_to_id(char *buf, char *end, const void *ptr,  	unsigned long hashval;  	int ret; +	/* +	 * Print the real pointer value for NULL and error pointers, +	 * as they are not actual addresses. +	 */ +	if (IS_ERR_OR_NULL(ptr)) +		return pointer_string(buf, end, ptr, spec); +  	/* When debugging early boot use non-cryptographically secure hash. */  	if (unlikely(debug_boot_weak_hash)) {  		hashval = hash_long((unsigned long)ptr, 32); @@ -2168,6 +2175,10 @@ char *fwnode_string(char *buf, char *end, struct fwnode_handle *fwnode,   *		f full name   *		P node name, including a possible unit address   * - 'x' For printing the address. Equivalent to "%lx". + * - '[ku]s' For a BPF/tracing related format specifier, e.g. used out of + *           bpf_trace_printk() where [ku] prefix specifies either kernel (k) + *           or user (u) memory to probe, and: + *              s a string, equivalent to "%s" on direct vsnprintf() use   *   * ** When making changes please also update:   *	Documentation/core-api/printk-formats.rst @@ -2251,6 +2262,14 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,  		if (!IS_ERR(ptr))  			break;  		return err_ptr(buf, end, ptr, spec); +	case 'u': +	case 'k': +		switch (fmt[1]) { +		case 's': +			return string(buf, end, ptr, spec); +		default: +			return error_string(buf, end, "(einval)", spec); +		}  	}  	/* default is to _not_ leak addresses, hash before printing */  | 
