History

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()

Linus Torvalds committed 4 years ago

Commit e729dbe2 parents b4a5ea0 4a13e554 files · +41 −36Browse files

Unified · Split

4 files
  1. drivers/acpi/acpi_ipmi.c +18 −21
  2. drivers/acpi/apei/apei-base.c +1 −1
  3. drivers/acpi/cppc_acpi.c +20 −12
  4. drivers/acpi/tables.c +2 −2
drivers/acpi/acpi_ipmi.c+18−21
@@ -353,29 +353,27 @@ static void ipmi_flush_tx_msg(struct acpi_ipmi_device *ipmi) · 352 unmodified lines
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) · 5 unmodified lines
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 @@ err_ref: · 79 unmodified lines
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) · 3 unmodified lines
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+1−1
@@ -319,7 +319,7 @@ repeat: · 318 unmodified lines
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+20−12
@@ -654,7 +654,7 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) · 653 unmodified lines
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) · 18 unmodified lines
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) · 3 unmodified lines
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) · 24 unmodified lines
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,20 +748,21 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) · 12 unmodified lines
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 }
@@ -763,7 +770,8 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) · 1 unmodified line
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+2−2
@@ -151,8 +151,8 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header *header) · 150 unmodified lines
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