• Sherry Yang's avatar
    android: binder: no outgoing transaction when thread todo has transaction · 44b73962
    Sherry Yang authored
    When a process dies, failed reply is sent to the sender of any transaction
    queued on a dead thread's todo list. The sender asserts that the
    received failed reply corresponds to the head of the transaction stack.
    This assert can fail if the dead thread is allowed to send outgoing
    transactions when there is already a transaction on its todo list,
    because this new transaction can end up on the transaction stack of the
    original sender. The following steps illustrate how this assertion can
    fail.
    
    1. Thread1 sends txn19 to Thread2
       (T1->transaction_stack=txn19, T2->todo+=txn19)
    2. Without processing todo list, Thread2 sends txn20 to Thread1
       (T1->todo+=txn20, T2->transaction_stack=txn20)
    3. T1 processes txn20 on its todo list
       (T1->transaction_stack=txn20->txn19, T1->todo=<empty>)
    4. T2 dies, T2->todo cleanup attempts to send failed reply for txn19, but
       T1->transaction_stack points to txn20 -- assertion failes
    
    Step 2. is the incorrect behavior. When there is a transaction on a
    thread's todo list, this thread should not be able to send any outgoing
    synchronous transactions. Only the head of the todo list needs to be
    checked because only threads that are waiting for proc work can directly
    receive work from another thread, and no work is allowed to be queued
    on such a thread without waking up the thread. This patch also enforces
    that a thread is not waiting for proc work when a work is directly
    enqueued to its todo list.
    Acked-by: default avatarArve Hjønnevåg <arve@android.com>
    Signed-off-by: default avatarSherry Yang <sherryy@android.com>
    Reviewed-by: default avatarMartijn Coenen <maco@android.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    44b73962
binder.c 163 KB