| From f4ae1be32c6c579d60e54cfa89fc7f16848a1b57 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 28 Jun 2021 19:34:01 -0700 |
| Subject: ocfs2: fix snprintf() checking |
| |
| 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 50f11bfdc8c2..82a3edc4aea4 100644 |
| --- a/fs/ocfs2/filecheck.c |
| +++ b/fs/ocfs2/filecheck.c |
| @@ -328,11 +328,7 @@ static ssize_t ocfs2_filecheck_attr_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 a191094694c6..03eacb249f37 100644 |
| --- a/fs/ocfs2/stackglue.c |
| +++ b/fs/ocfs2/stackglue.c |
| @@ -502,11 +502,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; |
| @@ -533,7 +529,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 |
| |