lkml.org 
[lkml]   [2020]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 07/24] dyndbg: fix a BUG_ON in ddebug_describe_flags
    Date
    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.
    ---
    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 9b2445507988..aaace13d7536 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
    \
     
     \ /
      Last update: 2020-06-13 17:59    [W:4.535 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site