From: joeyli <jlee-IBi9RG/b67k@public.gmane.org>
To: Matt Fleming <matt-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org>
Cc: linux-efi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Michael Schroeder <mls-IBi9RG/b67k@public.gmane.org>,
Josh Boyer <jwboyer-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
Peter Jones <pjones-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
Matthew Garrett <mjg59-1xO5oi07KQx4cg9Nei1l7Q@public.gmane.org>,
Frederic Crozat <fcrozat-IBi9RG/b67k@public.gmane.org>
Subject: Re: [PATCH] efivarfs: fix abnormal GUID in variable name by using strcpy to replace null with dash
Date: Thu, 07 Mar 2013 18:34:00 +0800 [thread overview]
Message-ID: <1362652440.28562.26.camel@linux-s257.site> (raw)
In-Reply-To: <1362568750.15011.24.camel-ZqTwcBeJ+wsBof6jY8KHXm7IUlhRatedral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
於 三,2013-03-06 於 11:19 +0000,Matt Fleming 提到:
> On Wed, 2013-03-06 at 15:34 +0800, joeyli wrote:
...
> > +static unsigned long variable_name_length(efi_char16_t *variable_name)
> > +{
> > + unsigned long len;
> > + efi_char16_t c;
> > +
> > + len = 2;
> > + do {
> > + c = variable_name[len / sizeof(c) - 1];
> > + if (c)
> > + len += sizeof(c);
> > + } while (c);
> > +
> > + return len;
> > +}
> > +
> > int register_efivars(struct efivars *efivars,
> > const struct efivar_operations *ops,
> > struct kobject *parent_kobj)
> > @@ -1944,7 +1959,7 @@ int register_efivars(struct efivars *efivars,
> > switch (status) {
> > case EFI_SUCCESS:
> > efivar_create_sysfs_entry(efivars,
> > - variable_name_size,
> > + variable_name_length(variable_name),
> > variable_name,
> > &vendor_guid);
> > break;
> >
>
> Hmm.. the reason I didn't implement the patch this way is because I do
> think it's important to make sure we don't go out of bounds looking for
> the terminating NULL, i.e. you need a 'len < variable_name_size' check
> somewhere.
>
> Care to update and resend your patch, ensuring we don't inspect more
> than variable_name_size characters?
The VariableNameSize is not reliable when EFI_SUCCESS is returned
because UEFI 2.3.1 spec only mention VariableNameSize should updated
when EFI_BUFFER_TOO_SMALL is returned. And, the 1024 bytes of buffer is
from old UEFI spec. There doesn't have any size condition of variable
data or variable name in 2.3.1 spec.
I modified the patch to grab VariableNameSize when EFI_BUFFER_TOO_SMALL,
the behavior like what we do in efivarfs_file_read().
This patch works on a normal UEFI machine, we will test it on HP z220. I
will send out it formally after test success.
Thanks a lot!
Joey Lee
>From 1f88fab2bdf07da51975d31c20ee66415c51e14e Mon Sep 17 00:00:00 2001
From: Lee, Chun-Yi <jlee-IBi9RG/b67k@public.gmane.org>
Date: Thu, 7 Mar 2013 18:14:25 +0800
Subject: [PATCH] efivars: Sanitise length of variable name for register
On HP z220 system (firmware version 1.54), some EFI variables have
incorrectly named :
/sys/firmware/efi/vars/dbxDefault-pport8be4df61-93ca-11d2-aa0d-00e098032b8c
/sys/firmware/efi/vars/KEKDefault-pport8be4df61-93ca-11d2-aa0d-00e098032b8c
/sys/firmware/efi/vars/SecureBoot-pport8be4df61-93ca-11d2-aa0d-00e098032b8c
/sys/firmware/efi/vars/SetupMode-Information8be4df61-93ca-11d2-aa0d-00e098032b8c
Matt Fleming and Lingzhu Xiang pointed out the reason is the variable_name_size
longer then the name string in variable_name when we feed them to
efivar_create_sysfs_entry().
Per UEFI 2.3.1 spec, the VariableNameSize is updated to reflect the size of buffer
that needed by VariableName when EFI_BUFFER_TOO_SMALL is returned. This behavior
is the same with the DataSize for GetVariable().
This patch do the same thing like efivarfs_file_read(), it feed a zero
VariableNameSize to GetNextVariableName() for grab the variable name size from
UEFI BIOS. When VariableNameSize larger then the buffer size of variable name, we
will reallocate more buffer to handle it.
The default buffer size is 1024, this number is from old UEFI spec.
In addition, we calculate the length of VariableName by using utf16_strsize()
but not direct feed VariableNameSize to efivar_create_sysfs_entry() because the
value of VariableNameSize is not reliable when EFI_SUCCESS is returned. UEFI spec
only claim the VariableNameSize updated on EFI_BUFFER_TOO_SMALL but not
on EFI_SUCCESS.
Reported-by: Frederic Crozat <fcrozat-IBi9RG/b67k@public.gmane.org>
Cc: Matt Fleming <matt-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org>
Cc: Matthew Garrett <mjg59-1xO5oi07KQx4cg9Nei1l7Q@public.gmane.org>
Cc: Josh Boyer <jwboyer-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: Michael Schroeder <mls-IBi9RG/b67k@public.gmane.org>
Cc: Lee, Chun-Yi <jlee-IBi9RG/b67k@public.gmane.org>
Cc: Lingzhu Xiang <lxiang-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Signed-off-by: Lee, Chun-Yi <jlee-IBi9RG/b67k@public.gmane.org>
---
drivers/firmware/efivars.c | 35 +++++++++++++++++++++++++++--------
1 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index f5596db..ff61f91 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -1688,10 +1688,11 @@ int register_efivars(struct efivars *efivars,
efi_status_t status = EFI_NOT_FOUND;
efi_guid_t vendor_guid;
efi_char16_t *variable_name;
- unsigned long variable_name_size = 1024;
+ unsigned long variable_name_size;
+ unsigned long variable_name_buff_size = 1024;
int error = 0;
- variable_name = kzalloc(variable_name_size, GFP_KERNEL);
+ variable_name = kzalloc(variable_name_buff_size, GFP_KERNEL);
if (!variable_name) {
printk(KERN_ERR "efivars: Memory allocation failed.\n");
return -ENOMEM;
@@ -1722,17 +1723,35 @@ int register_efivars(struct efivars *efivars,
*/
do {
- variable_name_size = 1024;
+ variable_name_size = 0;
status = ops->get_next_variable(&variable_name_size,
variable_name,
&vendor_guid);
switch (status) {
- case EFI_SUCCESS:
- efivar_create_sysfs_entry(efivars,
- variable_name_size,
- variable_name,
- &vendor_guid);
+ case EFI_BUFFER_TOO_SMALL:
+ if (variable_name_size < 2) {
+ /* set variable_name_size to buffer size when it's too small */
+ variable_name_size = variable_name_buff_size;
+ } else if (variable_name_size > variable_name_buff_size) {
+ /* re-allocate more buffer when size doesn't enough */
+ kfree(variable_name);
+ variable_name = kzalloc(variable_name_size, GFP_KERNEL);
+ if (!variable_name) {
+ printk(KERN_ERR "efivars: Memory allocation failed.\n");
+ return -ENOMEM;
+ }
+ variable_name_buff_size = variable_name_size;
+ }
+ status = ops->get_next_variable(&variable_name_size,
+ variable_name,
+ &vendor_guid);
+ variable_name_size = utf16_strsize(variable_name, variable_name_buff_size)+2;
+ if (status == EFI_SUCCESS)
+ efivar_create_sysfs_entry(efivars,
+ variable_name_size,
+ variable_name,
+ &vendor_guid);
break;
case EFI_NOT_FOUND:
break;
--
1.6.4.2
next prev parent reply other threads:[~2013-03-07 10:34 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-01 3:20 [PATCH] efivarfs: fix abnormal GUID in variable name by using strcpy to replace null with dash Lee, Chun-Yi
2013-03-01 9:31 ` Lingzhu Xiang
[not found] ` <5130757F.4090702-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2013-03-01 14:49 ` joeyli
[not found] ` <1362108018-13117-1-git-send-email-jlee-IBi9RG/b67k@public.gmane.org>
2013-03-01 15:17 ` Matt Fleming
[not found] ` <1362151068.2842.440.camel-ZqTwcBeJ+wsBof6jY8KHXm7IUlhRatedral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-03-01 16:31 ` Matt Fleming
[not found] ` <1362155493.2842.446.camel-ZqTwcBeJ+wsBof6jY8KHXm7IUlhRatedral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-03-01 23:41 ` joeyli
[not found] ` <1362181299.23932.168.camel-ONCj+Eqt86TasUa73XJKwA@public.gmane.org>
2013-03-06 7:34 ` joeyli
[not found] ` <1362555258.23932.573.camel-ONCj+Eqt86TasUa73XJKwA@public.gmane.org>
2013-03-06 7:39 ` joeyli
2013-03-06 9:20 ` Lingzhu Xiang
[not found] ` <51370A51.1050505-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2013-03-06 11:21 ` Matt Fleming
2013-03-07 8:03 ` joeyli
2013-03-06 11:19 ` Matt Fleming
[not found] ` <1362568750.15011.24.camel-ZqTwcBeJ+wsBof6jY8KHXm7IUlhRatedral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-03-06 11:58 ` Frederic Crozat
[not found] ` <1362571097.7004.66.camel-+GqLY1utCe+GwbuyVWskRBLdbW0B08c60E9HWUfgJXw@public.gmane.org>
2013-03-06 12:36 ` Matt Fleming
[not found] ` <1362573401.15011.48.camel-ZqTwcBeJ+wsBof6jY8KHXm7IUlhRatedral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-03-06 13:30 ` Frederic Crozat
[not found] ` <1362576633.7004.69.camel-+GqLY1utCe+GwbuyVWskRBLdbW0B08c60E9HWUfgJXw@public.gmane.org>
2013-03-06 13:38 ` Matt Fleming
2013-03-07 10:34 ` joeyli [this message]
[not found] ` <1362652440.28562.26.camel-ONCj+Eqt86TasUa73XJKwA@public.gmane.org>
2013-03-07 11:39 ` Matt Fleming
[not found] ` <1362656348.15011.166.camel-ZqTwcBeJ+wsBof6jY8KHXm7IUlhRatedral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-03-07 13:57 ` Matt Fleming
[not found] ` <1362664663.15011.194.camel-ZqTwcBeJ+wsBof6jY8KHXm7IUlhRatedral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-03-07 14:03 ` joeyli
2013-03-11 13:17 ` joeyli
[not found] ` <1363007873.13754.44.camel-ONCj+Eqt86TasUa73XJKwA@public.gmane.org>
2013-03-18 15:29 ` Matt Fleming
2013-03-08 6:37 ` joeyli
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1362652440.28562.26.camel@linux-s257.site \
--to=jlee-ibi9rg/b67k@public.gmane.org \
--cc=fcrozat-IBi9RG/b67k@public.gmane.org \
--cc=jwboyer-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=linux-efi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=matt-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org \
--cc=mjg59-1xO5oi07KQx4cg9Nei1l7Q@public.gmane.org \
--cc=mls-IBi9RG/b67k@public.gmane.org \
--cc=pjones-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).