string_helpers: add kstrdup_quotable_cmdline
Provide an escaped (but readable: no inter-argument NULLs) commandline safe for logging. Signed-off-by: Kees Cook <keescook@chromium.org> Signed-off-by: James Morris <james.l.morris@oracle.com>
This commit is contained in:
parent
b53f27e4fa
commit
0d0443288f
@ -69,5 +69,6 @@ static inline int string_escape_str_any_np(const char *src, char *dst,
|
|||||||
}
|
}
|
||||||
|
|
||||||
char *kstrdup_quotable(const char *src, gfp_t gfp);
|
char *kstrdup_quotable(const char *src, gfp_t gfp);
|
||||||
|
char *kstrdup_quotable_cmdline(struct task_struct *task, gfp_t gfp);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
#include <linux/ctype.h>
|
#include <linux/ctype.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/string_helpers.h>
|
#include <linux/string_helpers.h>
|
||||||
@ -562,3 +563,36 @@ char *kstrdup_quotable(const char *src, gfp_t gfp)
|
|||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kstrdup_quotable);
|
EXPORT_SYMBOL_GPL(kstrdup_quotable);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns allocated NULL-terminated string containing process
|
||||||
|
* command line, with inter-argument NULLs replaced with spaces,
|
||||||
|
* and other special characters escaped.
|
||||||
|
*/
|
||||||
|
char *kstrdup_quotable_cmdline(struct task_struct *task, gfp_t gfp)
|
||||||
|
{
|
||||||
|
char *buffer, *quoted;
|
||||||
|
int i, res;
|
||||||
|
|
||||||
|
buffer = kmalloc(PAGE_SIZE, GFP_TEMPORARY);
|
||||||
|
if (!buffer)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
res = get_cmdline(task, buffer, PAGE_SIZE - 1);
|
||||||
|
buffer[res] = '\0';
|
||||||
|
|
||||||
|
/* Collapse trailing NULLs, leave res pointing to last non-NULL. */
|
||||||
|
while (--res >= 0 && buffer[res] == '\0')
|
||||||
|
;
|
||||||
|
|
||||||
|
/* Replace inter-argument NULLs. */
|
||||||
|
for (i = 0; i <= res; i++)
|
||||||
|
if (buffer[i] == '\0')
|
||||||
|
buffer[i] = ' ';
|
||||||
|
|
||||||
|
/* Make sure result is printable. */
|
||||||
|
quoted = kstrdup_quotable(buffer, gfp);
|
||||||
|
kfree(buffer);
|
||||||
|
return quoted;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(kstrdup_quotable_cmdline);
|
||||||
|
Loading…
Reference in New Issue
Block a user