(Cc'ing some other folks that might be interested)

On Fri, 2012-10-19 at 15:16 +0800, Jeremy Kerr wrote:
> At present, the handling of GUIDs in efivar file names isn't consistent.
> We use GUID_LEN in some places, and 38 in others (GUID_LEN plus
> separator), and implicitly use the presence of the trailing NUL.
> 
> This change removes the trailing NUL from GUID_LEN, so that we're
> explicitly adding it when required. We also replace magic numbers
> with GUID_LEN, and clarify the comments where appropriate.
> 
> We also fix the allocation size in efivar_create_sysfs_entry, where
> we're allocating one byte too much, due to counting the trailing NUL
> twice - once when calculating short_name_size, and once in the kzalloc.
> 
> Signed-off-by: Jeremy Kerr <[email protected]>
> 
> ---
>  drivers/firmware/efivars.c |   29 +++++++++++++++++++++--------
>  1 file changed, 21 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
> index a86eb55..ce0d6fa 100644
> --- a/drivers/firmware/efivars.c
> +++ b/drivers/firmware/efivars.c
> @@ -95,7 +95,12 @@ MODULE_LICENSE("GPL");
>  MODULE_VERSION(EFIVARS_VERSION);
>  
>  #define DUMP_NAME_LEN 52
> -#define GUID_LEN 37
> +
> +/*
> + * Length of a GUID string (strlen("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"))
> + * not including trailing NUL
> + */
> +#define GUID_LEN 36
>  
>  /*
>   * The maximum size of VariableName + Data = 1024
> @@ -876,7 +881,9 @@ static int efivarfs_create(struct inode *dir, struct 
> dentry *dentry,
>       struct efivar_entry *var;
>       int namelen, i = 0, err = 0;
>  
> -     if (dentry->d_name.len < 38)
> +     /* We need a GUID, plus at least one letter for the variable name,
> +      * plus the '-' separator */
> +     if (dentry->d_name.len < GUID_LEN + 2)
>               return -EINVAL;
>  
>       inode = efivarfs_get_inode(dir->i_sb, dir, mode, 0);
> @@ -889,7 +896,8 @@ static int efivarfs_create(struct inode *dir, struct 
> dentry *dentry,
>               goto out;
>       }
>  
> -     namelen = dentry->d_name.len - GUID_LEN;
> +     /* length of the variable name itself: remove GUID and separator */
> +     namelen = dentry->d_name.len - GUID_LEN - 1;
>  
>       efivarfs_hex_to_guid(dentry->d_name.name + namelen + 1,
>                       &var->var.VendorGuid);
> @@ -983,8 +991,8 @@ int efivarfs_fill_super(struct super_block *sb, void 
> *data, int silent)
>  
>               len = utf16_strlen(entry->var.VariableName);
>  
> -             /* GUID plus trailing NULL */
> -             name = kmalloc(len + 38, GFP_ATOMIC);
> +             /* name, plus '-', plus GUID, plus NUL*/
> +             name = kmalloc(len + 1 + GUID_LEN + 1, GFP_ATOMIC);
>               if (!name)
>                       goto fail;
>  
> @@ -995,7 +1003,7 @@ int efivarfs_fill_super(struct super_block *sb, void 
> *data, int silent)
>  
>               efi_guid_unparse(&entry->var.VendorGuid, name + len + 1);
>  
> -             name[len+GUID_LEN] = '\0';
> +             name[len+GUID_LEN+1] = '\0';
>  
>               inode = efivarfs_get_inode(efivarfs_sb, root->d_inode,
>                                         S_IFREG | 0644, 0);
> @@ -1424,11 +1432,16 @@ efivar_create_sysfs_entry(struct efivars *efivars,
>                         efi_char16_t *variable_name,
>                         efi_guid_t *vendor_guid)
>  {
> -     int i, short_name_size = variable_name_size / sizeof(efi_char16_t) + 38;
> +     int i, short_name_size;
>       char *short_name;
>       struct efivar_entry *new_efivar;
>  
> -     short_name = kzalloc(short_name_size + 1, GFP_KERNEL);
> +     /* Length of the variable bytes in ASCII, plus the '-' separator,
> +      * plus the GUID, plus trailing NUL */
> +     short_name_size = variable_name_size / sizeof(efi_char_16_t)
> +                             + 1 + GUID_LEN + 1;
> +
> +     short_name = kzalloc(short_name_size, GFP_KERNEL);
>       new_efivar = kzalloc(sizeof(struct efivar_entry), GFP_KERNEL);
>  
>       if (!short_name || !new_efivar)  {



--
To unsubscribe from this list: send the line "unsubscribe linux-efi" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to