Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a7abda8d authored by minskey guo's avatar minskey guo Committed by Matthew Garrett
Browse files

NULL pointer might be used in ips_monitor()



 The patch is to create ips_adjust thread before ips_monitor begins
 to run  because the latter will kthread_stop() or wake up the former
 via ips->adjust pointer. Without this change, it is possible that
 ips->adjust is NULL when kthread_stop() or wake_up_process() is
 called in ips_monitor().

Signed-off-by: default avatarminskey guo <chaohong.guo@intel.com>
Acked-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
parent fed522f7
Loading
Loading
Loading
Loading
+13 −9
Original line number Diff line number Diff line
@@ -940,7 +940,6 @@ static int ips_monitor(void *data)
		kfree(mch_samples);
		kfree(cpu_samples);
		kfree(mchp_samples);
		kthread_stop(ips->adjust);
		return -ENOMEM;
	}

@@ -1535,19 +1534,24 @@ static int ips_probe(struct pci_dev *dev, const struct pci_device_id *id)
	ips_enable_cpu_turbo(ips);
	ips->cpu_turbo_enabled = true;

	/* Set up the work queue and monitor/adjust threads */
	ips->monitor = kthread_run(ips_monitor, ips, "ips-monitor");
	if (IS_ERR(ips->monitor)) {
	/* Create thermal adjust thread */
	ips->adjust = kthread_create(ips_adjust, ips, "ips-adjust");
	if (IS_ERR(ips->adjust)) {
		dev_err(&dev->dev,
			"failed to create thermal monitor thread, aborting\n");
			"failed to create thermal adjust thread, aborting\n");
		ret = -ENOMEM;
		goto error_free_irq;

	}

	ips->adjust = kthread_create(ips_adjust, ips, "ips-adjust");
	if (IS_ERR(ips->adjust)) {
	/*
	 * Set up the work queue and monitor thread. The monitor thread
	 * will wake up ips_adjust thread.
	 */
	ips->monitor = kthread_run(ips_monitor, ips, "ips-monitor");
	if (IS_ERR(ips->monitor)) {
		dev_err(&dev->dev,
			"failed to create thermal adjust thread, aborting\n");
			"failed to create thermal monitor thread, aborting\n");
		ret = -ENOMEM;
		goto error_thread_cleanup;
	}
@@ -1566,7 +1570,7 @@ static int ips_probe(struct pci_dev *dev, const struct pci_device_id *id)
	return ret;

error_thread_cleanup:
	kthread_stop(ips->monitor);
	kthread_stop(ips->adjust);
error_free_irq:
	free_irq(ips->dev->irq, ips);
error_unmap: