aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Fleming <matt@codeblueprint.co.uk>2016-05-06 17:39:29 -0400
committerIngo Molnar <mingo@kernel.org>2016-05-07 01:06:13 -0400
commitfb7a84cac03541f4da18dfa25b3f4767d4efc6fc (patch)
treeb239ff6d7ddc4c683471909309796616f38d2133
parent2e121d711a51f91e792595a05cf9ef6963cb8464 (diff)
efi/capsule: Move 'capsule' to the stack in efi_capsule_supported()
Dan Carpenter reports that passing the address of the pointer to the kmalloc()'d memory for 'capsule' is dangerous: "drivers/firmware/efi/capsule.c:109 efi_capsule_supported() warn: did you mean to pass the address of 'capsule' 108 109 status = efi.query_capsule_caps(&capsule, 1, &max_size, reset); ^^^^^^^^ If we modify capsule inside this function call then at the end of the function we aren't freeing the original pointer that we allocated." Ard Biesheuvel noted that we don't even need to call kmalloc() since the object we allocate isn't very big and doesn't need to persist after the function returns. Place 'capsule' on the stack instead. Suggested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reported-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk> Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Bryan O'Donoghue <pure.logic@nexus-software.ie> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Kweh Hock Leong <hock.leong.kweh@intel.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: joeyli <jlee@suse.com> Cc: linux-efi@vger.kernel.org Link: http://lkml.kernel.org/r/1462570771-13324-4-git-send-email-matt@codeblueprint.co.uk Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--drivers/firmware/efi/capsule.c29
1 files changed, 11 insertions, 18 deletions
diff --git a/drivers/firmware/efi/capsule.c b/drivers/firmware/efi/capsule.c
index e530540f368c..53b9fd2293ee 100644
--- a/drivers/firmware/efi/capsule.c
+++ b/drivers/firmware/efi/capsule.c
@@ -86,33 +86,26 @@ bool efi_capsule_pending(int *reset_type)
86 */ 86 */
87int efi_capsule_supported(efi_guid_t guid, u32 flags, size_t size, int *reset) 87int efi_capsule_supported(efi_guid_t guid, u32 flags, size_t size, int *reset)
88{ 88{
89 efi_capsule_header_t *capsule; 89 efi_capsule_header_t capsule;
90 efi_capsule_header_t *cap_list[] = { &capsule };
90 efi_status_t status; 91 efi_status_t status;
91 u64 max_size; 92 u64 max_size;
92 int rv = 0;
93 93
94 if (flags & ~EFI_CAPSULE_SUPPORTED_FLAG_MASK) 94 if (flags & ~EFI_CAPSULE_SUPPORTED_FLAG_MASK)
95 return -EINVAL; 95 return -EINVAL;
96 96
97 capsule = kmalloc(sizeof(*capsule), GFP_KERNEL); 97 capsule.headersize = capsule.imagesize = sizeof(capsule);
98 if (!capsule) 98 memcpy(&capsule.guid, &guid, sizeof(efi_guid_t));
99 return -ENOMEM; 99 capsule.flags = flags;
100
101 capsule->headersize = capsule->imagesize = sizeof(*capsule);
102 memcpy(&capsule->guid, &guid, sizeof(efi_guid_t));
103 capsule->flags = flags;
104 100
105 status = efi.query_capsule_caps(&capsule, 1, &max_size, reset); 101 status = efi.query_capsule_caps(cap_list, 1, &max_size, reset);
106 if (status != EFI_SUCCESS) { 102 if (status != EFI_SUCCESS)
107 rv = efi_status_to_err(status); 103 return efi_status_to_err(status);
108 goto out;
109 }
110 104
111 if (size > max_size) 105 if (size > max_size)
112 rv = -ENOSPC; 106 return -ENOSPC;
113out: 107
114 kfree(capsule); 108 return 0;
115 return rv;
116} 109}
117EXPORT_SYMBOL_GPL(efi_capsule_supported); 110EXPORT_SYMBOL_GPL(efi_capsule_supported);
118 111