Commit 8e58e272 authored by Jim Cromie's avatar Jim Cromie Committed by Kelsey Skunberg

dyndbg: fix a BUG_ON in ddebug_describe_flags

BugLink: https://bugs.launchpad.net/bugs/1892822

[ Upstream commit f678ce8c ]

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: default avatarJim Cromie <jim.cromie@gmail.com>
Link: https://lore.kernel.org/r/20200719231058.1586423-8-jim.cromie@gmail.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
Signed-off-by: default avatarIan May <ian.may@canonical.com>
Signed-off-by: default avatarKelsey Skunberg <kelsey.skunberg@canonical.com>
parent c04e24c8
...@@ -85,22 +85,22 @@ static struct { unsigned flag:8; char opt_char; } opt_array[] = { ...@@ -85,22 +85,22 @@ static struct { unsigned flag:8; char opt_char; } opt_array[] = {
{ _DPRINTK_FLAGS_NONE, '_' }, { _DPRINTK_FLAGS_NONE, '_' },
}; };
struct flagsbuf { char buf[ARRAY_SIZE(opt_array)+1]; };
/* format a string into buf[] which describes the _ddebug's flags */ /* format a string into buf[] which describes the _ddebug's flags */
static char *ddebug_describe_flags(struct _ddebug *dp, char *buf, static char *ddebug_describe_flags(unsigned int flags, struct flagsbuf *fb)
size_t maxlen)
{ {
char *p = buf; char *p = fb->buf;
int i; int i;
BUG_ON(maxlen < 6);
for (i = 0; i < ARRAY_SIZE(opt_array); ++i) 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; *p++ = opt_array[i].opt_char;
if (p == buf) if (p == fb->buf)
*p++ = '_'; *p++ = '_';
*p = '\0'; *p = '\0';
return buf; return fb->buf;
} }
#define vpr_info(fmt, ...) \ #define vpr_info(fmt, ...) \
...@@ -142,7 +142,7 @@ static int ddebug_change(const struct ddebug_query *query, ...@@ -142,7 +142,7 @@ static int ddebug_change(const struct ddebug_query *query,
struct ddebug_table *dt; struct ddebug_table *dt;
unsigned int newflags; unsigned int newflags;
unsigned int nfound = 0; unsigned int nfound = 0;
char flagbuf[10]; struct flagsbuf fbuf;
/* search for matching ddebugs */ /* search for matching ddebugs */
mutex_lock(&ddebug_lock); mutex_lock(&ddebug_lock);
...@@ -192,8 +192,7 @@ static int ddebug_change(const struct ddebug_query *query, ...@@ -192,8 +192,7 @@ static int ddebug_change(const struct ddebug_query *query,
vpr_info("changed %s:%d [%s]%s =%s\n", vpr_info("changed %s:%d [%s]%s =%s\n",
trim_prefix(dp->filename), dp->lineno, trim_prefix(dp->filename), dp->lineno,
dt->mod_name, dp->function, dt->mod_name, dp->function,
ddebug_describe_flags(dp, flagbuf, ddebug_describe_flags(dp->flags, &fbuf));
sizeof(flagbuf)));
} }
} }
mutex_unlock(&ddebug_lock); mutex_unlock(&ddebug_lock);
...@@ -777,7 +776,7 @@ static int ddebug_proc_show(struct seq_file *m, void *p) ...@@ -777,7 +776,7 @@ static int ddebug_proc_show(struct seq_file *m, void *p)
{ {
struct ddebug_iter *iter = m->private; struct ddebug_iter *iter = m->private;
struct _ddebug *dp = p; struct _ddebug *dp = p;
char flagsbuf[10]; struct flagsbuf flags;
vpr_info("called m=%p p=%p\n", m, p); vpr_info("called m=%p p=%p\n", m, p);
...@@ -790,7 +789,7 @@ static int ddebug_proc_show(struct seq_file *m, void *p) ...@@ -790,7 +789,7 @@ static int ddebug_proc_show(struct seq_file *m, void *p)
seq_printf(m, "%s:%u [%s]%s =%s \"", seq_printf(m, "%s:%u [%s]%s =%s \"",
trim_prefix(dp->filename), dp->lineno, trim_prefix(dp->filename), dp->lineno,
iter->table->mod_name, dp->function, 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_escape(m, dp->format, "\t\r\n\"");
seq_puts(m, "\"\n"); seq_puts(m, "\"\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment