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

Commit 86b98203 authored by Jarkko Sakkinen's avatar Jarkko Sakkinen Committed by Greg Kroah-Hartman
Browse files

tpm: tpm_vtpm_proxy: fix a race condition in /dev/vtpmx creation



commit f4032d615f90970d6c3ac1d9c0bce3351eb4445c upstream.

/dev/vtpmx is made visible before 'workqueue' is initialized, which can
lead to a memory corruption in the worst case scenario.

Address this by initializing 'workqueue' as the very first step of the
driver initialization.

Cc: stable@vger.kernel.org
Fixes: 6f99612e ("tpm: Proxy driver for supporting multiple emulated TPMs")
Reviewed-by: default avatarStefan Berger <stefanb@linux.ibm.com>
Signed-off-by: default avatarJarkko Sakkinen <jarkko.sakkinen@tuni.fi>
Signed-off-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 96a16069
Loading
Loading
Loading
Loading
+7 −23
Original line number Diff line number Diff line
@@ -693,37 +693,21 @@ static struct miscdevice vtpmx_miscdev = {
	.fops = &vtpmx_fops,
};

static int vtpmx_init(void)
{
	return misc_register(&vtpmx_miscdev);
}

static void vtpmx_cleanup(void)
{
	misc_deregister(&vtpmx_miscdev);
}

static int __init vtpm_module_init(void)
{
	int rc;

	rc = vtpmx_init();
	if (rc) {
		pr_err("couldn't create vtpmx device\n");
		return rc;
	}

	workqueue = create_workqueue("tpm-vtpm");
	if (!workqueue) {
		pr_err("couldn't create workqueue\n");
		rc = -ENOMEM;
		goto err_vtpmx_cleanup;
		return -ENOMEM;
	}

	return 0;

err_vtpmx_cleanup:
	vtpmx_cleanup();
	rc = misc_register(&vtpmx_miscdev);
	if (rc) {
		pr_err("couldn't create vtpmx device\n");
		destroy_workqueue(workqueue);
	}

	return rc;
}
@@ -731,7 +715,7 @@ static int __init vtpm_module_init(void)
static void __exit vtpm_module_exit(void)
{
	destroy_workqueue(workqueue);
	vtpmx_cleanup();
	misc_deregister(&vtpmx_miscdev);
}

module_init(vtpm_module_init);