mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-04 16:25:34 +00:00
iavf: fix potential deadlock on allocation failure
In iavf_adminq_task(), if kzalloc() fails to allocate the event.msg_buf,
the function will exit without releasing the adapter->crit_lock.
This is unlikely, but if it happens, the next access to that mutex will
deadlock.
Fix this by moving the unlock to the end of the function, and adding a new
label to allow jumping to the unlock portion of the function exit flow.
Fixes: fc2e6b3b13
("iavf: Rework mutexes for better synchronisation")
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
parent
043b1f185f
commit
a2f054c10b
1 changed files with 3 additions and 2 deletions
|
@ -3264,7 +3264,7 @@ static void iavf_adminq_task(struct work_struct *work)
|
|||
event.buf_len = IAVF_MAX_AQ_BUF_SIZE;
|
||||
event.msg_buf = kzalloc(event.buf_len, GFP_KERNEL);
|
||||
if (!event.msg_buf)
|
||||
goto out;
|
||||
goto unlock;
|
||||
|
||||
do {
|
||||
ret = iavf_clean_arq_element(hw, &event, &pending);
|
||||
|
@ -3279,7 +3279,6 @@ static void iavf_adminq_task(struct work_struct *work)
|
|||
if (pending != 0)
|
||||
memset(event.msg_buf, 0, IAVF_MAX_AQ_BUF_SIZE);
|
||||
} while (pending);
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
|
||||
if (iavf_is_reset_in_progress(adapter))
|
||||
goto freedom;
|
||||
|
@ -3323,6 +3322,8 @@ static void iavf_adminq_task(struct work_struct *work)
|
|||
|
||||
freedom:
|
||||
kfree(event.msg_buf);
|
||||
unlock:
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
out:
|
||||
/* re-enable Admin queue interrupt cause */
|
||||
iavf_misc_irq_enable(adapter);
|
||||
|
|
Loading…
Add table
Reference in a new issue