summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2019-03-25 06:22:51 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2019-03-25 06:22:50 -0700
commit6543b0a4ad9ae3888e889ff3b6196e351c77aaa2 (patch)
treecd49ae7034adea8ab876ed74afa2c8db9d159e8a
parent875833b037e18d1189afb5fe000072488c866260 (diff)
parentc739d9858bb9318ecc403e49daa88be426168d92 (diff)
Merge "diag: Add protection while accessing usb_info's buffer table"
-rw-r--r--drivers/char/diag/diag_usb.c4
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;