Skip to content

Commit 2a29003

Browse files
committed
Merge tag 'char-misc-4.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char/misc driver fixes from Greg KH: "Here are a few small char/misc driver fixes for reported issues. The "biggest" are two binder fixes for reported issues that have been shipping in Android phones for a while now, the others are various fixes for reported problems. And there's a MAINTAINERS update for good measure. All have been in linux-next with no reported issues" * tag 'char-misc-4.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: MAINTAINERS: Add entry for genwqe driver VMCI: Doorbell create and destroy fixes GenWQE: Fix bad page access during abort of resource allocation vme: vme_get_size potentially returning incorrect value on failure extcon: qcom-spmi-misc: Sync the extcon state on interrupt hv: do not lose pending heartbeat vmbus packets mei: txe: don't clean an unprocessed interrupt cause. ANDROID: binder: Clear binder and cookie when setting handle in flat binder struct ANDROID: binder: Add strong ref checks
2 parents c636e17 + a7d5afe commit 2a29003

File tree

9 files changed

+67
-18
lines changed

9 files changed

+67
-18
lines changed

MAINTAINERS

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5287,6 +5287,12 @@ M: Joe Perches <[email protected]>
52875287
S: Maintained
52885288
F: scripts/get_maintainer.pl
52895289

5290+
GENWQE (IBM Generic Workqueue Card)
5291+
M: Frank Haverkamp <[email protected]>
5292+
M: Gabriel Krisman Bertazi <[email protected]>
5293+
S: Supported
5294+
F: drivers/misc/genwqe/
5295+
52905296
GFS2 FILE SYSTEM
52915297
M: Steven Whitehouse <[email protected]>
52925298
M: Bob Peterson <[email protected]>

drivers/android/binder.c

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,20 +1002,24 @@ static int binder_dec_node(struct binder_node *node, int strong, int internal)
10021002

10031003

10041004
static struct binder_ref *binder_get_ref(struct binder_proc *proc,
1005-
uint32_t desc)
1005+
u32 desc, bool need_strong_ref)
10061006
{
10071007
struct rb_node *n = proc->refs_by_desc.rb_node;
10081008
struct binder_ref *ref;
10091009

10101010
while (n) {
10111011
ref = rb_entry(n, struct binder_ref, rb_node_desc);
10121012

1013-
if (desc < ref->desc)
1013+
if (desc < ref->desc) {
10141014
n = n->rb_left;
1015-
else if (desc > ref->desc)
1015+
} else if (desc > ref->desc) {
10161016
n = n->rb_right;
1017-
else
1017+
} else if (need_strong_ref && !ref->strong) {
1018+
binder_user_error("tried to use weak ref as strong ref\n");
1019+
return NULL;
1020+
} else {
10181021
return ref;
1022+
}
10191023
}
10201024
return NULL;
10211025
}
@@ -1285,7 +1289,10 @@ static void binder_transaction_buffer_release(struct binder_proc *proc,
12851289
} break;
12861290
case BINDER_TYPE_HANDLE:
12871291
case BINDER_TYPE_WEAK_HANDLE: {
1288-
struct binder_ref *ref = binder_get_ref(proc, fp->handle);
1292+
struct binder_ref *ref;
1293+
1294+
ref = binder_get_ref(proc, fp->handle,
1295+
fp->type == BINDER_TYPE_HANDLE);
12891296

12901297
if (ref == NULL) {
12911298
pr_err("transaction release %d bad handle %d\n",
@@ -1380,7 +1387,7 @@ static void binder_transaction(struct binder_proc *proc,
13801387
if (tr->target.handle) {
13811388
struct binder_ref *ref;
13821389

1383-
ref = binder_get_ref(proc, tr->target.handle);
1390+
ref = binder_get_ref(proc, tr->target.handle, true);
13841391
if (ref == NULL) {
13851392
binder_user_error("%d:%d got transaction to invalid handle\n",
13861393
proc->pid, thread->pid);
@@ -1577,7 +1584,9 @@ static void binder_transaction(struct binder_proc *proc,
15771584
fp->type = BINDER_TYPE_HANDLE;
15781585
else
15791586
fp->type = BINDER_TYPE_WEAK_HANDLE;
1587+
fp->binder = 0;
15801588
fp->handle = ref->desc;
1589+
fp->cookie = 0;
15811590
binder_inc_ref(ref, fp->type == BINDER_TYPE_HANDLE,
15821591
&thread->todo);
15831592

@@ -1589,7 +1598,10 @@ static void binder_transaction(struct binder_proc *proc,
15891598
} break;
15901599
case BINDER_TYPE_HANDLE:
15911600
case BINDER_TYPE_WEAK_HANDLE: {
1592-
struct binder_ref *ref = binder_get_ref(proc, fp->handle);
1601+
struct binder_ref *ref;
1602+
1603+
ref = binder_get_ref(proc, fp->handle,
1604+
fp->type == BINDER_TYPE_HANDLE);
15931605

15941606
if (ref == NULL) {
15951607
binder_user_error("%d:%d got transaction with invalid handle, %d\n",
@@ -1624,7 +1636,9 @@ static void binder_transaction(struct binder_proc *proc,
16241636
return_error = BR_FAILED_REPLY;
16251637
goto err_binder_get_ref_for_node_failed;
16261638
}
1639+
fp->binder = 0;
16271640
fp->handle = new_ref->desc;
1641+
fp->cookie = 0;
16281642
binder_inc_ref(new_ref, fp->type == BINDER_TYPE_HANDLE, NULL);
16291643
trace_binder_transaction_ref_to_ref(t, ref,
16301644
new_ref);
@@ -1678,6 +1692,7 @@ static void binder_transaction(struct binder_proc *proc,
16781692
binder_debug(BINDER_DEBUG_TRANSACTION,
16791693
" fd %d -> %d\n", fp->handle, target_fd);
16801694
/* TODO: fput? */
1695+
fp->binder = 0;
16811696
fp->handle = target_fd;
16821697
} break;
16831698

@@ -1800,7 +1815,9 @@ static int binder_thread_write(struct binder_proc *proc,
18001815
ref->desc);
18011816
}
18021817
} else
1803-
ref = binder_get_ref(proc, target);
1818+
ref = binder_get_ref(proc, target,
1819+
cmd == BC_ACQUIRE ||
1820+
cmd == BC_RELEASE);
18041821
if (ref == NULL) {
18051822
binder_user_error("%d:%d refcount change on invalid ref %d\n",
18061823
proc->pid, thread->pid, target);
@@ -1996,7 +2013,7 @@ static int binder_thread_write(struct binder_proc *proc,
19962013
if (get_user(cookie, (binder_uintptr_t __user *)ptr))
19972014
return -EFAULT;
19982015
ptr += sizeof(binder_uintptr_t);
1999-
ref = binder_get_ref(proc, target);
2016+
ref = binder_get_ref(proc, target, false);
20002017
if (ref == NULL) {
20012018
binder_user_error("%d:%d %s invalid ref %d\n",
20022019
proc->pid, thread->pid,

drivers/extcon/extcon-qcom-spmi-misc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ static void qcom_usb_extcon_detect_cable(struct work_struct *work)
5151
if (ret)
5252
return;
5353

54-
extcon_set_state(info->edev, EXTCON_USB_HOST, !id);
54+
extcon_set_state_sync(info->edev, EXTCON_USB_HOST, !id);
5555
}
5656

5757
static irqreturn_t qcom_usb_irq_handler(int irq, void *dev_id)

drivers/hv/hv_util.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,10 +314,14 @@ static void heartbeat_onchannelcallback(void *context)
314314
u8 *hbeat_txf_buf = util_heartbeat.recv_buffer;
315315
struct icmsg_negotiate *negop = NULL;
316316

317-
vmbus_recvpacket(channel, hbeat_txf_buf,
318-
PAGE_SIZE, &recvlen, &requestid);
317+
while (1) {
318+
319+
vmbus_recvpacket(channel, hbeat_txf_buf,
320+
PAGE_SIZE, &recvlen, &requestid);
321+
322+
if (!recvlen)
323+
break;
319324

320-
if (recvlen > 0) {
321325
icmsghdrp = (struct icmsg_hdr *)&hbeat_txf_buf[
322326
sizeof(struct vmbuspipe_hdr)];
323327

drivers/misc/genwqe/card_utils.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,17 +352,27 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl,
352352
if (copy_from_user(sgl->lpage, user_addr + user_size -
353353
sgl->lpage_size, sgl->lpage_size)) {
354354
rc = -EFAULT;
355-
goto err_out1;
355+
goto err_out2;
356356
}
357357
}
358358
return 0;
359359

360+
err_out2:
361+
__genwqe_free_consistent(cd, PAGE_SIZE, sgl->lpage,
362+
sgl->lpage_dma_addr);
363+
sgl->lpage = NULL;
364+
sgl->lpage_dma_addr = 0;
360365
err_out1:
361366
__genwqe_free_consistent(cd, PAGE_SIZE, sgl->fpage,
362367
sgl->fpage_dma_addr);
368+
sgl->fpage = NULL;
369+
sgl->fpage_dma_addr = 0;
363370
err_out:
364371
__genwqe_free_consistent(cd, sgl->sgl_size, sgl->sgl,
365372
sgl->sgl_dma_addr);
373+
sgl->sgl = NULL;
374+
sgl->sgl_dma_addr = 0;
375+
sgl->sgl_size = 0;
366376
return -ENOMEM;
367377
}
368378

drivers/misc/mei/hw-txe.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -981,11 +981,13 @@ static bool mei_txe_check_and_ack_intrs(struct mei_device *dev, bool do_ack)
981981
hisr = mei_txe_br_reg_read(hw, HISR_REG);
982982

983983
aliveness = mei_txe_aliveness_get(dev);
984-
if (hhisr & IPC_HHIER_SEC && aliveness)
984+
if (hhisr & IPC_HHIER_SEC && aliveness) {
985985
ipc_isr = mei_txe_sec_reg_read_silent(hw,
986986
SEC_IPC_HOST_INT_STATUS_REG);
987-
else
987+
} else {
988988
ipc_isr = 0;
989+
hhisr &= ~IPC_HHIER_SEC;
990+
}
989991

990992
generated = generated ||
991993
(hisr & HISR_INT_STS_MSK) ||

drivers/misc/vmw_vmci/vmci_doorbell.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,12 @@ int vmci_doorbell_create(struct vmci_handle *handle,
431431
if (vmci_handle_is_invalid(*handle)) {
432432
u32 context_id = vmci_get_context_id();
433433

434+
if (context_id == VMCI_INVALID_ID) {
435+
pr_warn("Failed to get context ID\n");
436+
result = VMCI_ERROR_NO_RESOURCES;
437+
goto free_mem;
438+
}
439+
434440
/* Let resource code allocate a free ID for us */
435441
new_handle = vmci_make_handle(context_id, VMCI_INVALID_ID);
436442
} else {
@@ -525,7 +531,7 @@ int vmci_doorbell_destroy(struct vmci_handle handle)
525531

526532
entry = container_of(resource, struct dbell_entry, resource);
527533

528-
if (vmci_guest_code_active()) {
534+
if (!hlist_unhashed(&entry->node)) {
529535
int result;
530536

531537
dbell_index_table_remove(entry);

drivers/misc/vmw_vmci/vmci_driver.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,5 +113,5 @@ module_exit(vmci_drv_exit);
113113

114114
MODULE_AUTHOR("VMware, Inc.");
115115
MODULE_DESCRIPTION("VMware Virtual Machine Communication Interface.");
116-
MODULE_VERSION("1.1.4.0-k");
116+
MODULE_VERSION("1.1.5.0-k");
117117
MODULE_LICENSE("GPL v2");

drivers/vme/vme.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,16 @@ size_t vme_get_size(struct vme_resource *resource)
156156
case VME_MASTER:
157157
retval = vme_master_get(resource, &enabled, &base, &size,
158158
&aspace, &cycle, &dwidth);
159+
if (retval)
160+
return 0;
159161

160162
return size;
161163
break;
162164
case VME_SLAVE:
163165
retval = vme_slave_get(resource, &enabled, &base, &size,
164166
&buf_base, &aspace, &cycle);
167+
if (retval)
168+
return 0;
165169

166170
return size;
167171
break;

0 commit comments

Comments
 (0)