lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Sat, 06 Dec 2008 18:00:03 +1100 From: Nick Andrew <nick@...k-andrew.net> To: Andrew Morton <akpm@...ux-foundation.org>, Linus Torvalds <torvalds@...ux-foundation.org> Cc: <linux-kernel@...r.kernel.org> Subject: [RFC PATCH v1 2/3] Add %v support to vsnprintf() Add %v support to vsnprintf() vsnprintf() is extended to support a '%v' in the format string. '%v' takes two arguments, the first is a format string and the second is a va_list. vsnprintf() is recursively called to process the specified format string and arguments, before returning to the original format string. This allows functions like the following, which prepend a subsystem-specific string to an error message: int subsystem_error(char *fmt, ...) { va_list ap; int rc; va_start(ap, fmt); rc = printk("%s: %v\n", "SUBSYSTEM", fmt, ap); va_end(ap); return rc; } Functions printing errors inside the subsystem would do like: subsystem_error("Failed to get widget: %d", 3); The resulting kernel message would be: SUBSYSTEM: Failed to get widget: 3\n The advantage over using say 2 printk() calls is that message output will be contiguous, whereas separate printk() calls might be broken by an intervening message from another kernel thread. Also a single message buffer is used, which avoids double-handling and excessive memory use. Signed-off-by: Nick Andrew <nick@...k-andrew.net> --- lib/vsprintf.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 1e2dcaf..e779f79 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -632,6 +632,7 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field * %pS output the name of a text symbol * %pF output the name of a function pointer * %pR output the address range in a struct resource + * %v processes a supplied format string and args, recursively * */ @@ -787,6 +788,19 @@ static char *__vsnprintfr(char *buf, char *str, char *end, case 'u': break; + case 'v': { + char *fmt2; + va_list args2; + + fmt2 = va_arg(args, char *); + args2 = va_arg(args, va_list); + /* recurse to format the (fmt,args) pair */ + str = __vsnprintfr(buf, str, end, fmt2, args2); + va_end(args2); + + continue; + } + default: if (str < end) *str = '%'; -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists