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

Commit 886275ce authored by Rusty Russell's avatar Rusty Russell
Browse files

param: lock if_sdio's lbs_helper_name and lbs_fw_name against sysfs changes.



Since it can be changed via sysfs, we need to make a copy.  This most
generic way of doing this is to keep a flag so we know when to free it.

Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
Reviewed-by: default avatarTakashi Iwai <tiwai@suse.de>
Cc: Dan Williams <dcbw@redhat.com>
Cc: John W. Linville <linville@tuxdriver.com>
Cc: libertas-dev@lists.infradead.org
Cc: linux-wireless@vger.kernel.org
Cc: netdev@vger.kernel.org
parent 7d351035
Loading
Loading
Loading
Loading
+30 −2
Original line number Original line Diff line number Diff line
@@ -125,6 +125,8 @@ struct if_sdio_card {


	const char		*helper;
	const char		*helper;
	const char		*firmware;
	const char		*firmware;
	bool			helper_allocated;
	bool			firmware_allocated;


	u8			buffer[65536];
	u8			buffer[65536];


@@ -984,16 +986,34 @@ static int if_sdio_probe(struct sdio_func *func,
	card->helper = if_sdio_models[i].helper;
	card->helper = if_sdio_models[i].helper;
	card->firmware = if_sdio_models[i].firmware;
	card->firmware = if_sdio_models[i].firmware;


	kparam_block_sysfs_write(helper_name);
	if (lbs_helper_name) {
	if (lbs_helper_name) {
		char *helper = kstrdup(lbs_helper_name, GFP_KERNEL);
		if (!helper) {
			kparam_unblock_sysfs_write(helper_name);
			ret = -ENOMEM;
			goto free;
		}
		lbs_deb_sdio("overriding helper firmware: %s\n",
		lbs_deb_sdio("overriding helper firmware: %s\n",
			lbs_helper_name);
			lbs_helper_name);
		card->helper = lbs_helper_name;
		card->helper = helper;
		card->helper_allocated = true;
	}
	}
	kparam_unblock_sysfs_write(helper_name);


	kparam_block_sysfs_write(fw_name);
	if (lbs_fw_name) {
	if (lbs_fw_name) {
		char *fw_name = kstrdup(lbs_fw_name, GFP_KERNEL);
		if (!fw_name) {
			kparam_unblock_sysfs_write(fw_name);
			ret = -ENOMEM;
			goto free;
		}
		lbs_deb_sdio("overriding firmware: %s\n", lbs_fw_name);
		lbs_deb_sdio("overriding firmware: %s\n", lbs_fw_name);
		card->firmware = lbs_fw_name;
		card->firmware = fw_name;
		card->firmware_allocated = true;
	}
	}
	kparam_unblock_sysfs_write(fw_name);


	sdio_claim_host(func);
	sdio_claim_host(func);


@@ -1127,6 +1147,10 @@ free:
		kfree(packet);
		kfree(packet);
	}
	}


	if (card->helper_allocated)
		kfree(card->helper);
	if (card->firmware_allocated)
		kfree(card->firmware);
	kfree(card);
	kfree(card);


	goto out;
	goto out;
@@ -1177,6 +1201,10 @@ static void if_sdio_remove(struct sdio_func *func)
		kfree(packet);
		kfree(packet);
	}
	}


	if (card->helper_allocated)
		kfree(card->helper);
	if (card->firmware_allocated)
		kfree(card->firmware);
	kfree(card);
	kfree(card);


	lbs_deb_leave(LBS_DEB_SDIO);
	lbs_deb_leave(LBS_DEB_SDIO);