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 the flags parameter, and instead de-ref the flags struct
in the caller; this makes the function reusable (soon) where flags are
unpacked.

Signed-off-by: Jim Cromie <jim.cro...@gmail.com>
---
 lib/dynamic_debug.c | 31 +++++++++++++++----------------
 1 file changed, 15 insertions(+), 16 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 25cc1eb86d96..08b8c9c04a17 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -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, ...)                               \
@@ -141,13 +141,13 @@ static void vpr_info_dq(const struct ddebug_query *query, 
const char *msg)
  * logs the changes.  Takes ddebug_lock.
  */
 static int ddebug_change(const struct ddebug_query *query,
-                       unsigned int flags, unsigned int mask)
+                       unsigned int pflags, unsigned int mask)
 {
        int i;
        struct ddebug_table *dt;
        unsigned int newflags;
        unsigned int nfound = 0;
-       char flagbuf[10];
+       struct flagsbuf flags;
 
        /* search for matching ddebugs */
        mutex_lock(&ddebug_lock);
@@ -190,22 +190,21 @@ static int ddebug_change(const struct ddebug_query *query,
 
                        nfound++;
 
-                       newflags = (dp->flags & mask) | flags;
+                       newflags = (dp->flags & mask) | pflags;
                        if (newflags == dp->flags)
                                continue;
 #ifdef CONFIG_JUMP_LABEL
                        if (dp->flags & _DPRINTK_FLAGS_PRINT) {
-                               if (!(flags & _DPRINTK_FLAGS_PRINT))
+                               if (!(pflags & _DPRINTK_FLAGS_PRINT))
                                        
static_branch_disable(&dp->key.dd_key_true);
-                       } else if (flags & _DPRINTK_FLAGS_PRINT)
+                       } else if (pflags & _DPRINTK_FLAGS_PRINT)
                                static_branch_enable(&dp->key.dd_key_true);
 #endif
                        dp->flags = newflags;
                        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, &flags));
                }
        }
        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");
 
-- 
2.26.2

Reply via email to