diff options
Diffstat (limited to 'lib/kasprintf.c')
| -rw-r--r-- | lib/kasprintf.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/kasprintf.c b/lib/kasprintf.c index 32f12150fc4f..f194e6e593e1 100644 --- a/lib/kasprintf.c +++ b/lib/kasprintf.c | |||
| @@ -31,6 +31,22 @@ char *kvasprintf(gfp_t gfp, const char *fmt, va_list ap) | |||
| 31 | } | 31 | } |
| 32 | EXPORT_SYMBOL(kvasprintf); | 32 | EXPORT_SYMBOL(kvasprintf); |
| 33 | 33 | ||
| 34 | /* | ||
| 35 | * If fmt contains no % (or is exactly %s), use kstrdup_const. If fmt | ||
| 36 | * (or the sole vararg) points to rodata, we will then save a memory | ||
| 37 | * allocation and string copy. In any case, the return value should be | ||
| 38 | * freed using kfree_const(). | ||
| 39 | */ | ||
| 40 | const char *kvasprintf_const(gfp_t gfp, const char *fmt, va_list ap) | ||
| 41 | { | ||
| 42 | if (!strchr(fmt, '%')) | ||
| 43 | return kstrdup_const(fmt, gfp); | ||
| 44 | if (!strcmp(fmt, "%s")) | ||
| 45 | return kstrdup_const(va_arg(ap, const char*), gfp); | ||
| 46 | return kvasprintf(gfp, fmt, ap); | ||
| 47 | } | ||
| 48 | EXPORT_SYMBOL(kvasprintf_const); | ||
| 49 | |||
| 34 | char *kasprintf(gfp_t gfp, const char *fmt, ...) | 50 | char *kasprintf(gfp_t gfp, const char *fmt, ...) |
| 35 | { | 51 | { |
| 36 | va_list ap; | 52 | va_list ap; |
