From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wi0-f182.google.com ([209.85.212.182]:36929 "EHLO mail-wi0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751027AbaFROzp (ORCPT ); Wed, 18 Jun 2014 10:55:45 -0400 From: Simone Gotti To: linux-pci@vger.kernel.org Cc: linux-acpi@vger.kernel.org, Jiang Liu , Narendra_K@Dell.com Subject: [PATCH 1/1] ACPI / PCI: Fix "Operation not permitted" error reading sysfs acpi_index and label files. Date: Wed, 18 Jun 2014 16:55:30 +0200 Message-Id: <1403103330-17874-1-git-send-email-simone.gotti@gmail.com> In-Reply-To: <1403103077-17589-1-git-send-email-simone.gotti@gmail.com> References: <1403103077-17589-1-git-send-email-simone.gotti@gmail.com> Sender: linux-pci-owner@vger.kernel.org List-ID: If the _DSM method returns an unicode string then the acpi type is not ACPI_TYPE_STRING but ACPI_TYPE_BUFFER. Before commit 1d0fcef732832432aee47cb75bf4a2cb3107be64 the dsm_get_label function wasn't checking the second element type and it was correctly working only with ACPI_TYPE_BUFFER as the call to dsm_label_utf16s_to_utf8s will return bad encoding for an ascii string. Also fix dsm_label_utf16s_to_utf8s to use acpi_object->buffer instead of acpi_object->string. This fixes changed onboard interfaces names generated by udev net_id internal as reading from the acpi_index file returned "Operation not permitted" error. Signed-off-by: Simone Gotti --- drivers/pci/pci-label.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/pci/pci-label.c b/drivers/pci/pci-label.c index a3fbe20..2ab1b47 100644 --- a/drivers/pci/pci-label.c +++ b/drivers/pci/pci-label.c @@ -161,8 +161,8 @@ enum acpi_attr_enum { static void dsm_label_utf16s_to_utf8s(union acpi_object *obj, char *buf) { int len; - len = utf16s_to_utf8s((const wchar_t *)obj->string.pointer, - obj->string.length, + len = utf16s_to_utf8s((const wchar_t *)obj->buffer.pointer, + obj->buffer.length, UTF16_LITTLE_ENDIAN, buf, PAGE_SIZE); buf[len] = '\n'; @@ -187,16 +187,22 @@ static int dsm_get_label(struct device *dev, char *buf, tmp = obj->package.elements; if (obj->type == ACPI_TYPE_PACKAGE && obj->package.count == 2 && tmp[0].type == ACPI_TYPE_INTEGER && - tmp[1].type == ACPI_TYPE_STRING) { + (tmp[1].type == ACPI_TYPE_STRING || + tmp[1].type == ACPI_TYPE_BUFFER)) { /* * The second string element is optional even when * this _DSM is implemented; when not implemented, * this entry must return a null string. */ - if (attr == ACPI_ATTR_INDEX_SHOW) + if (attr == ACPI_ATTR_INDEX_SHOW) { scnprintf(buf, PAGE_SIZE, "%llu\n", tmp->integer.value); - else if (attr == ACPI_ATTR_LABEL_SHOW) - dsm_label_utf16s_to_utf8s(tmp + 1, buf); + } else if (attr == ACPI_ATTR_LABEL_SHOW) { + if (tmp[1].type == ACPI_TYPE_STRING) + scnprintf(buf, PAGE_SIZE, "%s\n", + tmp[1].string.pointer); + else if (tmp[1].type == ACPI_TYPE_BUFFER) + dsm_label_utf16s_to_utf8s(tmp + 1, buf); + } len = strlen(buf) > 0 ? strlen(buf) : -1; } -- 2.0.0