Commit d8537548 authored by Kees Cook's avatar Kees Cook Committed by Linus Torvalds

drivers: avoid format strings in names passed to alloc_workqueue()

For the workqueue creation interfaces that do not expect format strings,
make sure they cannot accidently be parsed that way.  Additionally, clean
up calls made with a single parameter that would be handled as a format
string.  Many callers are passing potentially dynamic string content, so
use "%s" in those cases to avoid any potential accidents.
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 02aa2a37
...@@ -455,8 +455,8 @@ static int pcrypt_init_padata(struct padata_pcrypt *pcrypt, ...@@ -455,8 +455,8 @@ static int pcrypt_init_padata(struct padata_pcrypt *pcrypt,
get_online_cpus(); get_online_cpus();
pcrypt->wq = alloc_workqueue(name, pcrypt->wq = alloc_workqueue("%s", WQ_MEM_RECLAIM | WQ_CPU_INTENSIVE,
WQ_MEM_RECLAIM | WQ_CPU_INTENSIVE, 1); 1, name);
if (!pcrypt->wq) if (!pcrypt->wq)
goto err; goto err;
......
...@@ -695,7 +695,7 @@ static int cx18_create_in_workq(struct cx18 *cx) ...@@ -695,7 +695,7 @@ static int cx18_create_in_workq(struct cx18 *cx)
{ {
snprintf(cx->in_workq_name, sizeof(cx->in_workq_name), "%s-in", snprintf(cx->in_workq_name, sizeof(cx->in_workq_name), "%s-in",
cx->v4l2_dev.name); cx->v4l2_dev.name);
cx->in_work_queue = alloc_ordered_workqueue(cx->in_workq_name, 0); cx->in_work_queue = alloc_ordered_workqueue("%s", 0, cx->in_workq_name);
if (cx->in_work_queue == NULL) { if (cx->in_work_queue == NULL) {
CX18_ERR("Unable to create incoming mailbox handler thread\n"); CX18_ERR("Unable to create incoming mailbox handler thread\n");
return -ENOMEM; return -ENOMEM;
......
...@@ -84,8 +84,8 @@ int i2o_driver_register(struct i2o_driver *drv) ...@@ -84,8 +84,8 @@ int i2o_driver_register(struct i2o_driver *drv)
osm_debug("Register driver %s\n", drv->name); osm_debug("Register driver %s\n", drv->name);
if (drv->event) { if (drv->event) {
drv->event_queue = alloc_workqueue(drv->name, drv->event_queue = alloc_workqueue("%s", WQ_MEM_RECLAIM, 1,
WQ_MEM_RECLAIM, 1); drv->name);
if (!drv->event_queue) { if (!drv->event_queue) {
osm_err("Could not initialize event queue for driver " osm_err("Could not initialize event queue for driver "
"%s\n", drv->name); "%s\n", drv->name);
......
...@@ -1321,7 +1321,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) ...@@ -1321,7 +1321,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
* Initialize work. * Initialize work.
*/ */
rt2x00dev->workqueue = rt2x00dev->workqueue =
alloc_ordered_workqueue(wiphy_name(rt2x00dev->hw->wiphy), 0); alloc_ordered_workqueue("%s", 0, wiphy_name(rt2x00dev->hw->wiphy));
if (!rt2x00dev->workqueue) { if (!rt2x00dev->workqueue) {
retval = -ENOMEM; retval = -ENOMEM;
goto exit; goto exit;
......
...@@ -380,7 +380,7 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw) ...@@ -380,7 +380,7 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
/* <2> work queue */ /* <2> work queue */
rtlpriv->works.hw = hw; rtlpriv->works.hw = hw;
rtlpriv->works.rtl_wq = alloc_workqueue(rtlpriv->cfg->name, 0, 0); rtlpriv->works.rtl_wq = alloc_workqueue("%s", 0, 0, rtlpriv->cfg->name);
INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq, INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq,
(void *)rtl_watchdog_wq_callback); (void *)rtl_watchdog_wq_callback);
INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq, INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq,
......
...@@ -773,14 +773,12 @@ static void pcie_shutdown_notification(struct controller *ctrl) ...@@ -773,14 +773,12 @@ static void pcie_shutdown_notification(struct controller *ctrl)
static int pcie_init_slot(struct controller *ctrl) static int pcie_init_slot(struct controller *ctrl)
{ {
struct slot *slot; struct slot *slot;
char name[32];
slot = kzalloc(sizeof(*slot), GFP_KERNEL); slot = kzalloc(sizeof(*slot), GFP_KERNEL);
if (!slot) if (!slot)
return -ENOMEM; return -ENOMEM;
snprintf(name, sizeof(name), "pciehp-%u", PSN(ctrl)); slot->wq = alloc_workqueue("pciehp-%u", 0, 0, PSN(ctrl));
slot->wq = alloc_workqueue(name, 0, 0);
if (!slot->wq) if (!slot->wq)
goto abort; goto abort;
......
...@@ -128,8 +128,7 @@ static int init_slots(struct controller *ctrl) ...@@ -128,8 +128,7 @@ static int init_slots(struct controller *ctrl)
slot->hpc_ops = ctrl->hpc_ops; slot->hpc_ops = ctrl->hpc_ops;
slot->number = ctrl->first_slot + (ctrl->slot_num_inc * i); slot->number = ctrl->first_slot + (ctrl->slot_num_inc * i);
snprintf(name, sizeof(name), "shpchp-%d", slot->number); slot->wq = alloc_workqueue("shpchp-%d", 0, 0, slot->number);
slot->wq = alloc_workqueue(name, 0, 0);
if (!slot->wq) { if (!slot->wq) {
retval = -ENOMEM; retval = -ENOMEM;
goto error_info; goto error_info;
......
...@@ -4996,7 +4996,7 @@ static int beiscsi_dev_probe(struct pci_dev *pcidev, ...@@ -4996,7 +4996,7 @@ static int beiscsi_dev_probe(struct pci_dev *pcidev,
snprintf(phba->wq_name, sizeof(phba->wq_name), "beiscsi_%02x_wq", snprintf(phba->wq_name, sizeof(phba->wq_name), "beiscsi_%02x_wq",
phba->shost->host_no); phba->shost->host_no);
phba->wq = alloc_workqueue(phba->wq_name, WQ_MEM_RECLAIM, 1); phba->wq = alloc_workqueue("%s", WQ_MEM_RECLAIM, 1, phba->wq_name);
if (!phba->wq) { if (!phba->wq) {
beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT, beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
"BM_%d : beiscsi_dev_probe-" "BM_%d : beiscsi_dev_probe-"
......
...@@ -7060,8 +7060,8 @@ static int qla4xxx_probe_adapter(struct pci_dev *pdev, ...@@ -7060,8 +7060,8 @@ static int qla4xxx_probe_adapter(struct pci_dev *pdev,
} }
INIT_WORK(&ha->dpc_work, qla4xxx_do_dpc); INIT_WORK(&ha->dpc_work, qla4xxx_do_dpc);
sprintf(buf, "qla4xxx_%lu_task", ha->host_no); ha->task_wq = alloc_workqueue("qla4xxx_%lu_task", WQ_MEM_RECLAIM, 1,
ha->task_wq = alloc_workqueue(buf, WQ_MEM_RECLAIM, 1); ha->host_no);
if (!ha->task_wq) { if (!ha->task_wq) {
ql4_printk(KERN_WARNING, ha, "Unable to start task thread!\n"); ql4_printk(KERN_WARNING, ha, "Unable to start task thread!\n");
ret = -ENODEV; ret = -ENODEV;
......
...@@ -435,7 +435,7 @@ static int fc_host_setup(struct transport_container *tc, struct device *dev, ...@@ -435,7 +435,7 @@ static int fc_host_setup(struct transport_container *tc, struct device *dev,
snprintf(fc_host->work_q_name, sizeof(fc_host->work_q_name), snprintf(fc_host->work_q_name, sizeof(fc_host->work_q_name),
"fc_wq_%d", shost->host_no); "fc_wq_%d", shost->host_no);
fc_host->work_q = alloc_workqueue(fc_host->work_q_name, 0, 0); fc_host->work_q = alloc_workqueue("%s", 0, 0, fc_host->work_q_name);
if (!fc_host->work_q) if (!fc_host->work_q)
return -ENOMEM; return -ENOMEM;
...@@ -443,8 +443,8 @@ static int fc_host_setup(struct transport_container *tc, struct device *dev, ...@@ -443,8 +443,8 @@ static int fc_host_setup(struct transport_container *tc, struct device *dev,
snprintf(fc_host->devloss_work_q_name, snprintf(fc_host->devloss_work_q_name,
sizeof(fc_host->devloss_work_q_name), sizeof(fc_host->devloss_work_q_name),
"fc_dl_%d", shost->host_no); "fc_dl_%d", shost->host_no);
fc_host->devloss_work_q = fc_host->devloss_work_q = alloc_workqueue("%s", 0, 0,
alloc_workqueue(fc_host->devloss_work_q_name, 0, 0); fc_host->devloss_work_q_name);
if (!fc_host->devloss_work_q) { if (!fc_host->devloss_work_q) {
destroy_workqueue(fc_host->work_q); destroy_workqueue(fc_host->work_q);
fc_host->work_q = NULL; fc_host->work_q = NULL;
......
...@@ -445,11 +445,12 @@ __alloc_workqueue_key(const char *fmt, unsigned int flags, int max_active, ...@@ -445,11 +445,12 @@ __alloc_workqueue_key(const char *fmt, unsigned int flags, int max_active,
alloc_workqueue(fmt, WQ_UNBOUND | __WQ_ORDERED | (flags), 1, ##args) alloc_workqueue(fmt, WQ_UNBOUND | __WQ_ORDERED | (flags), 1, ##args)
#define create_workqueue(name) \ #define create_workqueue(name) \
alloc_workqueue((name), WQ_MEM_RECLAIM, 1) alloc_workqueue("%s", WQ_MEM_RECLAIM, 1, (name))
#define create_freezable_workqueue(name) \ #define create_freezable_workqueue(name) \
alloc_workqueue((name), WQ_FREEZABLE | WQ_UNBOUND | WQ_MEM_RECLAIM, 1) alloc_workqueue("%s", WQ_FREEZABLE | WQ_UNBOUND | WQ_MEM_RECLAIM, \
1, (name))
#define create_singlethread_workqueue(name) \ #define create_singlethread_workqueue(name) \
alloc_workqueue((name), WQ_UNBOUND | WQ_MEM_RECLAIM, 1) alloc_workqueue("%s", WQ_UNBOUND | WQ_MEM_RECLAIM, 1, (name))
extern void destroy_workqueue(struct workqueue_struct *wq); extern void destroy_workqueue(struct workqueue_struct *wq);
......
...@@ -2211,16 +2211,15 @@ int hci_register_dev(struct hci_dev *hdev) ...@@ -2211,16 +2211,15 @@ int hci_register_dev(struct hci_dev *hdev)
list_add(&hdev->list, &hci_dev_list); list_add(&hdev->list, &hci_dev_list);
write_unlock(&hci_dev_list_lock); write_unlock(&hci_dev_list_lock);
hdev->workqueue = alloc_workqueue(hdev->name, WQ_HIGHPRI | WQ_UNBOUND | hdev->workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND |
WQ_MEM_RECLAIM, 1); WQ_MEM_RECLAIM, 1, hdev->name);
if (!hdev->workqueue) { if (!hdev->workqueue) {
error = -ENOMEM; error = -ENOMEM;
goto err; goto err;
} }
hdev->req_workqueue = alloc_workqueue(hdev->name, hdev->req_workqueue = alloc_workqueue("%s", WQ_HIGHPRI | WQ_UNBOUND |
WQ_HIGHPRI | WQ_UNBOUND | WQ_MEM_RECLAIM, 1, hdev->name);
WQ_MEM_RECLAIM, 1);
if (!hdev->req_workqueue) { if (!hdev->req_workqueue) {
destroy_workqueue(hdev->workqueue); destroy_workqueue(hdev->workqueue);
error = -ENOMEM; error = -ENOMEM;
......
...@@ -921,7 +921,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) ...@@ -921,7 +921,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
hw->queues = IEEE80211_MAX_QUEUES; hw->queues = IEEE80211_MAX_QUEUES;
local->workqueue = local->workqueue =
alloc_ordered_workqueue(wiphy_name(local->hw.wiphy), 0); alloc_ordered_workqueue("%s", 0, wiphy_name(local->hw.wiphy));
if (!local->workqueue) { if (!local->workqueue) {
result = -ENOMEM; result = -ENOMEM;
goto fail_workqueue; goto fail_workqueue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment