aboutsummaryrefslogtreecommitdiffstats
path: root/debian/patches/bugfix/all/jfs-fix-inconsistency-between-memory-allocation-and-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/bugfix/all/jfs-fix-inconsistency-between-memory-allocation-and-.patch')
-rw-r--r--debian/patches/bugfix/all/jfs-fix-inconsistency-between-memory-allocation-and-.patch39
1 files changed, 39 insertions, 0 deletions
diff --git a/debian/patches/bugfix/all/jfs-fix-inconsistency-between-memory-allocation-and-.patch b/debian/patches/bugfix/all/jfs-fix-inconsistency-between-memory-allocation-and-.patch
new file mode 100644
index 000000000000..b0680e6bdfab
--- /dev/null
+++ b/debian/patches/bugfix/all/jfs-fix-inconsistency-between-memory-allocation-and-.patch
@@ -0,0 +1,39 @@
+From: Shankara Pailoor <shankarapailoor@gmail.com>
+Date: Tue, 5 Jun 2018 08:33:27 -0500
+Subject: jfs: Fix inconsistency between memory allocation and ea_buf->max_size
+Origin: https://git.kernel.org/linus/92d34134193e5b129dc24f8d79cb9196626e8d7a
+Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2018-12233
+
+The code is assuming the buffer is max_size length, but we weren't
+allocating enough space for it.
+
+Signed-off-by: Shankara Pailoor <shankarapailoor@gmail.com>
+Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
+---
+ fs/jfs/xattr.c | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+--- a/fs/jfs/xattr.c
++++ b/fs/jfs/xattr.c
+@@ -491,15 +491,17 @@ static int ea_get(struct inode *inode, s
+ if (size > PSIZE) {
+ /*
+ * To keep the rest of the code simple. Allocate a
+- * contiguous buffer to work with
++ * contiguous buffer to work with. Make the buffer large
++ * enough to make use of the whole extent.
+ */
+- ea_buf->xattr = kmalloc(size, GFP_KERNEL);
++ ea_buf->max_size = (size + sb->s_blocksize - 1) &
++ ~(sb->s_blocksize - 1);
++
++ ea_buf->xattr = kmalloc(ea_buf->max_size, GFP_KERNEL);
+ if (ea_buf->xattr == NULL)
+ return -ENOMEM;
+
+ ea_buf->flag = EA_MALLOC;
+- ea_buf->max_size = (size + sb->s_blocksize - 1) &
+- ~(sb->s_blocksize - 1);
+
+ if (ea_size == 0)
+ return 0;