forked from Minki/linux
dyndbg: fix a BUG_ON in ddebug_describe_flags
ddebug_describe_flags() currently fills a caller provided string buffer, after testing its size (also passed) in a BUG_ON. Fix this by replacing them with a known-big-enough string buffer wrapped in a struct, and passing that instead. Also simplify ddebug_describe_flags() flags parameter from a struct to a member in that struct, and hoist the member deref up to the caller. This makes the function reusable (soon) where flags are unpacked. Acked-by: <jbaron@akamai.com> Signed-off-by: Jim Cromie <jim.cromie@gmail.com> Link: https://lore.kernel.org/r/20200719231058.1586423-8-jim.cromie@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
81d0c2c609
commit
f678ce8cc3
@ -87,22 +87,22 @@ static struct { unsigned flag:8; char opt_char; } opt_array[] = {
|
||||
{ _DPRINTK_FLAGS_NONE, '_' },
|
||||
};
|
||||
|
||||
struct flagsbuf { char buf[ARRAY_SIZE(opt_array)+1]; };
|
||||
|
||||
/* format a string into buf[] which describes the _ddebug's flags */
|
||||
static char *ddebug_describe_flags(struct _ddebug *dp, char *buf,
|
||||
size_t maxlen)
|
||||
static char *ddebug_describe_flags(unsigned int flags, struct flagsbuf *fb)
|
||||
{
|
||||
char *p = buf;
|
||||
char *p = fb->buf;
|
||||
int i;
|
||||
|
||||
BUG_ON(maxlen < 6);
|
||||
for (i = 0; i < ARRAY_SIZE(opt_array); ++i)
|
||||
if (dp->flags & opt_array[i].flag)
|
||||
if (flags & opt_array[i].flag)
|
||||
*p++ = opt_array[i].opt_char;
|
||||
if (p == buf)
|
||||
if (p == fb->buf)
|
||||
*p++ = '_';
|
||||
*p = '\0';
|
||||
|
||||
return buf;
|
||||
return fb->buf;
|
||||
}
|
||||
|
||||
#define vnpr_info(lvl, fmt, ...) \
|
||||
@ -147,7 +147,7 @@ static int ddebug_change(const struct ddebug_query *query,
|
||||
struct ddebug_table *dt;
|
||||
unsigned int newflags;
|
||||
unsigned int nfound = 0;
|
||||
char flagbuf[10];
|
||||
struct flagsbuf fbuf;
|
||||
|
||||
/* search for matching ddebugs */
|
||||
mutex_lock(&ddebug_lock);
|
||||
@ -204,8 +204,7 @@ static int ddebug_change(const struct ddebug_query *query,
|
||||
v2pr_info("changed %s:%d [%s]%s =%s\n",
|
||||
trim_prefix(dp->filename), dp->lineno,
|
||||
dt->mod_name, dp->function,
|
||||
ddebug_describe_flags(dp, flagbuf,
|
||||
sizeof(flagbuf)));
|
||||
ddebug_describe_flags(dp->flags, &fbuf));
|
||||
}
|
||||
}
|
||||
mutex_unlock(&ddebug_lock);
|
||||
@ -814,7 +813,7 @@ static int ddebug_proc_show(struct seq_file *m, void *p)
|
||||
{
|
||||
struct ddebug_iter *iter = m->private;
|
||||
struct _ddebug *dp = p;
|
||||
char flagsbuf[10];
|
||||
struct flagsbuf flags;
|
||||
|
||||
if (p == SEQ_START_TOKEN) {
|
||||
seq_puts(m,
|
||||
@ -825,7 +824,7 @@ static int ddebug_proc_show(struct seq_file *m, void *p)
|
||||
seq_printf(m, "%s:%u [%s]%s =%s \"",
|
||||
trim_prefix(dp->filename), dp->lineno,
|
||||
iter->table->mod_name, dp->function,
|
||||
ddebug_describe_flags(dp, flagsbuf, sizeof(flagsbuf)));
|
||||
ddebug_describe_flags(dp->flags, &flags));
|
||||
seq_escape(m, dp->format, "\t\r\n\"");
|
||||
seq_puts(m, "\"\n");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user