Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp3555562pxb; Mon, 1 Mar 2021 13:13:13 -0800 (PST) X-Google-Smtp-Source: ABdhPJy0oDRKzyqiFnni+UXFLK6eBcW+U6Lvox6ipHyj1llzdpe2VzWeBGZd/DPIwSig9nBdZJ2Y X-Received: by 2002:a50:fd8b:: with SMTP id o11mr2974900edt.346.1614633193065; Mon, 01 Mar 2021 13:13:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614633193; cv=none; d=google.com; s=arc-20160816; b=oZCm2RGKqxzFitygAEVPKysFIChSQgvGanVaFihHQPecZhJxgbCfju6wZfgTEhlMd7 JsyvSC3mAp3B+wqyGd6Pw9OmIdPGAH8XzIFfz6YJoqjTfrca6Vh7XKXjfzmObfZVA5Ke 8HHJtmL8B5JbGl5BVGXH1P3ZPN0PfBuULqrpz0gho4iIuP4bMf9j0/gVX9B3hrlAAgE0 1Mg/a1Q670wQVfjxvutbaC/SLI9yhqCr4fVMn5L0yu03Ci0ah+QCjrrw+OT/+Kj3/afJ 9iZWayU8zOGJ9f4hBExRTCELMSlITxwj+J5zlwTGTxd1n/S7eYyaTl6xdrK/t3isWeCK a4Nw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=V2bfrQI0KbpRpNhFhH6a2PvrHAaUyYlyqXDENhuijoE=; b=rG6l2EyGeMtnypJwlOxRlFyV1oXmFqFT3YSKxO/mI2XXnacJCm0lvt6K9O4h7w/QEH e+Mci/1G0scCtVSRU4gJIoxpc9/iYuqW3KwNoys7Liji3+A5sFUDt7Fkrj30hxUJ/34V jSwaOITclxZUsAiRIrvFH/Nuxu7Xe0/gaJ3gkHavb9tpZl1HbJNRSC9vJRRa04K9pzfx SrHt9SmRbit470qpIGt3TLFyBEn+U/erq6PQBgBV7//M9NTA3lAzFDnmpYu3xT7KIxyE aad9Fhdj6L7zrXWwMrBIxtjZcT9UCrAFM4raDiDwdCYbC64H5OmuANcwQ827QX+7Yl8/ 2Mpg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=RxzJxWDY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a25si11869980ejd.541.2021.03.01.13.12.50; Mon, 01 Mar 2021 13:13:13 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=RxzJxWDY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244202AbhCAVJU (ORCPT + 99 others); Mon, 1 Mar 2021 16:09:20 -0500 Received: from mail.kernel.org ([198.145.29.99]:52650 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237853AbhCARNg (ORCPT ); Mon, 1 Mar 2021 12:13:36 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 1C06164E2E; Mon, 1 Mar 2021 16:43:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1614617034; bh=Ad3t3gJMbelKe31Xn8J0XbY217y5kq+DcvNwY1HVpdE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RxzJxWDY9Maa28xWRxHwppYzpY2HgBCWxdBcFDWCIX3D+n/4WDlmdqxkSzRhA4tna 5Dk/ksdHOJ5p1mISOCJZn4tPlTpAZpxLHS1bA92SPMMHkzwf/gPSc6IgoLg5V1NWER YWDmhHYsyfkcrkercAAuv877dgojp4Pq69NPHU+w= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Calvin Johnson , "Rafael J. Wysocki" , Sakari Ailus , Mika Westerberg , Andy Shevchenko Subject: [PATCH 4.19 179/247] ACPI: property: Fix fwnode string properties matching Date: Mon, 1 Mar 2021 17:13:19 +0100 Message-Id: <20210301161040.417266982@linuxfoundation.org> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210301161031.684018251@linuxfoundation.org> References: <20210301161031.684018251@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Rafael J. Wysocki commit e1e6bd2995ac0e1ad0c2a2d906a06f59ce2ed293 upstream. Property matching does not work for ACPI fwnodes if the value of the given property is not represented as a package in the _DSD package containing it. For example, the "compatible" property in the _DSD below Name (_DSD, Package () { ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), Package () { Package () {"compatible", "ethernet-phy-ieee802.3-c45"} } }) will not be found by fwnode_property_match_string(), because the ACPI code handling device properties does not regard the single value as a "list" in that case. Namely, fwnode_property_match_string() invoked to match a given string property value first calls fwnode_property_read_string_array() with the last two arguments equal to NULL and 0, respectively, in order to count the items in the value of the given property, with the assumption that this value may be an array. For ACPI fwnodes, that operation is carried out by acpi_node_prop_read() which calls acpi_data_prop_read() for this purpose. However, when the return (val) pointer is NULL, that function only looks for a property whose value is a package without checking the single-value case at all. To fix that, make acpi_data_prop_read() check the single-value case if its return pointer argument is NULL and modify acpi_data_prop_read_single() handling that case to attempt to read the value of the property if the return pointer is NULL and return 1 if that succeeds. Fixes: 3708184afc77 ("device property: Move FW type specific functionality to FW specific files") Reported-by: Calvin Johnson Cc: 4.13+ # 4.13+ Signed-off-by: Rafael J. Wysocki Reviewed-by: Sakari Ailus Reviewed-by: Mika Westerberg Reviewed-by: Andy Shevchenko Signed-off-by: Greg Kroah-Hartman --- drivers/acpi/property.c | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) --- a/drivers/acpi/property.c +++ b/drivers/acpi/property.c @@ -720,9 +720,6 @@ static int acpi_data_prop_read_single(co const union acpi_object *obj; int ret; - if (!val) - return -EINVAL; - if (proptype >= DEV_PROP_U8 && proptype <= DEV_PROP_U64) { ret = acpi_data_get_property(data, propname, ACPI_TYPE_INTEGER, &obj); if (ret) @@ -732,28 +729,43 @@ static int acpi_data_prop_read_single(co case DEV_PROP_U8: if (obj->integer.value > U8_MAX) return -EOVERFLOW; - *(u8 *)val = obj->integer.value; + + if (val) + *(u8 *)val = obj->integer.value; + break; case DEV_PROP_U16: if (obj->integer.value > U16_MAX) return -EOVERFLOW; - *(u16 *)val = obj->integer.value; + + if (val) + *(u16 *)val = obj->integer.value; + break; case DEV_PROP_U32: if (obj->integer.value > U32_MAX) return -EOVERFLOW; - *(u32 *)val = obj->integer.value; + + if (val) + *(u32 *)val = obj->integer.value; + break; default: - *(u64 *)val = obj->integer.value; + if (val) + *(u64 *)val = obj->integer.value; + break; } + + if (!val) + return 1; } else if (proptype == DEV_PROP_STRING) { ret = acpi_data_get_property(data, propname, ACPI_TYPE_STRING, &obj); if (ret) return ret; - *(char **)val = obj->string.pointer; + if (val) + *(char **)val = obj->string.pointer; return 1; } else { @@ -767,7 +779,7 @@ int acpi_dev_prop_read_single(struct acp { int ret; - if (!adev) + if (!adev || !val) return -EINVAL; ret = acpi_data_prop_read_single(&adev->data, propname, proptype, val); @@ -861,10 +873,20 @@ static int acpi_data_prop_read(const str const union acpi_object *items; int ret; - if (val && nval == 1) { + if (nval == 1 || !val) { ret = acpi_data_prop_read_single(data, propname, proptype, val); - if (ret >= 0) + /* + * The overflow error means that the property is there and it is + * single-value, but its type does not match, so return. + */ + if (ret >= 0 || ret == -EOVERFLOW) return ret; + + /* + * Reading this property as a single-value one failed, but its + * value may still be represented as one-element array, so + * continue. + */ } ret = acpi_data_get_property_array(data, propname, ACPI_TYPE_ANY, &obj);