diff options
author | Kangjie Lu <kjlu@umn.edu> | 2019-05-14 18:44:49 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-14 22:52:50 -0400 |
commit | 23015b22e47c5409620b1726a677d69e5cd032ba (patch) | |
tree | 094b610ac74ccf42a93ea9c29012aa17036d8984 | |
parent | 3713a4e1fdb8da86f96a3e770b08e278d97529b4 (diff) |
rapidio: fix a NULL pointer dereference when create_workqueue() fails
In case create_workqueue fails, the fix releases resources and returns
-ENOMEM to avoid NULL pointer dereference.
Signed-off-by: Kangjie Lu <kjlu@umn.edu>
Acked-by: Alexandre Bounine <alex.bou9@gmail.com>
Cc: Matt Porter <mporter@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | drivers/rapidio/rio_cm.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/rapidio/rio_cm.c b/drivers/rapidio/rio_cm.c index cf45829585cb..b29fc258eeba 100644 --- a/drivers/rapidio/rio_cm.c +++ b/drivers/rapidio/rio_cm.c | |||
@@ -2147,6 +2147,14 @@ static int riocm_add_mport(struct device *dev, | |||
2147 | mutex_init(&cm->rx_lock); | 2147 | mutex_init(&cm->rx_lock); |
2148 | riocm_rx_fill(cm, RIOCM_RX_RING_SIZE); | 2148 | riocm_rx_fill(cm, RIOCM_RX_RING_SIZE); |
2149 | cm->rx_wq = create_workqueue(DRV_NAME "/rxq"); | 2149 | cm->rx_wq = create_workqueue(DRV_NAME "/rxq"); |
2150 | if (!cm->rx_wq) { | ||
2151 | riocm_error("failed to allocate IBMBOX_%d on %s", | ||
2152 | cmbox, mport->name); | ||
2153 | rio_release_outb_mbox(mport, cmbox); | ||
2154 | kfree(cm); | ||
2155 | return -ENOMEM; | ||
2156 | } | ||
2157 | |||
2150 | INIT_WORK(&cm->rx_work, rio_ibmsg_handler); | 2158 | INIT_WORK(&cm->rx_work, rio_ibmsg_handler); |
2151 | 2159 | ||
2152 | cm->tx_slot = 0; | 2160 | cm->tx_slot = 0; |