Forum | Documentation | Website | Blog

Skip to content
Snippets Groups Projects
Commit 24978704 authored by Ilya Leoshkevich's avatar Ilya Leoshkevich Committed by Greg Kroah-Hartman
Browse files

statfs: enforce statfs[64] structure initialization


commit ed40866e upstream.

s390's struct statfs and struct statfs64 contain padding, which
field-by-field copying does not set. Initialize the respective structs
with zeros before filling them and copying them to userspace, like it's
already done for the compat versions of these structs.

Found by KMSAN.

[agordeev@linux.ibm.com: fixed typo in patch description]
Acked-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Cc: stable@vger.kernel.org # v4.14+
Signed-off-by: default avatarIlya Leoshkevich <iii@linux.ibm.com>
Reviewed-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Link: https://lore.kernel.org/r/20230504144021.808932-2-iii@linux.ibm.com


Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 556b57ac
No related merge requests found
...@@ -130,6 +130,7 @@ static int do_statfs_native(struct kstatfs *st, struct statfs __user *p) ...@@ -130,6 +130,7 @@ static int do_statfs_native(struct kstatfs *st, struct statfs __user *p)
if (sizeof(buf) == sizeof(*st)) if (sizeof(buf) == sizeof(*st))
memcpy(&buf, st, sizeof(*st)); memcpy(&buf, st, sizeof(*st));
else { else {
memset(&buf, 0, sizeof(buf));
if (sizeof buf.f_blocks == 4) { if (sizeof buf.f_blocks == 4) {
if ((st->f_blocks | st->f_bfree | st->f_bavail | if ((st->f_blocks | st->f_bfree | st->f_bavail |
st->f_bsize | st->f_frsize) & st->f_bsize | st->f_frsize) &
...@@ -158,7 +159,6 @@ static int do_statfs_native(struct kstatfs *st, struct statfs __user *p) ...@@ -158,7 +159,6 @@ static int do_statfs_native(struct kstatfs *st, struct statfs __user *p)
buf.f_namelen = st->f_namelen; buf.f_namelen = st->f_namelen;
buf.f_frsize = st->f_frsize; buf.f_frsize = st->f_frsize;
buf.f_flags = st->f_flags; buf.f_flags = st->f_flags;
memset(buf.f_spare, 0, sizeof(buf.f_spare));
} }
if (copy_to_user(p, &buf, sizeof(buf))) if (copy_to_user(p, &buf, sizeof(buf)))
return -EFAULT; return -EFAULT;
...@@ -171,6 +171,7 @@ static int do_statfs64(struct kstatfs *st, struct statfs64 __user *p) ...@@ -171,6 +171,7 @@ static int do_statfs64(struct kstatfs *st, struct statfs64 __user *p)
if (sizeof(buf) == sizeof(*st)) if (sizeof(buf) == sizeof(*st))
memcpy(&buf, st, sizeof(*st)); memcpy(&buf, st, sizeof(*st));
else { else {
memset(&buf, 0, sizeof(buf));
buf.f_type = st->f_type; buf.f_type = st->f_type;
buf.f_bsize = st->f_bsize; buf.f_bsize = st->f_bsize;
buf.f_blocks = st->f_blocks; buf.f_blocks = st->f_blocks;
...@@ -182,7 +183,6 @@ static int do_statfs64(struct kstatfs *st, struct statfs64 __user *p) ...@@ -182,7 +183,6 @@ static int do_statfs64(struct kstatfs *st, struct statfs64 __user *p)
buf.f_namelen = st->f_namelen; buf.f_namelen = st->f_namelen;
buf.f_frsize = st->f_frsize; buf.f_frsize = st->f_frsize;
buf.f_flags = st->f_flags; buf.f_flags = st->f_flags;
memset(buf.f_spare, 0, sizeof(buf.f_spare));
} }
if (copy_to_user(p, &buf, sizeof(buf))) if (copy_to_user(p, &buf, sizeof(buf)))
return -EFAULT; return -EFAULT;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment