lkml.org 
[lkml]   [2019]   [Dec]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 208/209] platform/x86: hp-wmi: Fix ACPI errors caused by passing 0 as input size
    Date
    From: Hans de Goede <hdegoede@redhat.com>

    commit f3e4f3fc8ee9729c4b1b27a478c68b713df53c0c upstream.

    The AML code implementing the WMI methods creates a variable length
    field to hold the input data we pass like this:

    CreateDWordField (Arg1, 0x0C, DSZI)
    Local5 = DSZI /* \HWMC.DSZI */
    CreateField (Arg1, 0x80, (Local5 * 0x08), DAIN)

    If we pass 0 as bios_args.datasize argument then (Local5 * 0x08)
    is 0 which results in these errors:

    [ 71.973305] ACPI BIOS Error (bug): Attempt to CreateField of length zero (20190816/dsopcode-133)
    [ 71.973332] ACPI Error: Aborting method \HWMC due to previous error (AE_AML_OPERAND_VALUE) (20190816/psparse-529)
    [ 71.973413] ACPI Error: Aborting method \_SB.WMID.WMAA due to previous error (AE_AML_OPERAND_VALUE) (20190816/psparse-529)

    And in our HPWMI_WIRELESS2_QUERY calls always failing. for read commands
    like HPWMI_WIRELESS2_QUERY the DSZI value is not used / checked, except for
    read commands where extra input is needed to specify exactly what to read.

    So for HPWMI_WIRELESS2_QUERY we can safely pass the size of the expected
    output as insize to hp_wmi_perform_query(), as we are already doing for all
    other HPWMI_READ commands we send. Doing so fixes these errors.

    Cc: stable@vger.kernel.org
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=197007
    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=201981
    BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1520703
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/platform/x86/hp-wmi.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    --- a/drivers/platform/x86/hp-wmi.c
    +++ b/drivers/platform/x86/hp-wmi.c
    @@ -393,7 +393,7 @@ static int hp_wmi_rfkill2_refresh(void)
    int err, i;

    err = hp_wmi_perform_query(HPWMI_WIRELESS2_QUERY, HPWMI_READ, &state,
    - 0, sizeof(state));
    + sizeof(state), sizeof(state));
    if (err)
    return err;

    @@ -790,7 +790,7 @@ static int __init hp_wmi_rfkill2_setup(s
    int err, i;

    err = hp_wmi_perform_query(HPWMI_WIRELESS2_QUERY, HPWMI_READ, &state,
    - 0, sizeof(state));
    + sizeof(state), sizeof(state));
    if (err)
    return err < 0 ? err : -EINVAL;


    \
     
     \ /
      Last update: 2019-12-04 19:20    [W:7.227 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site