提交 fb7a84ca 编写于 作者: M Matt Fleming 提交者: Ingo Molnar

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: NArd Biesheuvel <ard.biesheuvel@linaro.org>
Reported-by: NDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: NMatt Fleming <matt@codeblueprint.co.uk>
Acked-by: NArd 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.ukSigned-off-by: NIngo Molnar <mingo@kernel.org>
上级 2e121d71
...@@ -86,33 +86,26 @@ bool efi_capsule_pending(int *reset_type) ...@@ -86,33 +86,26 @@ bool efi_capsule_pending(int *reset_type)
*/ */
int efi_capsule_supported(efi_guid_t guid, u32 flags, size_t size, int *reset) int efi_capsule_supported(efi_guid_t guid, u32 flags, size_t size, int *reset)
{ {
efi_capsule_header_t *capsule; efi_capsule_header_t capsule;
efi_capsule_header_t *cap_list[] = { &capsule };
efi_status_t status; efi_status_t status;
u64 max_size; u64 max_size;
int rv = 0;
if (flags & ~EFI_CAPSULE_SUPPORTED_FLAG_MASK) if (flags & ~EFI_CAPSULE_SUPPORTED_FLAG_MASK)
return -EINVAL; return -EINVAL;
capsule = kmalloc(sizeof(*capsule), GFP_KERNEL); capsule.headersize = capsule.imagesize = sizeof(capsule);
if (!capsule) memcpy(&capsule.guid, &guid, sizeof(efi_guid_t));
return -ENOMEM; capsule.flags = flags;
capsule->headersize = capsule->imagesize = sizeof(*capsule);
memcpy(&capsule->guid, &guid, sizeof(efi_guid_t));
capsule->flags = flags;
status = efi.query_capsule_caps(&capsule, 1, &max_size, reset); status = efi.query_capsule_caps(cap_list, 1, &max_size, reset);
if (status != EFI_SUCCESS) { if (status != EFI_SUCCESS)
rv = efi_status_to_err(status); return efi_status_to_err(status);
goto out;
}
if (size > max_size) if (size > max_size)
rv = -ENOSPC; return -ENOSPC;
out:
kfree(capsule); return 0;
return rv;
} }
EXPORT_SYMBOL_GPL(efi_capsule_supported); EXPORT_SYMBOL_GPL(efi_capsule_supported);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册