lkml.org 
[lkml]   [2021]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 074/245] ocfs2: fix snprintf() checking
    Date
    From: Dan Carpenter <dan.carpenter@oracle.com>

    [ Upstream commit 54e948c60cc843b6e84dc44496edc91f51d2a28e ]

    The snprintf() function returns the number of bytes which would have been
    printed if the buffer was large enough. In other words it can return ">=
    remain" but this code assumes it returns "== remain".

    The run time impact of this bug is not very severe. The next iteration
    through the loop would trigger a WARN() when we pass a negative limit to
    snprintf(). We would then return success instead of -E2BIG.

    The kernel implementation of snprintf() will never return negatives so
    there is no need to check and I have deleted that dead code.

    Link: https://lkml.kernel.org/r/20210511135350.GV1955@kadam
    Fixes: a860f6eb4c6a ("ocfs2: sysfile interfaces for online file check")
    Fixes: 74ae4e104dfc ("ocfs2: Create stack glue sysfs files.")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Cc: Mark Fasheh <mark@fasheh.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Junxiao Bi <junxiao.bi@oracle.com>
    Cc: Changwei Ge <gechangwei@live.cn>
    Cc: Gang He <ghe@suse.com>
    Cc: Jun Piao <piaojun@huawei.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/ocfs2/filecheck.c | 6 +-----
    fs/ocfs2/stackglue.c | 8 ++------
    2 files changed, 3 insertions(+), 11 deletions(-)

    diff --git a/fs/ocfs2/filecheck.c b/fs/ocfs2/filecheck.c
    index 2cabbcf2f28e..5571268b681c 100644
    --- a/fs/ocfs2/filecheck.c
    +++ b/fs/ocfs2/filecheck.c
    @@ -431,11 +431,7 @@ static ssize_t ocfs2_filecheck_show(struct kobject *kobj,
    ret = snprintf(buf + total, remain, "%lu\t\t%u\t%s\n",
    p->fe_ino, p->fe_done,
    ocfs2_filecheck_error(p->fe_status));
    - if (ret < 0) {
    - total = ret;
    - break;
    - }
    - if (ret == remain) {
    + if (ret >= remain) {
    /* snprintf() didn't fit */
    total = -E2BIG;
    break;
    diff --git a/fs/ocfs2/stackglue.c b/fs/ocfs2/stackglue.c
    index 52c07346bea3..03e1c6cd6f3c 100644
    --- a/fs/ocfs2/stackglue.c
    +++ b/fs/ocfs2/stackglue.c
    @@ -510,11 +510,7 @@ static ssize_t ocfs2_loaded_cluster_plugins_show(struct kobject *kobj,
    list_for_each_entry(p, &ocfs2_stack_list, sp_list) {
    ret = snprintf(buf, remain, "%s\n",
    p->sp_name);
    - if (ret < 0) {
    - total = ret;
    - break;
    - }
    - if (ret == remain) {
    + if (ret >= remain) {
    /* snprintf() didn't fit */
    total = -E2BIG;
    break;
    @@ -541,7 +537,7 @@ static ssize_t ocfs2_active_cluster_plugin_show(struct kobject *kobj,
    if (active_stack) {
    ret = snprintf(buf, PAGE_SIZE, "%s\n",
    active_stack->sp_name);
    - if (ret == PAGE_SIZE)
    + if (ret >= PAGE_SIZE)
    ret = -E2BIG;
    }
    spin_unlock(&ocfs2_stack_lock);
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-19 17:13    [W:4.234 / U:0.248 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site