lkml.org 
[lkml]   [2016]   [Apr]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.2.y-ckt 60/70] efi: Do variable name validation tests in utf8
    Date
    4.2.8-ckt8 -stable review patch.  If anyone has any objections, please let me know.

    ---8<------------------------------------------------------------

    From: Peter Jones <pjones@redhat.com>

    commit 3dcb1f55dfc7631695e69df4a0d589ce5274bd07 upstream.

    Actually translate from ucs2 to utf8 before doing the test, and then
    test against our other utf8 data, instead of fudging it.

    Signed-off-by: Peter Jones <pjones@redhat.com>
    Acked-by: Matthew Garrett <mjg59@coreos.com>
    Tested-by: Lee, Chun-Yi <jlee@suse.com>
    Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    drivers/firmware/efi/vars.c | 32 +++++++++++++++++++++-----------
    1 file changed, 21 insertions(+), 11 deletions(-)

    diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c
    index 70a0fb1..5c5fde3 100644
    --- a/drivers/firmware/efi/vars.c
    +++ b/drivers/firmware/efi/vars.c
    @@ -189,10 +189,19 @@ static const struct variable_validate variable_validate[] = {
    };

    bool
    -efivar_validate(efi_char16_t *var_name, u8 *data, unsigned long len)
    +efivar_validate(efi_char16_t *var_name, u8 *data, unsigned long data_size)
    {
    int i;
    - u16 *unicode_name = var_name;
    + unsigned long utf8_size;
    + u8 *utf8_name;
    +
    + utf8_size = ucs2_utf8size(var_name);
    + utf8_name = kmalloc(utf8_size + 1, GFP_KERNEL);
    + if (!utf8_name)
    + return false;
    +
    + ucs2_as_utf8(utf8_name, var_name, utf8_size);
    + utf8_name[utf8_size] = '\0';

    for (i = 0; variable_validate[i].validate != NULL; i++) {
    const char *name = variable_validate[i].name;
    @@ -200,28 +209,29 @@ efivar_validate(efi_char16_t *var_name, u8 *data, unsigned long len)

    for (match = 0; ; match++) {
    char c = name[match];
    - u16 u = unicode_name[match];
    -
    - /* All special variables are plain ascii */
    - if (u > 127)
    - return true;
    + char u = utf8_name[match];

    /* Wildcard in the matching name means we've matched */
    - if (c == '*')
    + if (c == '*') {
    + kfree(utf8_name);
    return variable_validate[i].validate(var_name,
    - match, data, len);
    + match, data, data_size);
    + }

    /* Case sensitive match */
    if (c != u)
    break;

    /* Reached the end of the string while matching */
    - if (!c)
    + if (!c) {
    + kfree(utf8_name);
    return variable_validate[i].validate(var_name,
    - match, data, len);
    + match, data, data_size);
    + }
    }
    }

    + kfree(utf8_name);
    return true;
    }
    EXPORT_SYMBOL_GPL(efivar_validate);
    --
    2.7.4
    \
     
     \ /
      Last update: 2016-04-12 23:21    [W:3.270 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site