Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1694594

[PATCH 1/3] x86/microcode/AMD: Free unneeded patch before exit from update_cache()

From Borislav Petkov <bp@alien8.de>
Newsgroups linux.kernel
Subject [PATCH 1/3] x86/microcode/AMD: Free unneeded patch before exit from update_cache()
Date 2017-07-24 12:20 +0200
Message-ID <u6ID0-3oc-9@gated-at.bofh.it> (permalink)
References <u6ICZ-3oc-3@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


From: Shu Wang <shuwang@redhat.com>

verify_and_add_patch() allocates memory for a microcode patch and hands
it down to be added to the cache of patches. However, if the cache
already has the latest patch, the newly allocated one needs to be freed
before returning. Do that.

This issue has been found by kmemleak:

  unreferenced object 0xffff88010e780b40 (size 32):
    comm "bash", pid 860, jiffies 4294690939 (age 29.297s)
    backtrace:
       kmemleak_alloc
       kmem_cache_alloc_trace
       load_microcode_amd.isra.0
       request_microcode_amd
       reload_store
       dev_attr_store
       sysfs_kf_write
       kernfs_fop_write
       __vfs_write
       vfs_write
       SyS_write
       do_syscall_64
       return_from_SYSCALL_64
       0xffffffffffffffff

  (gdb) list *0xffffffff81050d60
  0xffffffff81050d60 is in load_microcode_amd
                (arch/x86/kernel/cpu/microcode/amd.c:616).

which is this:

	patch = kzalloc(sizeof(*patch), GFP_KERNEL);
-->	if (!patch) {
		pr_err("Patch allocation failure.\n");
		return -EINVAL;
	}

Signed-off-by: Shu Wang <shuwang@redhat.com>
Cc: chuhu@redhat.com
Cc: liwang@redhat.com
Cc: x86-ml <x86@kernel.org>
Link: http://lkml.kernel.org/r/1500438083-15996-1-git-send-email-shuwang@redhat.com
[ Rewrite commit message. ]
Signed-off-by: Borislav Petkov <bp@suse.de>
---
 arch/x86/kernel/cpu/microcode/amd.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kernel/cpu/microcode/amd.c b/arch/x86/kernel/cpu/microcode/amd.c
index 21b185793c80..c6daec4bdba5 100644
--- a/arch/x86/kernel/cpu/microcode/amd.c
+++ b/arch/x86/kernel/cpu/microcode/amd.c
@@ -400,9 +400,12 @@ static void update_cache(struct ucode_patch *new_patch)
 
 	list_for_each_entry(p, &microcode_cache, plist) {
 		if (p->equiv_cpu == new_patch->equiv_cpu) {
-			if (p->patch_id >= new_patch->patch_id)
+			if (p->patch_id >= new_patch->patch_id) {
 				/* we already have the latest patch */
+				kfree(new_patch->data);
+				kfree(new_patch);
 				return;
+			}
 
 			list_replace(&p->plist, &new_patch->plist);
 			kfree(p->data);
-- 
2.14.0.rc0

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH 0/3] x86 stuff for 4.14 Borislav Petkov <bp@alien8.de> - 2017-07-24 12:20 +0200
  [PATCH 1/3] x86/microcode/AMD: Free unneeded patch before exit from update_cache() Borislav Petkov <bp@alien8.de> - 2017-07-24 12:20 +0200
    [tip:x86/microcode] x86/microcode/AMD: Free unneeded patch before  exit from update_cache() tip-bot for Shu Wang <tipbot@zytor.com> - 2017-07-25 16:00 +0200

csiph-web