On Wed, Jun 18, 2014 at 04:55:30PM +0200, Simone Gotti wrote: > 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 <simone.gotti@xxxxxxxxx> Applied with Jiang's reviewed-by to pci/misc for v3.17. I also added a stable tag for v3.14+. Thanks! > --- > 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 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-pci" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html