• Martijn Coenen's avatar
    ANDROID: binder: don't queue async transactions to thread. · 3a6430ce
    Martijn Coenen authored
    This can cause issues with processes using the poll()
    interface:
    
    1) client sends two oneway transactions
    2) the second one gets queued on async_todo
       (because the server didn't handle the first one
        yet)
    3) server returns from poll(), picks up the
       first transaction and does transaction work
    4) server is done with the transaction, sends
       BC_FREE_BUFFER, and the second transaction gets
       moved to thread->todo
    5) libbinder's handlePolledCommands() only handles
       the commands in the current data buffer, so
       doesn't see the new transaction
    6) the server continues running and issues a new
       outgoing transaction. Now, it suddenly finds
       the incoming oneway transaction on its thread
       todo, and returns that to userspace.
    7) userspace does not expect this to happen; it
       may be holding a lock while making the outgoing
       transaction, and if handling the incoming
       trasnaction requires taking the same lock,
       userspace will deadlock.
    
    By queueing the async transaction to the proc
    workqueue, we make sure it's only picked up when
    a thread is ready for proc work.
    Signed-off-by: default avatarMartijn Coenen <maco@android.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    3a6430ce
binder.c 157 KB