FAILED: patch "[PATCH] platform/x86: panasonic-laptop: Fix SINF array out of bounds" failed to apply to 5.4-stable tree
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.4.y
git checkout FETCH_HEAD
git cherry-pick -x f52e98d16e9bd7dd2b3aef8e38db5cbc9899d6a4
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024091345-sweep-flashback-a85d@gregkh' --subject-prefix 'PATCH 5.4.y' HEAD^..
Possible dependencies:
f52e98d16e9b ("platform/x86: panasonic-laptop: Fix SINF array out of bounds accesses") f1fba0860962 ("platform/x86: panasonic-laptop: remove redundant assignment of variable result") 25dd390c6206 ("platform/x86: panasonic-laptop: Add sysfs attributes for firmware brightness registers") 468f96bfa3a0 ("platform/x86: panasonic-laptop: Add support for battery charging threshold (eco mode)") ed83c9171829 ("platform/x86: panasonic-laptop: Resolve hotkey double trigger bug") e3a9afbbc309 ("platform/x86: panasonic-laptop: Add write support to mute")
008563513348 ("platform/x86: panasonic-laptop: Fix sticky key init bug")80373ad0edb5 ("platform/x86: panasonic-laptop: Fix naming of platform files for consistency with other modules") 0119fbc0215a ("platform/x86: panasonic-laptop: Split MODULE_AUTHOR() by one author per macro call") f1aaf914654a ("platform/x86: panasonic-laptop: Replace ACPI prints with pr_*() macros") d5a81d8e864b ("platform/x86: panasonic-laptop: Add support for optical driver power in Y and W series")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From f52e98d16e9bd7dd2b3aef8e38db5cbc9899d6a4 Mon Sep 17 00:00:00 2001
From: Hans de Goede <[email protected]>
Date: Mon, 9 Sep 2024 13:32:25 +0200
Subject: [PATCH] platform/x86: panasonic-laptop: Fix SINF array out of bounds
accesses
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The panasonic laptop code in various places uses the SINF array with index values of 0 - SINF_CUR_BRIGHT(0x0d) without checking that the SINF array is big enough.
Not all panasonic laptops have this many SINF array entries, for example the Toughbook CF-18 model only has 10 SINF array entries. So it only supports the AC+DC brightness entries and mute.
Check that the SINF array has a minimum size which covers all AC+DC brightness entries and refuse to load if the SINF array is smaller.
For higher SINF indexes hide the sysfs attributes when the SINF array does not contain an entry for that attribute, avoiding show()/store() accessing the array out of bounds and add bounds checking to the probe() and resume() code accessing these.
drivers/platform/x86/panasonic-laptop.c +39 -10
@@ -773,6 +773,24 @@ static DEVICE_ATTR_RW(dc_brightness);static DEVICE_ATTR_RW (current_brightness);static DEVICE_ATTR_RW (cdpower); +static umode_t pcc_sysfs_is_visible (struct kobject *kobj,struct attribute *attr,int idx) +{ +struct device *dev =kobj_to_dev (kobj); +struct acpi_device *acpi =to_acpi_device (dev); +struct pcc_acpi *pcc =acpi_driver_data (acpi); + +if (attr == &dev_attr_mute.attr) +return (pcc->num_sifr >SINF_MUTE ) ? attr->mode :0 ; + +if (attr == &dev_attr_eco_mode.attr) +return (pcc->num_sifr >SINF_ECO_MODE ) ? attr->mode :0 ; + +if (attr == &dev_attr_current_brightness.attr) +return (pcc->num_sifr >SINF_CUR_BRIGHT ) ? attr->mode :0 ; + +return attr->mode; +} +static struct attribute *pcc_sysfs_entries[] = { &dev_attr_numbatt.attr, &dev_attr_lcdtype.attr,
@@ -787,8 +805,9 @@ static struct attribute *pcc_sysfs_entries[] = { };static const struct attribute_group pcc_attr_group = { - .name =NULL ,/* put in device directory */ - .attrs = pcc_sysfs_entries, + .name =NULL ,/* put in device directory */ + .attrs = pcc_sysfs_entries, + .is_visible = pcc_sysfs_is_visible, };
@@ -941,12 +960,15 @@ static int acpi_pcc_hotkey_resume(struct device *dev)if (!pcc)return -EINVAL ; -acpi_pcc_write_sset (pcc,SINF_MUTE , pcc->mute); -acpi_pcc_write_sset (pcc,SINF_ECO_MODE , pcc->eco_mode); +if (pcc->num_sifr >SINF_MUTE ) +acpi_pcc_write_sset (pcc,SINF_MUTE , pcc->mute); +if (pcc->num_sifr >SINF_ECO_MODE ) +acpi_pcc_write_sset (pcc,SINF_ECO_MODE , pcc->eco_mode);acpi_pcc_write_sset (pcc,SINF_STICKY_KEY , pcc->sticky_key);acpi_pcc_write_sset (pcc,SINF_AC_CUR_BRIGHT , pcc->ac_brightness);acpi_pcc_write_sset (pcc,SINF_DC_CUR_BRIGHT , pcc->dc_brightness); -acpi_pcc_write_sset (pcc,SINF_CUR_BRIGHT , pcc->current_brightness); +if (pcc->num_sifr >SINF_CUR_BRIGHT ) +acpi_pcc_write_sset (pcc,SINF_CUR_BRIGHT , pcc->current_brightness);return 0 ; }
@@ -963,8 +985,12 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device) num_sifr =acpi_pcc_get_sqty (device); -if (num_sifr <0 || num_sifr >255 ) { -pr_err ("num_sifr out of range" ); +/* +* pcc->sinf is expected to at least have the AC+DC brightness entries. +* Accesses to higher SINF entries are checked against num_sifr. +*/ +if (num_sifr <=SINF_DC_CUR_BRIGHT || num_sifr >255 ) { +pr_err ("num_sifr %d out of range %d - 255\n" , num_sifr,SINF_DC_CUR_BRIGHT +1 );return -ENODEV ; }
@@ -1020,11 +1046,14 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device)acpi_pcc_write_sset (pcc,SINF_STICKY_KEY ,0 ); pcc->sticky_key =0 ; - pcc->eco_mode = pcc->sinf[SINF_ECO_MODE ]; - pcc->mute = pcc->sinf[SINF_MUTE ]; pcc->ac_brightness = pcc->sinf[SINF_AC_CUR_BRIGHT ]; pcc->dc_brightness = pcc->sinf[SINF_DC_CUR_BRIGHT ]; - pcc->current_brightness = pcc->sinf[SINF_CUR_BRIGHT ]; +if (pcc->num_sifr >SINF_MUTE ) + pcc->mute = pcc->sinf[SINF_MUTE ]; +if (pcc->num_sifr >SINF_ECO_MODE ) + pcc->eco_mode = pcc->sinf[SINF_ECO_MODE ]; +if (pcc->num_sifr >SINF_CUR_BRIGHT ) + pcc->current_brightness = pcc->sinf[SINF_CUR_BRIGHT ];/* add sysfs attributes */ result =sysfs_create_group (&device->dev.kobj, &pcc_attr_group);