Skip to content

Commit e729dbe

Browse files
committed
Merge tag 'acpi-5.18-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull more ACPI updates from Rafael Wysocki: "These are fixes and cleanup on top of the previously merged ACPI material. Specifics: - Avoid out-of-bounds access when parsing _CPC data (Rafael Wysocki) - Change default error code and clean up debug messages in ACPI CPPC probe (Rafael Wysocki) - Replace usage of found with dedicated list iterator variable in the ACPI IPMI driver (Jakob Koschel) - Clean up variable name confusion in APEI (Jakob Koschel) - Make LAPIC_ADDR_OVR address readable in a message parsed during MADT parsing (Vasant Hegde)" * tag 'acpi-5.18-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: ACPI: CPPC: Change default error code and clean up debug messages in probe ACPI: CPPC: Avoid out of bounds access when parsing _CPC data ACPI: tables: Make LAPIC_ADDR_OVR address readable in message ACPI: IPMI: replace usage of found with dedicated list iterator variable ACPI, APEI: Use the correct variable for sizeof()
2 parents b4a5ea0 + 4a13e55 commit e729dbe

File tree

4 files changed

+41
-36
lines changed

4 files changed

+41
-36
lines changed

drivers/acpi/acpi_ipmi.c

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -353,29 +353,27 @@ static void ipmi_flush_tx_msg(struct acpi_ipmi_device *ipmi)
353353
static void ipmi_cancel_tx_msg(struct acpi_ipmi_device *ipmi,
354354
struct acpi_ipmi_msg *msg)
355355
{
356-
struct acpi_ipmi_msg *tx_msg, *temp;
357-
bool msg_found = false;
356+
struct acpi_ipmi_msg *tx_msg = NULL, *iter, *temp;
358357
unsigned long flags;
359358

360359
spin_lock_irqsave(&ipmi->tx_msg_lock, flags);
361-
list_for_each_entry_safe(tx_msg, temp, &ipmi->tx_msg_list, head) {
362-
if (msg == tx_msg) {
363-
msg_found = true;
364-
list_del(&tx_msg->head);
360+
list_for_each_entry_safe(iter, temp, &ipmi->tx_msg_list, head) {
361+
if (msg == iter) {
362+
tx_msg = iter;
363+
list_del(&iter->head);
365364
break;
366365
}
367366
}
368367
spin_unlock_irqrestore(&ipmi->tx_msg_lock, flags);
369368

370-
if (msg_found)
369+
if (tx_msg)
371370
acpi_ipmi_msg_put(tx_msg);
372371
}
373372

374373
static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)
375374
{
376375
struct acpi_ipmi_device *ipmi_device = user_msg_data;
377-
bool msg_found = false;
378-
struct acpi_ipmi_msg *tx_msg, *temp;
376+
struct acpi_ipmi_msg *tx_msg = NULL, *iter, *temp;
379377
struct device *dev = ipmi_device->dev;
380378
unsigned long flags;
381379

@@ -387,16 +385,16 @@ static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)
387385
}
388386

389387
spin_lock_irqsave(&ipmi_device->tx_msg_lock, flags);
390-
list_for_each_entry_safe(tx_msg, temp, &ipmi_device->tx_msg_list, head) {
391-
if (msg->msgid == tx_msg->tx_msgid) {
392-
msg_found = true;
393-
list_del(&tx_msg->head);
388+
list_for_each_entry_safe(iter, temp, &ipmi_device->tx_msg_list, head) {
389+
if (msg->msgid == iter->tx_msgid) {
390+
tx_msg = iter;
391+
list_del(&iter->head);
394392
break;
395393
}
396394
}
397395
spin_unlock_irqrestore(&ipmi_device->tx_msg_lock, flags);
398396

399-
if (!msg_found) {
397+
if (!tx_msg) {
400398
dev_warn(dev,
401399
"Unexpected response (msg id %ld) is returned.\n",
402400
msg->msgid);
@@ -482,15 +480,14 @@ static void ipmi_register_bmc(int iface, struct device *dev)
482480

483481
static void ipmi_bmc_gone(int iface)
484482
{
485-
struct acpi_ipmi_device *ipmi_device, *temp;
486-
bool dev_found = false;
483+
struct acpi_ipmi_device *ipmi_device = NULL, *iter, *temp;
487484

488485
mutex_lock(&driver_data.ipmi_lock);
489-
list_for_each_entry_safe(ipmi_device, temp,
486+
list_for_each_entry_safe(iter, temp,
490487
&driver_data.ipmi_devices, head) {
491-
if (ipmi_device->ipmi_ifnum != iface) {
492-
dev_found = true;
493-
__ipmi_dev_kill(ipmi_device);
488+
if (iter->ipmi_ifnum != iface) {
489+
ipmi_device = iter;
490+
__ipmi_dev_kill(iter);
494491
break;
495492
}
496493
}
@@ -500,7 +497,7 @@ static void ipmi_bmc_gone(int iface)
500497
struct acpi_ipmi_device, head);
501498
mutex_unlock(&driver_data.ipmi_lock);
502499

503-
if (dev_found) {
500+
if (ipmi_device) {
504501
ipmi_flush_tx_msg(ipmi_device);
505502
acpi_ipmi_dev_put(ipmi_device);
506503
}

drivers/acpi/apei/apei-base.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ static int apei_res_add(struct list_head *res_list,
319319
if (res_ins)
320320
list_add(&res_ins->list, res_list);
321321
else {
322-
res_ins = kmalloc(sizeof(*res), GFP_KERNEL);
322+
res_ins = kmalloc(sizeof(*res_ins), GFP_KERNEL);
323323
if (!res_ins)
324324
return -ENOMEM;
325325
res_ins->start = start;

drivers/acpi/cppc_acpi.c

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,7 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
654654
unsigned int num_ent, i, cpc_rev;
655655
int pcc_subspace_id = -1;
656656
acpi_status status;
657-
int ret = -EFAULT;
657+
int ret = -ENODATA;
658658

659659
if (osc_sb_cppc_not_supported)
660660
return -ENODEV;
@@ -679,9 +679,14 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
679679
cpc_obj = &out_obj->package.elements[0];
680680
if (cpc_obj->type == ACPI_TYPE_INTEGER) {
681681
num_ent = cpc_obj->integer.value;
682+
if (num_ent <= 1) {
683+
pr_debug("Unexpected _CPC NumEntries value (%d) for CPU:%d\n",
684+
num_ent, pr->id);
685+
goto out_free;
686+
}
682687
} else {
683-
pr_debug("Unexpected entry type(%d) for NumEntries\n",
684-
cpc_obj->type);
688+
pr_debug("Unexpected _CPC NumEntries entry type (%d) for CPU:%d\n",
689+
cpc_obj->type, pr->id);
685690
goto out_free;
686691
}
687692
cpc_ptr->num_entries = num_ent;
@@ -691,8 +696,8 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
691696
if (cpc_obj->type == ACPI_TYPE_INTEGER) {
692697
cpc_rev = cpc_obj->integer.value;
693698
} else {
694-
pr_debug("Unexpected entry type(%d) for Revision\n",
695-
cpc_obj->type);
699+
pr_debug("Unexpected _CPC Revision entry type (%d) for CPU:%d\n",
700+
cpc_obj->type, pr->id);
696701
goto out_free;
697702
}
698703
cpc_ptr->version = cpc_rev;
@@ -723,7 +728,8 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
723728
if (pcc_data_alloc(pcc_subspace_id))
724729
goto out_free;
725730
} else if (pcc_subspace_id != gas_t->access_width) {
726-
pr_debug("Mismatched PCC ids.\n");
731+
pr_debug("Mismatched PCC ids in _CPC for CPU:%d\n",
732+
pr->id);
727733
goto out_free;
728734
}
729735
} else if (gas_t->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
@@ -742,28 +748,30 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
742748
* SystemIO doesn't implement 64-bit
743749
* registers.
744750
*/
745-
pr_debug("Invalid access width %d for SystemIO register\n",
746-
gas_t->access_width);
751+
pr_debug("Invalid access width %d for SystemIO register in _CPC\n",
752+
gas_t->access_width);
747753
goto out_free;
748754
}
749755
if (gas_t->address & OVER_16BTS_MASK) {
750756
/* SystemIO registers use 16-bit integer addresses */
751-
pr_debug("Invalid IO port %llu for SystemIO register\n",
752-
gas_t->address);
757+
pr_debug("Invalid IO port %llu for SystemIO register in _CPC\n",
758+
gas_t->address);
753759
goto out_free;
754760
}
755761
} else {
756762
if (gas_t->space_id != ACPI_ADR_SPACE_FIXED_HARDWARE || !cpc_ffh_supported()) {
757763
/* Support only PCC, SystemMemory, SystemIO, and FFH type regs. */
758-
pr_debug("Unsupported register type: %d\n", gas_t->space_id);
764+
pr_debug("Unsupported register type (%d) in _CPC\n",
765+
gas_t->space_id);
759766
goto out_free;
760767
}
761768
}
762769

763770
cpc_ptr->cpc_regs[i-2].type = ACPI_TYPE_BUFFER;
764771
memcpy(&cpc_ptr->cpc_regs[i-2].cpc_entry.reg, gas_t, sizeof(*gas_t));
765772
} else {
766-
pr_debug("Err in entry:%d in CPC table of CPU:%d\n", i, pr->id);
773+
pr_debug("Invalid entry type (%d) in _CPC for CPU:%d\n",
774+
i, pr->id);
767775
goto out_free;
768776
}
769777
}

drivers/acpi/tables.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
151151
{
152152
struct acpi_madt_local_apic_override *p =
153153
(struct acpi_madt_local_apic_override *)header;
154-
pr_info("LAPIC_ADDR_OVR (address[%p])\n",
155-
(void *)(unsigned long)p->address);
154+
pr_info("LAPIC_ADDR_OVR (address[0x%llx])\n",
155+
p->address);
156156
}
157157
break;
158158

0 commit comments

Comments
 (0)