summarylogtreecommitdiffstats
path: root/0004-efivarfs-revert-fix-memory-leak-in-efivarfs_create.patch
diff options
context:
space:
mode:
authorgraysky2020-11-28 06:40:19 -0500
committergraysky2020-11-28 06:40:19 -0500
commit1ab6b24512b14ba2abd23f6e8774d315eed6931a (patch)
treea662177c849a23e4d88bb67d03d43351740e9c18 /0004-efivarfs-revert-fix-memory-leak-in-efivarfs_create.patch
parent54627e97bc5402e4d3570d29159c8955534c8f8d (diff)
downloadaur-1ab6b24512b14ba2abd23f6e8774d315eed6931a.tar.gz
Update to 5.9.11-2
Diffstat (limited to '0004-efivarfs-revert-fix-memory-leak-in-efivarfs_create.patch')
-rw-r--r--0004-efivarfs-revert-fix-memory-leak-in-efivarfs_create.patch58
1 files changed, 58 insertions, 0 deletions
diff --git a/0004-efivarfs-revert-fix-memory-leak-in-efivarfs_create.patch b/0004-efivarfs-revert-fix-memory-leak-in-efivarfs_create.patch
new file mode 100644
index 000000000000..779cbb00a60c
--- /dev/null
+++ b/0004-efivarfs-revert-fix-memory-leak-in-efivarfs_create.patch
@@ -0,0 +1,58 @@
+From a163474e9b86c2c25f20733385d8b1d6de492a7f Mon Sep 17 00:00:00 2001
+From: Ard Biesheuvel <ardb@kernel.org>
+Date: Wed, 25 Nov 2020 08:45:55 +0100
+Subject: [PATCH 4/5] efivarfs: revert "fix memory leak in efivarfs_create()"
+
+The memory leak addressed by commit fe5186cf12e3 is a false positive:
+all allocations are recorded in a linked list, and freed when the
+filesystem is unmounted. This leads to double frees, and as reported
+by David, leads to crashes if SLUB is configured to self destruct when
+double frees occur.
+
+So drop the redundant kfree() again, and instead, mark the offending
+pointer variable so the allocation is ignored by kmemleak.
+
+Cc: Vamshi K Sthambamkadi <vamshi.k.sthambamkadi@gmail.com>
+Fixes: fe5186cf12e3 ("efivarfs: fix memory leak in efivarfs_create()")
+Reported-by: David Laight <David.Laight@aculab.com>
+Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
+---
+ fs/efivarfs/inode.c | 2 ++
+ fs/efivarfs/super.c | 1 -
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/fs/efivarfs/inode.c b/fs/efivarfs/inode.c
+index 96c0c86f3fff..0297ad95eb5c 100644
+--- a/fs/efivarfs/inode.c
++++ b/fs/efivarfs/inode.c
+@@ -7,6 +7,7 @@
+ #include <linux/efi.h>
+ #include <linux/fs.h>
+ #include <linux/ctype.h>
++#include <linux/kmemleak.h>
+ #include <linux/slab.h>
+ #include <linux/uuid.h>
+
+@@ -103,6 +104,7 @@ static int efivarfs_create(struct inode *dir, struct dentry *dentry,
+ var->var.VariableName[i] = '\0';
+
+ inode->i_private = var;
++ kmemleak_ignore(var);
+
+ err = efivar_entry_add(var, &efivarfs_list);
+ if (err)
+diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c
+index f943fd0b0699..15880a68faad 100644
+--- a/fs/efivarfs/super.c
++++ b/fs/efivarfs/super.c
+@@ -21,7 +21,6 @@ LIST_HEAD(efivarfs_list);
+ static void efivarfs_evict_inode(struct inode *inode)
+ {
+ clear_inode(inode);
+- kfree(inode->i_private);
+ }
+
+ static const struct super_operations efivarfs_ops = {
+--
+2.29.2
+