Ignore:
Timestamp:
Apr 16, 2017, 3:07:01 PM (5 weeks ago)
Author:
brainslayer
Message:

update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-3.18/drivers/staging/android/binder.c

    r25370 r31869  
    999999
    10001000static struct binder_ref *binder_get_ref(struct binder_proc *proc,
    1001                                          uint32_t desc)
     1001                                         u32 desc, bool need_strong_ref)
    10021002{
    10031003        struct rb_node *n = proc->refs_by_desc.rb_node;
     
    10071007                ref = rb_entry(n, struct binder_ref, rb_node_desc);
    10081008
    1009                 if (desc < ref->desc)
     1009                if (desc < ref->desc) {
    10101010                        n = n->rb_left;
    1011                 else if (desc > ref->desc)
     1011                } else if (desc > ref->desc) {
    10121012                        n = n->rb_right;
    1013                 else
     1013                } else if (need_strong_ref && !ref->strong) {
     1014                        binder_user_error("tried to use weak ref as strong ref\n");
     1015                        return NULL;
     1016                } else {
    10141017                        return ref;
     1018                }
    10151019        }
    10161020        return NULL;
     
    12821286                case BINDER_TYPE_HANDLE:
    12831287                case BINDER_TYPE_WEAK_HANDLE: {
    1284                         struct binder_ref *ref = binder_get_ref(proc, fp->handle);
     1288                        struct binder_ref *ref;
     1289
     1290                        ref = binder_get_ref(proc, fp->handle,
     1291                                             fp->type == BINDER_TYPE_HANDLE);
    12851292
    12861293                        if (ref == NULL) {
     
    13761383                        struct binder_ref *ref;
    13771384
    1378                         ref = binder_get_ref(proc, tr->target.handle);
     1385                        ref = binder_get_ref(proc, tr->target.handle, true);
    13791386                        if (ref == NULL) {
    13801387                                binder_user_error("%d:%d got transaction to invalid handle\n",
     
    15571564                        else
    15581565                                fp->type = BINDER_TYPE_WEAK_HANDLE;
     1566                        fp->binder = 0;
    15591567                        fp->handle = ref->desc;
     1568                        fp->cookie = 0;
    15601569                        binder_inc_ref(ref, fp->type == BINDER_TYPE_HANDLE,
    15611570                                       &thread->todo);
     
    15691578                case BINDER_TYPE_HANDLE:
    15701579                case BINDER_TYPE_WEAK_HANDLE: {
    1571                         struct binder_ref *ref = binder_get_ref(proc, fp->handle);
     1580                        struct binder_ref *ref;
     1581
     1582                        ref = binder_get_ref(proc, fp->handle,
     1583                                             fp->type == BINDER_TYPE_HANDLE);
    15721584
    15731585                        if (ref == NULL) {
     
    15991611                                        goto err_binder_get_ref_for_node_failed;
    16001612                                }
     1613                                fp->binder = 0;
    16011614                                fp->handle = new_ref->desc;
     1615                                fp->cookie = 0;
    16021616                                binder_inc_ref(new_ref, fp->type == BINDER_TYPE_HANDLE, NULL);
    16031617                                trace_binder_transaction_ref_to_ref(t, ref,
     
    16461660                                     "        fd %d -> %d\n", fp->handle, target_fd);
    16471661                        /* TODO: fput? */
     1662                        fp->binder = 0;
    16481663                        fp->handle = target_fd;
    16491664                } break;
     
    17681783                                }
    17691784                        } else
    1770                                 ref = binder_get_ref(proc, target);
     1785                                ref = binder_get_ref(proc, target,
     1786                                                     cmd == BC_ACQUIRE ||
     1787                                                     cmd == BC_RELEASE);
    17711788                        if (ref == NULL) {
    17721789                                binder_user_error("%d:%d refcount change on invalid ref %d\n",
     
    19641981                                return -EFAULT;
    19651982                        ptr += sizeof(binder_uintptr_t);
    1966                         ref = binder_get_ref(proc, target);
     1983                        ref = binder_get_ref(proc, target, false);
    19671984                        if (ref == NULL) {
    19681985                                binder_user_error("%d:%d %s invalid ref %d\n",
Note: See TracChangeset for help on using the changeset viewer.