diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2019-03-25 06:22:51 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2019-03-25 06:22:50 -0700 |
commit | 6543b0a4ad9ae3888e889ff3b6196e351c77aaa2 (patch) | |
tree | cd49ae7034adea8ab876ed74afa2c8db9d159e8a | |
parent | 875833b037e18d1189afb5fe000072488c866260 (diff) | |
parent | c739d9858bb9318ecc403e49daa88be426168d92 (diff) |
Merge "diag: Add protection while accessing usb_info's buffer table"
-rw-r--r-- | drivers/char/diag/diag_usb.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/char/diag/diag_usb.c b/drivers/char/diag/diag_usb.c index 4dcc0a5727d0..5a35a9b4a4eb 100644 --- a/drivers/char/diag/diag_usb.c +++ b/drivers/char/diag/diag_usb.c @@ -312,23 +312,25 @@ static void diag_usb_write_done(struct diag_usb_info *ch, if (!ch || !req) return; + spin_lock_irqsave(&ch->write_lock, flags); ch->write_cnt++; entry = diag_usb_buf_tbl_get(ch, req->context); if (!entry) { pr_err_ratelimited("diag: In %s, unable to find entry %pK in the table\n", __func__, req->context); + spin_unlock_irqrestore(&ch->write_lock, flags); return; } if (atomic_read(&entry->ref_count) != 0) { DIAG_LOG(DIAG_DEBUG_MUX, "partial write_done ref %d\n", atomic_read(&entry->ref_count)); diag_ws_on_copy_complete(DIAG_WS_MUX); + spin_unlock_irqrestore(&ch->write_lock, flags); diagmem_free(driver, req, ch->mempool); return; } DIAG_LOG(DIAG_DEBUG_MUX, "full write_done, ctxt: %d\n", ctxt); - spin_lock_irqsave(&ch->write_lock, flags); list_del(&entry->track); ctxt = entry->ctxt; buf = entry->buf; |