7002 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/* binder.c3 *4 * Android IPC Subsystem5 *6 * Copyright (C) 2007-2008 Google, Inc.7 */8 9/*10 * Locking overview11 *12 * There are 3 main spinlocks which must be acquired in the13 * order shown:14 *15 * 1) proc->outer_lock : protects binder_ref16 * binder_proc_lock() and binder_proc_unlock() are17 * used to acq/rel.18 * 2) node->lock : protects most fields of binder_node.19 * binder_node_lock() and binder_node_unlock() are20 * used to acq/rel21 * 3) proc->inner_lock : protects the thread and node lists22 * (proc->threads, proc->waiting_threads, proc->nodes)23 * and all todo lists associated with the binder_proc24 * (proc->todo, thread->todo, proc->delivered_death and25 * node->async_todo), as well as thread->transaction_stack26 * binder_inner_proc_lock() and binder_inner_proc_unlock()27 * are used to acq/rel28 *29 * Any lock under procA must never be nested under any lock at the same30 * level or below on procB.31 *32 * Functions that require a lock held on entry indicate which lock33 * in the suffix of the function name:34 *35 * foo_olocked() : requires node->outer_lock36 * foo_nlocked() : requires node->lock37 * foo_ilocked() : requires proc->inner_lock38 * foo_oilocked(): requires proc->outer_lock and proc->inner_lock39 * foo_nilocked(): requires node->lock and proc->inner_lock40 * ...41 */42 43#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt44 45#include <linux/fdtable.h>46#include <linux/file.h>47#include <linux/freezer.h>48#include <linux/fs.h>49#include <linux/list.h>50#include <linux/miscdevice.h>51#include <linux/module.h>52#include <linux/mutex.h>53#include <linux/nsproxy.h>54#include <linux/poll.h>55#include <linux/debugfs.h>56#include <linux/rbtree.h>57#include <linux/sched/signal.h>58#include <linux/sched/mm.h>59#include <linux/seq_file.h>60#include <linux/string.h>61#include <linux/uaccess.h>62#include <linux/pid_namespace.h>63#include <linux/security.h>64#include <linux/spinlock.h>65#include <linux/ratelimit.h>66#include <linux/syscalls.h>67#include <linux/task_work.h>68#include <linux/sizes.h>69#include <linux/ktime.h>70 71#include <uapi/linux/android/binder.h>72 73#include <linux/cacheflush.h>74 75#include "binder_internal.h"76#include "binder_trace.h"77 78static HLIST_HEAD(binder_deferred_list);79static DEFINE_MUTEX(binder_deferred_lock);80 81static HLIST_HEAD(binder_devices);82static HLIST_HEAD(binder_procs);83static DEFINE_MUTEX(binder_procs_lock);84 85static HLIST_HEAD(binder_dead_nodes);86static DEFINE_SPINLOCK(binder_dead_nodes_lock);87 88static struct dentry *binder_debugfs_dir_entry_root;89static struct dentry *binder_debugfs_dir_entry_proc;90static atomic_t binder_last_id;91 92static int proc_show(struct seq_file *m, void *unused);93DEFINE_SHOW_ATTRIBUTE(proc);94 95#define FORBIDDEN_MMAP_FLAGS (VM_WRITE)96 97enum {98 BINDER_DEBUG_USER_ERROR = 1U << 0,99 BINDER_DEBUG_FAILED_TRANSACTION = 1U << 1,100 BINDER_DEBUG_DEAD_TRANSACTION = 1U << 2,101 BINDER_DEBUG_OPEN_CLOSE = 1U << 3,102 BINDER_DEBUG_DEAD_BINDER = 1U << 4,103 BINDER_DEBUG_DEATH_NOTIFICATION = 1U << 5,104 BINDER_DEBUG_READ_WRITE = 1U << 6,105 BINDER_DEBUG_USER_REFS = 1U << 7,106 BINDER_DEBUG_THREADS = 1U << 8,107 BINDER_DEBUG_TRANSACTION = 1U << 9,108 BINDER_DEBUG_TRANSACTION_COMPLETE = 1U << 10,109 BINDER_DEBUG_FREE_BUFFER = 1U << 11,110 BINDER_DEBUG_INTERNAL_REFS = 1U << 12,111 BINDER_DEBUG_PRIORITY_CAP = 1U << 13,112 BINDER_DEBUG_SPINLOCKS = 1U << 14,113};114static uint32_t binder_debug_mask = BINDER_DEBUG_USER_ERROR |115 BINDER_DEBUG_FAILED_TRANSACTION | BINDER_DEBUG_DEAD_TRANSACTION;116module_param_named(debug_mask, binder_debug_mask, uint, 0644);117 118char *binder_devices_param = CONFIG_ANDROID_BINDER_DEVICES;119module_param_named(devices, binder_devices_param, charp, 0444);120 121static DECLARE_WAIT_QUEUE_HEAD(binder_user_error_wait);122static int binder_stop_on_user_error;123 124static int binder_set_stop_on_user_error(const char *val,125 const struct kernel_param *kp)126{127 int ret;128 129 ret = param_set_int(val, kp);130 if (binder_stop_on_user_error < 2)131 wake_up(&binder_user_error_wait);132 return ret;133}134module_param_call(stop_on_user_error, binder_set_stop_on_user_error,135 param_get_int, &binder_stop_on_user_error, 0644);136 137static __printf(2, 3) void binder_debug(int mask, const char *format, ...)138{139 struct va_format vaf;140 va_list args;141 142 if (binder_debug_mask & mask) {143 va_start(args, format);144 vaf.va = &args;145 vaf.fmt = format;146 pr_info_ratelimited("%pV", &vaf);147 va_end(args);148 }149}150 151#define binder_txn_error(x...) \152 binder_debug(BINDER_DEBUG_FAILED_TRANSACTION, x)153 154static __printf(1, 2) void binder_user_error(const char *format, ...)155{156 struct va_format vaf;157 va_list args;158 159 if (binder_debug_mask & BINDER_DEBUG_USER_ERROR) {160 va_start(args, format);161 vaf.va = &args;162 vaf.fmt = format;163 pr_info_ratelimited("%pV", &vaf);164 va_end(args);165 }166 167 if (binder_stop_on_user_error)168 binder_stop_on_user_error = 2;169}170 171#define binder_set_extended_error(ee, _id, _command, _param) \172 do { \173 (ee)->id = _id; \174 (ee)->command = _command; \175 (ee)->param = _param; \176 } while (0)177 178#define to_flat_binder_object(hdr) \179 container_of(hdr, struct flat_binder_object, hdr)180 181#define to_binder_fd_object(hdr) container_of(hdr, struct binder_fd_object, hdr)182 183#define to_binder_buffer_object(hdr) \184 container_of(hdr, struct binder_buffer_object, hdr)185 186#define to_binder_fd_array_object(hdr) \187 container_of(hdr, struct binder_fd_array_object, hdr)188 189static struct binder_stats binder_stats;190 191static inline void binder_stats_deleted(enum binder_stat_types type)192{193 atomic_inc(&binder_stats.obj_deleted[type]);194}195 196static inline void binder_stats_created(enum binder_stat_types type)197{198 atomic_inc(&binder_stats.obj_created[type]);199}200 201struct binder_transaction_log_entry {202 int debug_id;203 int debug_id_done;204 int call_type;205 int from_proc;206 int from_thread;207 int target_handle;208 int to_proc;209 int to_thread;210 int to_node;211 int data_size;212 int offsets_size;213 int return_error_line;214 uint32_t return_error;215 uint32_t return_error_param;216 char context_name[BINDERFS_MAX_NAME + 1];217};218 219struct binder_transaction_log {220 atomic_t cur;221 bool full;222 struct binder_transaction_log_entry entry[32];223};224 225static struct binder_transaction_log binder_transaction_log;226static struct binder_transaction_log binder_transaction_log_failed;227 228static struct binder_transaction_log_entry *binder_transaction_log_add(229 struct binder_transaction_log *log)230{231 struct binder_transaction_log_entry *e;232 unsigned int cur = atomic_inc_return(&log->cur);233 234 if (cur >= ARRAY_SIZE(log->entry))235 log->full = true;236 e = &log->entry[cur % ARRAY_SIZE(log->entry)];237 WRITE_ONCE(e->debug_id_done, 0);238 /*239 * write-barrier to synchronize access to e->debug_id_done.240 * We make sure the initialized 0 value is seen before241 * memset() other fields are zeroed by memset.242 */243 smp_wmb();244 memset(e, 0, sizeof(*e));245 return e;246}247 248enum binder_deferred_state {249 BINDER_DEFERRED_FLUSH = 0x01,250 BINDER_DEFERRED_RELEASE = 0x02,251};252 253enum {254 BINDER_LOOPER_STATE_REGISTERED = 0x01,255 BINDER_LOOPER_STATE_ENTERED = 0x02,256 BINDER_LOOPER_STATE_EXITED = 0x04,257 BINDER_LOOPER_STATE_INVALID = 0x08,258 BINDER_LOOPER_STATE_WAITING = 0x10,259 BINDER_LOOPER_STATE_POLL = 0x20,260};261 262/**263 * binder_proc_lock() - Acquire outer lock for given binder_proc264 * @proc: struct binder_proc to acquire265 *266 * Acquires proc->outer_lock. Used to protect binder_ref267 * structures associated with the given proc.268 */269#define binder_proc_lock(proc) _binder_proc_lock(proc, __LINE__)270static void271_binder_proc_lock(struct binder_proc *proc, int line)272 __acquires(&proc->outer_lock)273{274 binder_debug(BINDER_DEBUG_SPINLOCKS,275 "%s: line=%d\n", __func__, line);276 spin_lock(&proc->outer_lock);277}278 279/**280 * binder_proc_unlock() - Release outer lock for given binder_proc281 * @proc: struct binder_proc to acquire282 *283 * Release lock acquired via binder_proc_lock()284 */285#define binder_proc_unlock(proc) _binder_proc_unlock(proc, __LINE__)286static void287_binder_proc_unlock(struct binder_proc *proc, int line)288 __releases(&proc->outer_lock)289{290 binder_debug(BINDER_DEBUG_SPINLOCKS,291 "%s: line=%d\n", __func__, line);292 spin_unlock(&proc->outer_lock);293}294 295/**296 * binder_inner_proc_lock() - Acquire inner lock for given binder_proc297 * @proc: struct binder_proc to acquire298 *299 * Acquires proc->inner_lock. Used to protect todo lists300 */301#define binder_inner_proc_lock(proc) _binder_inner_proc_lock(proc, __LINE__)302static void303_binder_inner_proc_lock(struct binder_proc *proc, int line)304 __acquires(&proc->inner_lock)305{306 binder_debug(BINDER_DEBUG_SPINLOCKS,307 "%s: line=%d\n", __func__, line);308 spin_lock(&proc->inner_lock);309}310 311/**312 * binder_inner_proc_unlock() - Release inner lock for given binder_proc313 * @proc: struct binder_proc to acquire314 *315 * Release lock acquired via binder_inner_proc_lock()316 */317#define binder_inner_proc_unlock(proc) _binder_inner_proc_unlock(proc, __LINE__)318static void319_binder_inner_proc_unlock(struct binder_proc *proc, int line)320 __releases(&proc->inner_lock)321{322 binder_debug(BINDER_DEBUG_SPINLOCKS,323 "%s: line=%d\n", __func__, line);324 spin_unlock(&proc->inner_lock);325}326 327/**328 * binder_node_lock() - Acquire spinlock for given binder_node329 * @node: struct binder_node to acquire330 *331 * Acquires node->lock. Used to protect binder_node fields332 */333#define binder_node_lock(node) _binder_node_lock(node, __LINE__)334static void335_binder_node_lock(struct binder_node *node, int line)336 __acquires(&node->lock)337{338 binder_debug(BINDER_DEBUG_SPINLOCKS,339 "%s: line=%d\n", __func__, line);340 spin_lock(&node->lock);341}342 343/**344 * binder_node_unlock() - Release spinlock for given binder_proc345 * @node: struct binder_node to acquire346 *347 * Release lock acquired via binder_node_lock()348 */349#define binder_node_unlock(node) _binder_node_unlock(node, __LINE__)350static void351_binder_node_unlock(struct binder_node *node, int line)352 __releases(&node->lock)353{354 binder_debug(BINDER_DEBUG_SPINLOCKS,355 "%s: line=%d\n", __func__, line);356 spin_unlock(&node->lock);357}358 359/**360 * binder_node_inner_lock() - Acquire node and inner locks361 * @node: struct binder_node to acquire362 *363 * Acquires node->lock. If node->proc also acquires364 * proc->inner_lock. Used to protect binder_node fields365 */366#define binder_node_inner_lock(node) _binder_node_inner_lock(node, __LINE__)367static void368_binder_node_inner_lock(struct binder_node *node, int line)369 __acquires(&node->lock) __acquires(&node->proc->inner_lock)370{371 binder_debug(BINDER_DEBUG_SPINLOCKS,372 "%s: line=%d\n", __func__, line);373 spin_lock(&node->lock);374 if (node->proc)375 binder_inner_proc_lock(node->proc);376 else377 /* annotation for sparse */378 __acquire(&node->proc->inner_lock);379}380 381/**382 * binder_node_inner_unlock() - Release node and inner locks383 * @node: struct binder_node to acquire384 *385 * Release lock acquired via binder_node_lock()386 */387#define binder_node_inner_unlock(node) _binder_node_inner_unlock(node, __LINE__)388static void389_binder_node_inner_unlock(struct binder_node *node, int line)390 __releases(&node->lock) __releases(&node->proc->inner_lock)391{392 struct binder_proc *proc = node->proc;393 394 binder_debug(BINDER_DEBUG_SPINLOCKS,395 "%s: line=%d\n", __func__, line);396 if (proc)397 binder_inner_proc_unlock(proc);398 else399 /* annotation for sparse */400 __release(&node->proc->inner_lock);401 spin_unlock(&node->lock);402}403 404static bool binder_worklist_empty_ilocked(struct list_head *list)405{406 return list_empty(list);407}408 409/**410 * binder_worklist_empty() - Check if no items on the work list411 * @proc: binder_proc associated with list412 * @list: list to check413 *414 * Return: true if there are no items on list, else false415 */416static bool binder_worklist_empty(struct binder_proc *proc,417 struct list_head *list)418{419 bool ret;420 421 binder_inner_proc_lock(proc);422 ret = binder_worklist_empty_ilocked(list);423 binder_inner_proc_unlock(proc);424 return ret;425}426 427/**428 * binder_enqueue_work_ilocked() - Add an item to the work list429 * @work: struct binder_work to add to list430 * @target_list: list to add work to431 *432 * Adds the work to the specified list. Asserts that work433 * is not already on a list.434 *435 * Requires the proc->inner_lock to be held.436 */437static void438binder_enqueue_work_ilocked(struct binder_work *work,439 struct list_head *target_list)440{441 BUG_ON(target_list == NULL);442 BUG_ON(work->entry.next && !list_empty(&work->entry));443 list_add_tail(&work->entry, target_list);444}445 446/**447 * binder_enqueue_deferred_thread_work_ilocked() - Add deferred thread work448 * @thread: thread to queue work to449 * @work: struct binder_work to add to list450 *451 * Adds the work to the todo list of the thread. Doesn't set the process_todo452 * flag, which means that (if it wasn't already set) the thread will go to453 * sleep without handling this work when it calls read.454 *455 * Requires the proc->inner_lock to be held.456 */457static void458binder_enqueue_deferred_thread_work_ilocked(struct binder_thread *thread,459 struct binder_work *work)460{461 WARN_ON(!list_empty(&thread->waiting_thread_node));462 binder_enqueue_work_ilocked(work, &thread->todo);463}464 465/**466 * binder_enqueue_thread_work_ilocked() - Add an item to the thread work list467 * @thread: thread to queue work to468 * @work: struct binder_work to add to list469 *470 * Adds the work to the todo list of the thread, and enables processing471 * of the todo queue.472 *473 * Requires the proc->inner_lock to be held.474 */475static void476binder_enqueue_thread_work_ilocked(struct binder_thread *thread,477 struct binder_work *work)478{479 WARN_ON(!list_empty(&thread->waiting_thread_node));480 binder_enqueue_work_ilocked(work, &thread->todo);481 482 /* (e)poll-based threads require an explicit wakeup signal when483 * queuing their own work; they rely on these events to consume484 * messages without I/O block. Without it, threads risk waiting485 * indefinitely without handling the work.486 */487 if (thread->looper & BINDER_LOOPER_STATE_POLL &&488 thread->pid == current->pid && !thread->process_todo)489 wake_up_interruptible_sync(&thread->wait);490 491 thread->process_todo = true;492}493 494/**495 * binder_enqueue_thread_work() - Add an item to the thread work list496 * @thread: thread to queue work to497 * @work: struct binder_work to add to list498 *499 * Adds the work to the todo list of the thread, and enables processing500 * of the todo queue.501 */502static void503binder_enqueue_thread_work(struct binder_thread *thread,504 struct binder_work *work)505{506 binder_inner_proc_lock(thread->proc);507 binder_enqueue_thread_work_ilocked(thread, work);508 binder_inner_proc_unlock(thread->proc);509}510 511static void512binder_dequeue_work_ilocked(struct binder_work *work)513{514 list_del_init(&work->entry);515}516 517/**518 * binder_dequeue_work() - Removes an item from the work list519 * @proc: binder_proc associated with list520 * @work: struct binder_work to remove from list521 *522 * Removes the specified work item from whatever list it is on.523 * Can safely be called if work is not on any list.524 */525static void526binder_dequeue_work(struct binder_proc *proc, struct binder_work *work)527{528 binder_inner_proc_lock(proc);529 binder_dequeue_work_ilocked(work);530 binder_inner_proc_unlock(proc);531}532 533static struct binder_work *binder_dequeue_work_head_ilocked(534 struct list_head *list)535{536 struct binder_work *w;537 538 w = list_first_entry_or_null(list, struct binder_work, entry);539 if (w)540 list_del_init(&w->entry);541 return w;542}543 544static void545binder_defer_work(struct binder_proc *proc, enum binder_deferred_state defer);546static void binder_free_thread(struct binder_thread *thread);547static void binder_free_proc(struct binder_proc *proc);548static void binder_inc_node_tmpref_ilocked(struct binder_node *node);549 550static bool binder_has_work_ilocked(struct binder_thread *thread,551 bool do_proc_work)552{553 return thread->process_todo ||554 thread->looper_need_return ||555 (do_proc_work &&556 !binder_worklist_empty_ilocked(&thread->proc->todo));557}558 559static bool binder_has_work(struct binder_thread *thread, bool do_proc_work)560{561 bool has_work;562 563 binder_inner_proc_lock(thread->proc);564 has_work = binder_has_work_ilocked(thread, do_proc_work);565 binder_inner_proc_unlock(thread->proc);566 567 return has_work;568}569 570static bool binder_available_for_proc_work_ilocked(struct binder_thread *thread)571{572 return !thread->transaction_stack &&573 binder_worklist_empty_ilocked(&thread->todo);574}575 576static void binder_wakeup_poll_threads_ilocked(struct binder_proc *proc,577 bool sync)578{579 struct rb_node *n;580 struct binder_thread *thread;581 582 for (n = rb_first(&proc->threads); n != NULL; n = rb_next(n)) {583 thread = rb_entry(n, struct binder_thread, rb_node);584 if (thread->looper & BINDER_LOOPER_STATE_POLL &&585 binder_available_for_proc_work_ilocked(thread)) {586 if (sync)587 wake_up_interruptible_sync(&thread->wait);588 else589 wake_up_interruptible(&thread->wait);590 }591 }592}593 594/**595 * binder_select_thread_ilocked() - selects a thread for doing proc work.596 * @proc: process to select a thread from597 *598 * Note that calling this function moves the thread off the waiting_threads599 * list, so it can only be woken up by the caller of this function, or a600 * signal. Therefore, callers *should* always wake up the thread this function601 * returns.602 *603 * Return: If there's a thread currently waiting for process work,604 * returns that thread. Otherwise returns NULL.605 */606static struct binder_thread *607binder_select_thread_ilocked(struct binder_proc *proc)608{609 struct binder_thread *thread;610 611 assert_spin_locked(&proc->inner_lock);612 thread = list_first_entry_or_null(&proc->waiting_threads,613 struct binder_thread,614 waiting_thread_node);615 616 if (thread)617 list_del_init(&thread->waiting_thread_node);618 619 return thread;620}621 622/**623 * binder_wakeup_thread_ilocked() - wakes up a thread for doing proc work.624 * @proc: process to wake up a thread in625 * @thread: specific thread to wake-up (may be NULL)626 * @sync: whether to do a synchronous wake-up627 *628 * This function wakes up a thread in the @proc process.629 * The caller may provide a specific thread to wake-up in630 * the @thread parameter. If @thread is NULL, this function631 * will wake up threads that have called poll().632 *633 * Note that for this function to work as expected, callers634 * should first call binder_select_thread() to find a thread635 * to handle the work (if they don't have a thread already),636 * and pass the result into the @thread parameter.637 */638static void binder_wakeup_thread_ilocked(struct binder_proc *proc,639 struct binder_thread *thread,640 bool sync)641{642 assert_spin_locked(&proc->inner_lock);643 644 if (thread) {645 if (sync)646 wake_up_interruptible_sync(&thread->wait);647 else648 wake_up_interruptible(&thread->wait);649 return;650 }651 652 /* Didn't find a thread waiting for proc work; this can happen653 * in two scenarios:654 * 1. All threads are busy handling transactions655 * In that case, one of those threads should call back into656 * the kernel driver soon and pick up this work.657 * 2. Threads are using the (e)poll interface, in which case658 * they may be blocked on the waitqueue without having been659 * added to waiting_threads. For this case, we just iterate660 * over all threads not handling transaction work, and661 * wake them all up. We wake all because we don't know whether662 * a thread that called into (e)poll is handling non-binder663 * work currently.664 */665 binder_wakeup_poll_threads_ilocked(proc, sync);666}667 668static void binder_wakeup_proc_ilocked(struct binder_proc *proc)669{670 struct binder_thread *thread = binder_select_thread_ilocked(proc);671 672 binder_wakeup_thread_ilocked(proc, thread, /* sync = */false);673}674 675static void binder_set_nice(long nice)676{677 long min_nice;678 679 if (can_nice(current, nice)) {680 set_user_nice(current, nice);681 return;682 }683 min_nice = rlimit_to_nice(rlimit(RLIMIT_NICE));684 binder_debug(BINDER_DEBUG_PRIORITY_CAP,685 "%d: nice value %ld not allowed use %ld instead\n",686 current->pid, nice, min_nice);687 set_user_nice(current, min_nice);688 if (min_nice <= MAX_NICE)689 return;690 binder_user_error("%d RLIMIT_NICE not set\n", current->pid);691}692 693static struct binder_node *binder_get_node_ilocked(struct binder_proc *proc,694 binder_uintptr_t ptr)695{696 struct rb_node *n = proc->nodes.rb_node;697 struct binder_node *node;698 699 assert_spin_locked(&proc->inner_lock);700 701 while (n) {702 node = rb_entry(n, struct binder_node, rb_node);703 704 if (ptr < node->ptr)705 n = n->rb_left;706 else if (ptr > node->ptr)707 n = n->rb_right;708 else {709 /*710 * take an implicit weak reference711 * to ensure node stays alive until712 * call to binder_put_node()713 */714 binder_inc_node_tmpref_ilocked(node);715 return node;716 }717 }718 return NULL;719}720 721static struct binder_node *binder_get_node(struct binder_proc *proc,722 binder_uintptr_t ptr)723{724 struct binder_node *node;725 726 binder_inner_proc_lock(proc);727 node = binder_get_node_ilocked(proc, ptr);728 binder_inner_proc_unlock(proc);729 return node;730}731 732static struct binder_node *binder_init_node_ilocked(733 struct binder_proc *proc,734 struct binder_node *new_node,735 struct flat_binder_object *fp)736{737 struct rb_node **p = &proc->nodes.rb_node;738 struct rb_node *parent = NULL;739 struct binder_node *node;740 binder_uintptr_t ptr = fp ? fp->binder : 0;741 binder_uintptr_t cookie = fp ? fp->cookie : 0;742 __u32 flags = fp ? fp->flags : 0;743 744 assert_spin_locked(&proc->inner_lock);745 746 while (*p) {747 748 parent = *p;749 node = rb_entry(parent, struct binder_node, rb_node);750 751 if (ptr < node->ptr)752 p = &(*p)->rb_left;753 else if (ptr > node->ptr)754 p = &(*p)->rb_right;755 else {756 /*757 * A matching node is already in758 * the rb tree. Abandon the init759 * and return it.760 */761 binder_inc_node_tmpref_ilocked(node);762 return node;763 }764 }765 node = new_node;766 binder_stats_created(BINDER_STAT_NODE);767 node->tmp_refs++;768 rb_link_node(&node->rb_node, parent, p);769 rb_insert_color(&node->rb_node, &proc->nodes);770 node->debug_id = atomic_inc_return(&binder_last_id);771 node->proc = proc;772 node->ptr = ptr;773 node->cookie = cookie;774 node->work.type = BINDER_WORK_NODE;775 node->min_priority = flags & FLAT_BINDER_FLAG_PRIORITY_MASK;776 node->accept_fds = !!(flags & FLAT_BINDER_FLAG_ACCEPTS_FDS);777 node->txn_security_ctx = !!(flags & FLAT_BINDER_FLAG_TXN_SECURITY_CTX);778 spin_lock_init(&node->lock);779 INIT_LIST_HEAD(&node->work.entry);780 INIT_LIST_HEAD(&node->async_todo);781 binder_debug(BINDER_DEBUG_INTERNAL_REFS,782 "%d:%d node %d u%016llx c%016llx created\n",783 proc->pid, current->pid, node->debug_id,784 (u64)node->ptr, (u64)node->cookie);785 786 return node;787}788 789static struct binder_node *binder_new_node(struct binder_proc *proc,790 struct flat_binder_object *fp)791{792 struct binder_node *node;793 struct binder_node *new_node = kzalloc(sizeof(*node), GFP_KERNEL);794 795 if (!new_node)796 return NULL;797 binder_inner_proc_lock(proc);798 node = binder_init_node_ilocked(proc, new_node, fp);799 binder_inner_proc_unlock(proc);800 if (node != new_node)801 /*802 * The node was already added by another thread803 */804 kfree(new_node);805 806 return node;807}808 809static void binder_free_node(struct binder_node *node)810{811 kfree(node);812 binder_stats_deleted(BINDER_STAT_NODE);813}814 815static int binder_inc_node_nilocked(struct binder_node *node, int strong,816 int internal,817 struct list_head *target_list)818{819 struct binder_proc *proc = node->proc;820 821 assert_spin_locked(&node->lock);822 if (proc)823 assert_spin_locked(&proc->inner_lock);824 if (strong) {825 if (internal) {826 if (target_list == NULL &&827 node->internal_strong_refs == 0 &&828 !(node->proc &&829 node == node->proc->context->binder_context_mgr_node &&830 node->has_strong_ref)) {831 pr_err("invalid inc strong node for %d\n",832 node->debug_id);833 return -EINVAL;834 }835 node->internal_strong_refs++;836 } else837 node->local_strong_refs++;838 if (!node->has_strong_ref && target_list) {839 struct binder_thread *thread = container_of(target_list,840 struct binder_thread, todo);841 binder_dequeue_work_ilocked(&node->work);842 BUG_ON(&thread->todo != target_list);843 binder_enqueue_deferred_thread_work_ilocked(thread,844 &node->work);845 }846 } else {847 if (!internal)848 node->local_weak_refs++;849 if (!node->has_weak_ref && list_empty(&node->work.entry)) {850 if (target_list == NULL) {851 pr_err("invalid inc weak node for %d\n",852 node->debug_id);853 return -EINVAL;854 }855 /*856 * See comment above857 */858 binder_enqueue_work_ilocked(&node->work, target_list);859 }860 }861 return 0;862}863 864static int binder_inc_node(struct binder_node *node, int strong, int internal,865 struct list_head *target_list)866{867 int ret;868 869 binder_node_inner_lock(node);870 ret = binder_inc_node_nilocked(node, strong, internal, target_list);871 binder_node_inner_unlock(node);872 873 return ret;874}875 876static bool binder_dec_node_nilocked(struct binder_node *node,877 int strong, int internal)878{879 struct binder_proc *proc = node->proc;880 881 assert_spin_locked(&node->lock);882 if (proc)883 assert_spin_locked(&proc->inner_lock);884 if (strong) {885 if (internal)886 node->internal_strong_refs--;887 else888 node->local_strong_refs--;889 if (node->local_strong_refs || node->internal_strong_refs)890 return false;891 } else {892 if (!internal)893 node->local_weak_refs--;894 if (node->local_weak_refs || node->tmp_refs ||895 !hlist_empty(&node->refs))896 return false;897 }898 899 if (proc && (node->has_strong_ref || node->has_weak_ref)) {900 if (list_empty(&node->work.entry)) {901 binder_enqueue_work_ilocked(&node->work, &proc->todo);902 binder_wakeup_proc_ilocked(proc);903 }904 } else {905 if (hlist_empty(&node->refs) && !node->local_strong_refs &&906 !node->local_weak_refs && !node->tmp_refs) {907 if (proc) {908 binder_dequeue_work_ilocked(&node->work);909 rb_erase(&node->rb_node, &proc->nodes);910 binder_debug(BINDER_DEBUG_INTERNAL_REFS,911 "refless node %d deleted\n",912 node->debug_id);913 } else {914 BUG_ON(!list_empty(&node->work.entry));915 spin_lock(&binder_dead_nodes_lock);916 /*917 * tmp_refs could have changed so918 * check it again919 */920 if (node->tmp_refs) {921 spin_unlock(&binder_dead_nodes_lock);922 return false;923 }924 hlist_del(&node->dead_node);925 spin_unlock(&binder_dead_nodes_lock);926 binder_debug(BINDER_DEBUG_INTERNAL_REFS,927 "dead node %d deleted\n",928 node->debug_id);929 }930 return true;931 }932 }933 return false;934}935 936static void binder_dec_node(struct binder_node *node, int strong, int internal)937{938 bool free_node;939 940 binder_node_inner_lock(node);941 free_node = binder_dec_node_nilocked(node, strong, internal);942 binder_node_inner_unlock(node);943 if (free_node)944 binder_free_node(node);945}946 947static void binder_inc_node_tmpref_ilocked(struct binder_node *node)948{949 /*950 * No call to binder_inc_node() is needed since we951 * don't need to inform userspace of any changes to952 * tmp_refs953 */954 node->tmp_refs++;955}956 957/**958 * binder_inc_node_tmpref() - take a temporary reference on node959 * @node: node to reference960 *961 * Take reference on node to prevent the node from being freed962 * while referenced only by a local variable. The inner lock is963 * needed to serialize with the node work on the queue (which964 * isn't needed after the node is dead). If the node is dead965 * (node->proc is NULL), use binder_dead_nodes_lock to protect966 * node->tmp_refs against dead-node-only cases where the node967 * lock cannot be acquired (eg traversing the dead node list to968 * print nodes)969 */970static void binder_inc_node_tmpref(struct binder_node *node)971{972 binder_node_lock(node);973 if (node->proc)974 binder_inner_proc_lock(node->proc);975 else976 spin_lock(&binder_dead_nodes_lock);977 binder_inc_node_tmpref_ilocked(node);978 if (node->proc)979 binder_inner_proc_unlock(node->proc);980 else981 spin_unlock(&binder_dead_nodes_lock);982 binder_node_unlock(node);983}984 985/**986 * binder_dec_node_tmpref() - remove a temporary reference on node987 * @node: node to reference988 *989 * Release temporary reference on node taken via binder_inc_node_tmpref()990 */991static void binder_dec_node_tmpref(struct binder_node *node)992{993 bool free_node;994 995 binder_node_inner_lock(node);996 if (!node->proc)997 spin_lock(&binder_dead_nodes_lock);998 else999 __acquire(&binder_dead_nodes_lock);1000 node->tmp_refs--;1001 BUG_ON(node->tmp_refs < 0);1002 if (!node->proc)1003 spin_unlock(&binder_dead_nodes_lock);1004 else1005 __release(&binder_dead_nodes_lock);1006 /*1007 * Call binder_dec_node() to check if all refcounts are 01008 * and cleanup is needed. Calling with strong=0 and internal=11009 * causes no actual reference to be released in binder_dec_node().1010 * If that changes, a change is needed here too.1011 */1012 free_node = binder_dec_node_nilocked(node, 0, 1);1013 binder_node_inner_unlock(node);1014 if (free_node)1015 binder_free_node(node);1016}1017 1018static void binder_put_node(struct binder_node *node)1019{1020 binder_dec_node_tmpref(node);1021}1022 1023static struct binder_ref *binder_get_ref_olocked(struct binder_proc *proc,1024 u32 desc, bool need_strong_ref)1025{1026 struct rb_node *n = proc->refs_by_desc.rb_node;1027 struct binder_ref *ref;1028 1029 while (n) {1030 ref = rb_entry(n, struct binder_ref, rb_node_desc);1031 1032 if (desc < ref->data.desc) {1033 n = n->rb_left;1034 } else if (desc > ref->data.desc) {1035 n = n->rb_right;1036 } else if (need_strong_ref && !ref->data.strong) {1037 binder_user_error("tried to use weak ref as strong ref\n");1038 return NULL;1039 } else {1040 return ref;1041 }1042 }1043 return NULL;1044}1045 1046/* Find the smallest unused descriptor the "slow way" */1047static u32 slow_desc_lookup_olocked(struct binder_proc *proc, u32 offset)1048{1049 struct binder_ref *ref;1050 struct rb_node *n;1051 u32 desc;1052 1053 desc = offset;1054 for (n = rb_first(&proc->refs_by_desc); n; n = rb_next(n)) {1055 ref = rb_entry(n, struct binder_ref, rb_node_desc);1056 if (ref->data.desc > desc)1057 break;1058 desc = ref->data.desc + 1;1059 }1060 1061 return desc;1062}1063 1064/*1065 * Find an available reference descriptor ID. The proc->outer_lock might1066 * be released in the process, in which case -EAGAIN is returned and the1067 * @desc should be considered invalid.1068 */1069static int get_ref_desc_olocked(struct binder_proc *proc,1070 struct binder_node *node,1071 u32 *desc)1072{1073 struct dbitmap *dmap = &proc->dmap;1074 unsigned int nbits, offset;1075 unsigned long *new, bit;1076 1077 /* 0 is reserved for the context manager */1078 offset = (node == proc->context->binder_context_mgr_node) ? 0 : 1;1079 1080 if (!dbitmap_enabled(dmap)) {1081 *desc = slow_desc_lookup_olocked(proc, offset);1082 return 0;1083 }1084 1085 if (dbitmap_acquire_next_zero_bit(dmap, offset, &bit) == 0) {1086 *desc = bit;1087 return 0;1088 }1089 1090 /*1091 * The dbitmap is full and needs to grow. The proc->outer_lock1092 * is briefly released to allocate the new bitmap safely.1093 */1094 nbits = dbitmap_grow_nbits(dmap);1095 binder_proc_unlock(proc);1096 new = bitmap_zalloc(nbits, GFP_KERNEL);1097 binder_proc_lock(proc);1098 dbitmap_grow(dmap, new, nbits);1099 1100 return -EAGAIN;1101}1102 1103/**1104 * binder_get_ref_for_node_olocked() - get the ref associated with given node1105 * @proc: binder_proc that owns the ref1106 * @node: binder_node of target1107 * @new_ref: newly allocated binder_ref to be initialized or %NULL1108 *1109 * Look up the ref for the given node and return it if it exists1110 *1111 * If it doesn't exist and the caller provides a newly allocated1112 * ref, initialize the fields of the newly allocated ref and insert1113 * into the given proc rb_trees and node refs list.1114 *1115 * Return: the ref for node. It is possible that another thread1116 * allocated/initialized the ref first in which case the1117 * returned ref would be different than the passed-in1118 * new_ref. new_ref must be kfree'd by the caller in1119 * this case.1120 */1121static struct binder_ref *binder_get_ref_for_node_olocked(1122 struct binder_proc *proc,1123 struct binder_node *node,1124 struct binder_ref *new_ref)1125{1126 struct binder_ref *ref;1127 struct rb_node *parent;1128 struct rb_node **p;1129 u32 desc;1130 1131retry:1132 p = &proc->refs_by_node.rb_node;1133 parent = NULL;1134 while (*p) {1135 parent = *p;1136 ref = rb_entry(parent, struct binder_ref, rb_node_node);1137 1138 if (node < ref->node)1139 p = &(*p)->rb_left;1140 else if (node > ref->node)1141 p = &(*p)->rb_right;1142 else1143 return ref;1144 }1145 if (!new_ref)1146 return NULL;1147 1148 /* might release the proc->outer_lock */1149 if (get_ref_desc_olocked(proc, node, &desc) == -EAGAIN)1150 goto retry;1151 1152 binder_stats_created(BINDER_STAT_REF);1153 new_ref->data.debug_id = atomic_inc_return(&binder_last_id);1154 new_ref->proc = proc;1155 new_ref->node = node;1156 rb_link_node(&new_ref->rb_node_node, parent, p);1157 rb_insert_color(&new_ref->rb_node_node, &proc->refs_by_node);1158 1159 new_ref->data.desc = desc;1160 p = &proc->refs_by_desc.rb_node;1161 while (*p) {1162 parent = *p;1163 ref = rb_entry(parent, struct binder_ref, rb_node_desc);1164 1165 if (new_ref->data.desc < ref->data.desc)1166 p = &(*p)->rb_left;1167 else if (new_ref->data.desc > ref->data.desc)1168 p = &(*p)->rb_right;1169 else1170 BUG();1171 }1172 rb_link_node(&new_ref->rb_node_desc, parent, p);1173 rb_insert_color(&new_ref->rb_node_desc, &proc->refs_by_desc);1174 1175 binder_node_lock(node);1176 hlist_add_head(&new_ref->node_entry, &node->refs);1177 1178 binder_debug(BINDER_DEBUG_INTERNAL_REFS,1179 "%d new ref %d desc %d for node %d\n",1180 proc->pid, new_ref->data.debug_id, new_ref->data.desc,1181 node->debug_id);1182 binder_node_unlock(node);1183 return new_ref;1184}1185 1186static void binder_cleanup_ref_olocked(struct binder_ref *ref)1187{1188 struct dbitmap *dmap = &ref->proc->dmap;1189 bool delete_node = false;1190 1191 binder_debug(BINDER_DEBUG_INTERNAL_REFS,1192 "%d delete ref %d desc %d for node %d\n",1193 ref->proc->pid, ref->data.debug_id, ref->data.desc,1194 ref->node->debug_id);1195 1196 if (dbitmap_enabled(dmap))1197 dbitmap_clear_bit(dmap, ref->data.desc);1198 rb_erase(&ref->rb_node_desc, &ref->proc->refs_by_desc);1199 rb_erase(&ref->rb_node_node, &ref->proc->refs_by_node);1200 1201 binder_node_inner_lock(ref->node);1202 if (ref->data.strong)1203 binder_dec_node_nilocked(ref->node, 1, 1);1204 1205 hlist_del(&ref->node_entry);1206 delete_node = binder_dec_node_nilocked(ref->node, 0, 1);1207 binder_node_inner_unlock(ref->node);1208 /*1209 * Clear ref->node unless we want the caller to free the node1210 */1211 if (!delete_node) {1212 /*1213 * The caller uses ref->node to determine1214 * whether the node needs to be freed. Clear1215 * it since the node is still alive.1216 */1217 ref->node = NULL;1218 }1219 1220 if (ref->death) {1221 binder_debug(BINDER_DEBUG_DEAD_BINDER,1222 "%d delete ref %d desc %d has death notification\n",1223 ref->proc->pid, ref->data.debug_id,1224 ref->data.desc);1225 binder_dequeue_work(ref->proc, &ref->death->work);1226 binder_stats_deleted(BINDER_STAT_DEATH);1227 }1228 binder_stats_deleted(BINDER_STAT_REF);1229}1230 1231/**1232 * binder_inc_ref_olocked() - increment the ref for given handle1233 * @ref: ref to be incremented1234 * @strong: if true, strong increment, else weak1235 * @target_list: list to queue node work on1236 *1237 * Increment the ref. @ref->proc->outer_lock must be held on entry1238 *1239 * Return: 0, if successful, else errno1240 */1241static int binder_inc_ref_olocked(struct binder_ref *ref, int strong,1242 struct list_head *target_list)1243{1244 int ret;1245 1246 if (strong) {1247 if (ref->data.strong == 0) {1248 ret = binder_inc_node(ref->node, 1, 1, target_list);1249 if (ret)1250 return ret;1251 }1252 ref->data.strong++;1253 } else {1254 if (ref->data.weak == 0) {1255 ret = binder_inc_node(ref->node, 0, 1, target_list);1256 if (ret)1257 return ret;1258 }1259 ref->data.weak++;1260 }1261 return 0;1262}1263 1264/**1265 * binder_dec_ref_olocked() - dec the ref for given handle1266 * @ref: ref to be decremented1267 * @strong: if true, strong decrement, else weak1268 *1269 * Decrement the ref.1270 *1271 * Return: %true if ref is cleaned up and ready to be freed.1272 */1273static bool binder_dec_ref_olocked(struct binder_ref *ref, int strong)1274{1275 if (strong) {1276 if (ref->data.strong == 0) {1277 binder_user_error("%d invalid dec strong, ref %d desc %d s %d w %d\n",1278 ref->proc->pid, ref->data.debug_id,1279 ref->data.desc, ref->data.strong,1280 ref->data.weak);1281 return false;1282 }1283 ref->data.strong--;1284 if (ref->data.strong == 0)1285 binder_dec_node(ref->node, strong, 1);1286 } else {1287 if (ref->data.weak == 0) {1288 binder_user_error("%d invalid dec weak, ref %d desc %d s %d w %d\n",1289 ref->proc->pid, ref->data.debug_id,1290 ref->data.desc, ref->data.strong,1291 ref->data.weak);1292 return false;1293 }1294 ref->data.weak--;1295 }1296 if (ref->data.strong == 0 && ref->data.weak == 0) {1297 binder_cleanup_ref_olocked(ref);1298 return true;1299 }1300 return false;1301}1302 1303/**1304 * binder_get_node_from_ref() - get the node from the given proc/desc1305 * @proc: proc containing the ref1306 * @desc: the handle associated with the ref1307 * @need_strong_ref: if true, only return node if ref is strong1308 * @rdata: the id/refcount data for the ref1309 *1310 * Given a proc and ref handle, return the associated binder_node1311 *1312 * Return: a binder_node or NULL if not found or not strong when strong required1313 */1314static struct binder_node *binder_get_node_from_ref(1315 struct binder_proc *proc,1316 u32 desc, bool need_strong_ref,1317 struct binder_ref_data *rdata)1318{1319 struct binder_node *node;1320 struct binder_ref *ref;1321 1322 binder_proc_lock(proc);1323 ref = binder_get_ref_olocked(proc, desc, need_strong_ref);1324 if (!ref)1325 goto err_no_ref;1326 node = ref->node;1327 /*1328 * Take an implicit reference on the node to ensure1329 * it stays alive until the call to binder_put_node()1330 */1331 binder_inc_node_tmpref(node);1332 if (rdata)1333 *rdata = ref->data;1334 binder_proc_unlock(proc);1335 1336 return node;1337 1338err_no_ref:1339 binder_proc_unlock(proc);1340 return NULL;1341}1342 1343/**1344 * binder_free_ref() - free the binder_ref1345 * @ref: ref to free1346 *1347 * Free the binder_ref. Free the binder_node indicated by ref->node1348 * (if non-NULL) and the binder_ref_death indicated by ref->death.1349 */1350static void binder_free_ref(struct binder_ref *ref)1351{1352 if (ref->node)1353 binder_free_node(ref->node);1354 kfree(ref->death);1355 kfree(ref->freeze);1356 kfree(ref);1357}1358 1359/* shrink descriptor bitmap if needed */1360static void try_shrink_dmap(struct binder_proc *proc)1361{1362 unsigned long *new;1363 int nbits;1364 1365 binder_proc_lock(proc);1366 nbits = dbitmap_shrink_nbits(&proc->dmap);1367 binder_proc_unlock(proc);1368 1369 if (!nbits)1370 return;1371 1372 new = bitmap_zalloc(nbits, GFP_KERNEL);1373 binder_proc_lock(proc);1374 dbitmap_shrink(&proc->dmap, new, nbits);1375 binder_proc_unlock(proc);1376}1377 1378/**1379 * binder_update_ref_for_handle() - inc/dec the ref for given handle1380 * @proc: proc containing the ref1381 * @desc: the handle associated with the ref1382 * @increment: true=inc reference, false=dec reference1383 * @strong: true=strong reference, false=weak reference1384 * @rdata: the id/refcount data for the ref1385 *1386 * Given a proc and ref handle, increment or decrement the ref1387 * according to "increment" arg.1388 *1389 * Return: 0 if successful, else errno1390 */1391static int binder_update_ref_for_handle(struct binder_proc *proc,1392 uint32_t desc, bool increment, bool strong,1393 struct binder_ref_data *rdata)1394{1395 int ret = 0;1396 struct binder_ref *ref;1397 bool delete_ref = false;1398 1399 binder_proc_lock(proc);1400 ref = binder_get_ref_olocked(proc, desc, strong);1401 if (!ref) {1402 ret = -EINVAL;1403 goto err_no_ref;1404 }1405 if (increment)1406 ret = binder_inc_ref_olocked(ref, strong, NULL);1407 else1408 delete_ref = binder_dec_ref_olocked(ref, strong);1409 1410 if (rdata)1411 *rdata = ref->data;1412 binder_proc_unlock(proc);1413 1414 if (delete_ref) {1415 binder_free_ref(ref);1416 try_shrink_dmap(proc);1417 }1418 return ret;1419 1420err_no_ref:1421 binder_proc_unlock(proc);1422 return ret;1423}1424 1425/**1426 * binder_dec_ref_for_handle() - dec the ref for given handle1427 * @proc: proc containing the ref1428 * @desc: the handle associated with the ref1429 * @strong: true=strong reference, false=weak reference1430 * @rdata: the id/refcount data for the ref1431 *1432 * Just calls binder_update_ref_for_handle() to decrement the ref.1433 *1434 * Return: 0 if successful, else errno1435 */1436static int binder_dec_ref_for_handle(struct binder_proc *proc,1437 uint32_t desc, bool strong, struct binder_ref_data *rdata)1438{1439 return binder_update_ref_for_handle(proc, desc, false, strong, rdata);1440}1441 1442 1443/**1444 * binder_inc_ref_for_node() - increment the ref for given proc/node1445 * @proc: proc containing the ref1446 * @node: target node1447 * @strong: true=strong reference, false=weak reference1448 * @target_list: worklist to use if node is incremented1449 * @rdata: the id/refcount data for the ref1450 *1451 * Given a proc and node, increment the ref. Create the ref if it1452 * doesn't already exist1453 *1454 * Return: 0 if successful, else errno1455 */1456static int binder_inc_ref_for_node(struct binder_proc *proc,1457 struct binder_node *node,1458 bool strong,1459 struct list_head *target_list,1460 struct binder_ref_data *rdata)1461{1462 struct binder_ref *ref;1463 struct binder_ref *new_ref = NULL;1464 int ret = 0;1465 1466 binder_proc_lock(proc);1467 ref = binder_get_ref_for_node_olocked(proc, node, NULL);1468 if (!ref) {1469 binder_proc_unlock(proc);1470 new_ref = kzalloc(sizeof(*ref), GFP_KERNEL);1471 if (!new_ref)1472 return -ENOMEM;1473 binder_proc_lock(proc);1474 ref = binder_get_ref_for_node_olocked(proc, node, new_ref);1475 }1476 ret = binder_inc_ref_olocked(ref, strong, target_list);1477 *rdata = ref->data;1478 if (ret && ref == new_ref) {1479 /*1480 * Cleanup the failed reference here as the target1481 * could now be dead and have already released its1482 * references by now. Calling on the new reference1483 * with strong=0 and a tmp_refs will not decrement1484 * the node. The new_ref gets kfree'd below.1485 */1486 binder_cleanup_ref_olocked(new_ref);1487 ref = NULL;1488 }1489 1490 binder_proc_unlock(proc);1491 if (new_ref && ref != new_ref)1492 /*1493 * Another thread created the ref first so1494 * free the one we allocated1495 */1496 kfree(new_ref);1497 return ret;1498}1499 1500static void binder_pop_transaction_ilocked(struct binder_thread *target_thread,1501 struct binder_transaction *t)1502{1503 BUG_ON(!target_thread);1504 assert_spin_locked(&target_thread->proc->inner_lock);1505 BUG_ON(target_thread->transaction_stack != t);1506 BUG_ON(target_thread->transaction_stack->from != target_thread);1507 target_thread->transaction_stack =1508 target_thread->transaction_stack->from_parent;1509 t->from = NULL;1510}1511 1512/**1513 * binder_thread_dec_tmpref() - decrement thread->tmp_ref1514 * @thread: thread to decrement1515 *1516 * A thread needs to be kept alive while being used to create or1517 * handle a transaction. binder_get_txn_from() is used to safely1518 * extract t->from from a binder_transaction and keep the thread1519 * indicated by t->from from being freed. When done with that1520 * binder_thread, this function is called to decrement the1521 * tmp_ref and free if appropriate (thread has been released1522 * and no transaction being processed by the driver)1523 */1524static void binder_thread_dec_tmpref(struct binder_thread *thread)1525{1526 /*1527 * atomic is used to protect the counter value while1528 * it cannot reach zero or thread->is_dead is false1529 */1530 binder_inner_proc_lock(thread->proc);1531 atomic_dec(&thread->tmp_ref);1532 if (thread->is_dead && !atomic_read(&thread->tmp_ref)) {1533 binder_inner_proc_unlock(thread->proc);1534 binder_free_thread(thread);1535 return;1536 }1537 binder_inner_proc_unlock(thread->proc);1538}1539 1540/**1541 * binder_proc_dec_tmpref() - decrement proc->tmp_ref1542 * @proc: proc to decrement1543 *1544 * A binder_proc needs to be kept alive while being used to create or1545 * handle a transaction. proc->tmp_ref is incremented when1546 * creating a new transaction or the binder_proc is currently in-use1547 * by threads that are being released. When done with the binder_proc,1548 * this function is called to decrement the counter and free the1549 * proc if appropriate (proc has been released, all threads have1550 * been released and not currently in-use to process a transaction).1551 */1552static void binder_proc_dec_tmpref(struct binder_proc *proc)1553{1554 binder_inner_proc_lock(proc);1555 proc->tmp_ref--;1556 if (proc->is_dead && RB_EMPTY_ROOT(&proc->threads) &&1557 !proc->tmp_ref) {1558 binder_inner_proc_unlock(proc);1559 binder_free_proc(proc);1560 return;1561 }1562 binder_inner_proc_unlock(proc);1563}1564 1565/**1566 * binder_get_txn_from() - safely extract the "from" thread in transaction1567 * @t: binder transaction for t->from1568 *1569 * Atomically return the "from" thread and increment the tmp_ref1570 * count for the thread to ensure it stays alive until1571 * binder_thread_dec_tmpref() is called.1572 *1573 * Return: the value of t->from1574 */1575static struct binder_thread *binder_get_txn_from(1576 struct binder_transaction *t)1577{1578 struct binder_thread *from;1579 1580 spin_lock(&t->lock);1581 from = t->from;1582 if (from)1583 atomic_inc(&from->tmp_ref);1584 spin_unlock(&t->lock);1585 return from;1586}1587 1588/**1589 * binder_get_txn_from_and_acq_inner() - get t->from and acquire inner lock1590 * @t: binder transaction for t->from1591 *1592 * Same as binder_get_txn_from() except it also acquires the proc->inner_lock1593 * to guarantee that the thread cannot be released while operating on it.1594 * The caller must call binder_inner_proc_unlock() to release the inner lock1595 * as well as call binder_dec_thread_txn() to release the reference.1596 *1597 * Return: the value of t->from1598 */1599static struct binder_thread *binder_get_txn_from_and_acq_inner(1600 struct binder_transaction *t)1601 __acquires(&t->from->proc->inner_lock)1602{1603 struct binder_thread *from;1604 1605 from = binder_get_txn_from(t);1606 if (!from) {1607 __acquire(&from->proc->inner_lock);1608 return NULL;1609 }1610 binder_inner_proc_lock(from->proc);1611 if (t->from) {1612 BUG_ON(from != t->from);1613 return from;1614 }1615 binder_inner_proc_unlock(from->proc);1616 __acquire(&from->proc->inner_lock);1617 binder_thread_dec_tmpref(from);1618 return NULL;1619}1620 1621/**1622 * binder_free_txn_fixups() - free unprocessed fd fixups1623 * @t: binder transaction for t->from1624 *1625 * If the transaction is being torn down prior to being1626 * processed by the target process, free all of the1627 * fd fixups and fput the file structs. It is safe to1628 * call this function after the fixups have been1629 * processed -- in that case, the list will be empty.1630 */1631static void binder_free_txn_fixups(struct binder_transaction *t)1632{1633 struct binder_txn_fd_fixup *fixup, *tmp;1634 1635 list_for_each_entry_safe(fixup, tmp, &t->fd_fixups, fixup_entry) {1636 fput(fixup->file);1637 if (fixup->target_fd >= 0)1638 put_unused_fd(fixup->target_fd);1639 list_del(&fixup->fixup_entry);1640 kfree(fixup);1641 }1642}1643 1644static void binder_txn_latency_free(struct binder_transaction *t)1645{1646 int from_proc, from_thread, to_proc, to_thread;1647 1648 spin_lock(&t->lock);1649 from_proc = t->from ? t->from->proc->pid : 0;1650 from_thread = t->from ? t->from->pid : 0;1651 to_proc = t->to_proc ? t->to_proc->pid : 0;1652 to_thread = t->to_thread ? t->to_thread->pid : 0;1653 spin_unlock(&t->lock);1654 1655 trace_binder_txn_latency_free(t, from_proc, from_thread, to_proc, to_thread);1656}1657 1658static void binder_free_transaction(struct binder_transaction *t)1659{1660 struct binder_proc *target_proc = t->to_proc;1661 1662 if (target_proc) {1663 binder_inner_proc_lock(target_proc);1664 target_proc->outstanding_txns--;1665 if (target_proc->outstanding_txns < 0)1666 pr_warn("%s: Unexpected outstanding_txns %d\n",1667 __func__, target_proc->outstanding_txns);1668 if (!target_proc->outstanding_txns && target_proc->is_frozen)1669 wake_up_interruptible_all(&target_proc->freeze_wait);1670 if (t->buffer)1671 t->buffer->transaction = NULL;1672 binder_inner_proc_unlock(target_proc);1673 }1674 if (trace_binder_txn_latency_free_enabled())1675 binder_txn_latency_free(t);1676 /*1677 * If the transaction has no target_proc, then1678 * t->buffer->transaction has already been cleared.1679 */1680 binder_free_txn_fixups(t);1681 kfree(t);1682 binder_stats_deleted(BINDER_STAT_TRANSACTION);1683}1684 1685static void binder_send_failed_reply(struct binder_transaction *t,1686 uint32_t error_code)1687{1688 struct binder_thread *target_thread;1689 struct binder_transaction *next;1690 1691 BUG_ON(t->flags & TF_ONE_WAY);1692 while (1) {1693 target_thread = binder_get_txn_from_and_acq_inner(t);1694 if (target_thread) {1695 binder_debug(BINDER_DEBUG_FAILED_TRANSACTION,1696 "send failed reply for transaction %d to %d:%d\n",1697 t->debug_id,1698 target_thread->proc->pid,1699 target_thread->pid);1700 1701 binder_pop_transaction_ilocked(target_thread, t);1702 if (target_thread->reply_error.cmd == BR_OK) {1703 target_thread->reply_error.cmd = error_code;1704 binder_enqueue_thread_work_ilocked(1705 target_thread,1706 &target_thread->reply_error.work);1707 wake_up_interruptible(&target_thread->wait);1708 } else {1709 /*1710 * Cannot get here for normal operation, but1711 * we can if multiple synchronous transactions1712 * are sent without blocking for responses.1713 * Just ignore the 2nd error in this case.1714 */1715 pr_warn("Unexpected reply error: %u\n",1716 target_thread->reply_error.cmd);1717 }1718 binder_inner_proc_unlock(target_thread->proc);1719 binder_thread_dec_tmpref(target_thread);1720 binder_free_transaction(t);1721 return;1722 }1723 __release(&target_thread->proc->inner_lock);1724 next = t->from_parent;1725 1726 binder_debug(BINDER_DEBUG_FAILED_TRANSACTION,1727 "send failed reply for transaction %d, target dead\n",1728 t->debug_id);1729 1730 binder_free_transaction(t);1731 if (next == NULL) {1732 binder_debug(BINDER_DEBUG_DEAD_BINDER,1733 "reply failed, no target thread at root\n");1734 return;1735 }1736 t = next;1737 binder_debug(BINDER_DEBUG_DEAD_BINDER,1738 "reply failed, no target thread -- retry %d\n",1739 t->debug_id);1740 }1741}1742 1743/**1744 * binder_cleanup_transaction() - cleans up undelivered transaction1745 * @t: transaction that needs to be cleaned up1746 * @reason: reason the transaction wasn't delivered1747 * @error_code: error to return to caller (if synchronous call)1748 */1749static void binder_cleanup_transaction(struct binder_transaction *t,1750 const char *reason,1751 uint32_t error_code)1752{1753 if (t->buffer->target_node && !(t->flags & TF_ONE_WAY)) {1754 binder_send_failed_reply(t, error_code);1755 } else {1756 binder_debug(BINDER_DEBUG_DEAD_TRANSACTION,1757 "undelivered transaction %d, %s\n",1758 t->debug_id, reason);1759 binder_free_transaction(t);1760 }1761}1762 1763/**1764 * binder_get_object() - gets object and checks for valid metadata1765 * @proc: binder_proc owning the buffer1766 * @u: sender's user pointer to base of buffer1767 * @buffer: binder_buffer that we're parsing.1768 * @offset: offset in the @buffer at which to validate an object.1769 * @object: struct binder_object to read into1770 *1771 * Copy the binder object at the given offset into @object. If @u is1772 * provided then the copy is from the sender's buffer. If not, then1773 * it is copied from the target's @buffer.1774 *1775 * Return: If there's a valid metadata object at @offset, the1776 * size of that object. Otherwise, it returns zero. The object1777 * is read into the struct binder_object pointed to by @object.1778 */1779static size_t binder_get_object(struct binder_proc *proc,1780 const void __user *u,1781 struct binder_buffer *buffer,1782 unsigned long offset,1783 struct binder_object *object)1784{1785 size_t read_size;1786 struct binder_object_header *hdr;1787 size_t object_size = 0;1788 1789 read_size = min_t(size_t, sizeof(*object), buffer->data_size - offset);1790 if (offset > buffer->data_size || read_size < sizeof(*hdr) ||1791 !IS_ALIGNED(offset, sizeof(u32)))1792 return 0;1793 1794 if (u) {1795 if (copy_from_user(object, u + offset, read_size))1796 return 0;1797 } else {1798 if (binder_alloc_copy_from_buffer(&proc->alloc, object, buffer,1799 offset, read_size))1800 return 0;1801 }1802 1803 /* Ok, now see if we read a complete object. */1804 hdr = &object->hdr;1805 switch (hdr->type) {1806 case BINDER_TYPE_BINDER:1807 case BINDER_TYPE_WEAK_BINDER:1808 case BINDER_TYPE_HANDLE:1809 case BINDER_TYPE_WEAK_HANDLE:1810 object_size = sizeof(struct flat_binder_object);1811 break;1812 case BINDER_TYPE_FD:1813 object_size = sizeof(struct binder_fd_object);1814 break;1815 case BINDER_TYPE_PTR:1816 object_size = sizeof(struct binder_buffer_object);1817 break;1818 case BINDER_TYPE_FDA:1819 object_size = sizeof(struct binder_fd_array_object);1820 break;1821 default:1822 return 0;1823 }1824 if (offset <= buffer->data_size - object_size &&1825 buffer->data_size >= object_size)1826 return object_size;1827 else1828 return 0;1829}1830 1831/**1832 * binder_validate_ptr() - validates binder_buffer_object in a binder_buffer.1833 * @proc: binder_proc owning the buffer1834 * @b: binder_buffer containing the object1835 * @object: struct binder_object to read into1836 * @index: index in offset array at which the binder_buffer_object is1837 * located1838 * @start_offset: points to the start of the offset array1839 * @object_offsetp: offset of @object read from @b1840 * @num_valid: the number of valid offsets in the offset array1841 *1842 * Return: If @index is within the valid range of the offset array1843 * described by @start and @num_valid, and if there's a valid1844 * binder_buffer_object at the offset found in index @index1845 * of the offset array, that object is returned. Otherwise,1846 * %NULL is returned.1847 * Note that the offset found in index @index itself is not1848 * verified; this function assumes that @num_valid elements1849 * from @start were previously verified to have valid offsets.1850 * If @object_offsetp is non-NULL, then the offset within1851 * @b is written to it.1852 */1853static struct binder_buffer_object *binder_validate_ptr(1854 struct binder_proc *proc,1855 struct binder_buffer *b,1856 struct binder_object *object,1857 binder_size_t index,1858 binder_size_t start_offset,1859 binder_size_t *object_offsetp,1860 binder_size_t num_valid)1861{1862 size_t object_size;1863 binder_size_t object_offset;1864 unsigned long buffer_offset;1865 1866 if (index >= num_valid)1867 return NULL;1868 1869 buffer_offset = start_offset + sizeof(binder_size_t) * index;1870 if (binder_alloc_copy_from_buffer(&proc->alloc, &object_offset,1871 b, buffer_offset,1872 sizeof(object_offset)))1873 return NULL;1874 object_size = binder_get_object(proc, NULL, b, object_offset, object);1875 if (!object_size || object->hdr.type != BINDER_TYPE_PTR)1876 return NULL;1877 if (object_offsetp)1878 *object_offsetp = object_offset;1879 1880 return &object->bbo;1881}1882 1883/**1884 * binder_validate_fixup() - validates pointer/fd fixups happen in order.1885 * @proc: binder_proc owning the buffer1886 * @b: transaction buffer1887 * @objects_start_offset: offset to start of objects buffer1888 * @buffer_obj_offset: offset to binder_buffer_object in which to fix up1889 * @fixup_offset: start offset in @buffer to fix up1890 * @last_obj_offset: offset to last binder_buffer_object that we fixed1891 * @last_min_offset: minimum fixup offset in object at @last_obj_offset1892 *1893 * Return: %true if a fixup in buffer @buffer at offset @offset is1894 * allowed.1895 *1896 * For safety reasons, we only allow fixups inside a buffer to happen1897 * at increasing offsets; additionally, we only allow fixup on the last1898 * buffer object that was verified, or one of its parents.1899 *1900 * Example of what is allowed:1901 *1902 * A1903 * B (parent = A, offset = 0)1904 * C (parent = A, offset = 16)1905 * D (parent = C, offset = 0)1906 * E (parent = A, offset = 32) // min_offset is 16 (C.parent_offset)1907 *1908 * Examples of what is not allowed:1909 *1910 * Decreasing offsets within the same parent:1911 * A1912 * C (parent = A, offset = 16)1913 * B (parent = A, offset = 0) // decreasing offset within A1914 *1915 * Referring to a parent that wasn't the last object or any of its parents:1916 * A1917 * B (parent = A, offset = 0)1918 * C (parent = A, offset = 0)1919 * C (parent = A, offset = 16)1920 * D (parent = B, offset = 0) // B is not A or any of A's parents1921 */1922static bool binder_validate_fixup(struct binder_proc *proc,1923 struct binder_buffer *b,1924 binder_size_t objects_start_offset,1925 binder_size_t buffer_obj_offset,1926 binder_size_t fixup_offset,1927 binder_size_t last_obj_offset,1928 binder_size_t last_min_offset)1929{1930 if (!last_obj_offset) {1931 /* Nothing to fix up in */1932 return false;1933 }1934 1935 while (last_obj_offset != buffer_obj_offset) {1936 unsigned long buffer_offset;1937 struct binder_object last_object;1938 struct binder_buffer_object *last_bbo;1939 size_t object_size = binder_get_object(proc, NULL, b,1940 last_obj_offset,1941 &last_object);1942 if (object_size != sizeof(*last_bbo))1943 return false;1944 1945 last_bbo = &last_object.bbo;1946 /*1947 * Safe to retrieve the parent of last_obj, since it1948 * was already previously verified by the driver.1949 */1950 if ((last_bbo->flags & BINDER_BUFFER_FLAG_HAS_PARENT) == 0)1951 return false;1952 last_min_offset = last_bbo->parent_offset + sizeof(uintptr_t);1953 buffer_offset = objects_start_offset +1954 sizeof(binder_size_t) * last_bbo->parent;1955 if (binder_alloc_copy_from_buffer(&proc->alloc,1956 &last_obj_offset,1957 b, buffer_offset,1958 sizeof(last_obj_offset)))1959 return false;1960 }1961 return (fixup_offset >= last_min_offset);1962}1963 1964/**1965 * struct binder_task_work_cb - for deferred close1966 *1967 * @twork: callback_head for task work1968 * @fd: fd to close1969 *1970 * Structure to pass task work to be handled after1971 * returning from binder_ioctl() via task_work_add().1972 */1973struct binder_task_work_cb {1974 struct callback_head twork;1975 struct file *file;1976};1977 1978/**1979 * binder_do_fd_close() - close list of file descriptors1980 * @twork: callback head for task work1981 *1982 * It is not safe to call ksys_close() during the binder_ioctl()1983 * function if there is a chance that binder's own file descriptor1984 * might be closed. This is to meet the requirements for using1985 * fdget() (see comments for __fget_light()). Therefore use1986 * task_work_add() to schedule the close operation once we have1987 * returned from binder_ioctl(). This function is a callback1988 * for that mechanism and does the actual ksys_close() on the1989 * given file descriptor.1990 */1991static void binder_do_fd_close(struct callback_head *twork)1992{1993 struct binder_task_work_cb *twcb = container_of(twork,1994 struct binder_task_work_cb, twork);1995 1996 fput(twcb->file);1997 kfree(twcb);1998}1999 2000/**2001 * binder_deferred_fd_close() - schedule a close for the given file-descriptor2002 * @fd: file-descriptor to close2003 *2004 * See comments in binder_do_fd_close(). This function is used to schedule2005 * a file-descriptor to be closed after returning from binder_ioctl().2006 */2007static void binder_deferred_fd_close(int fd)2008{2009 struct binder_task_work_cb *twcb;2010 2011 twcb = kzalloc(sizeof(*twcb), GFP_KERNEL);2012 if (!twcb)2013 return;2014 init_task_work(&twcb->twork, binder_do_fd_close);2015 twcb->file = file_close_fd(fd);2016 if (twcb->file) {2017 // pin it until binder_do_fd_close(); see comments there2018 get_file(twcb->file);2019 filp_close(twcb->file, current->files);2020 task_work_add(current, &twcb->twork, TWA_RESUME);2021 } else {2022 kfree(twcb);2023 }2024}2025 2026static void binder_transaction_buffer_release(struct binder_proc *proc,2027 struct binder_thread *thread,2028 struct binder_buffer *buffer,2029 binder_size_t off_end_offset,2030 bool is_failure)2031{2032 int debug_id = buffer->debug_id;2033 binder_size_t off_start_offset, buffer_offset;2034 2035 binder_debug(BINDER_DEBUG_TRANSACTION,2036 "%d buffer release %d, size %zd-%zd, failed at %llx\n",2037 proc->pid, buffer->debug_id,2038 buffer->data_size, buffer->offsets_size,2039 (unsigned long long)off_end_offset);2040 2041 if (buffer->target_node)2042 binder_dec_node(buffer->target_node, 1, 0);2043 2044 off_start_offset = ALIGN(buffer->data_size, sizeof(void *));2045 2046 for (buffer_offset = off_start_offset; buffer_offset < off_end_offset;2047 buffer_offset += sizeof(binder_size_t)) {2048 struct binder_object_header *hdr;2049 size_t object_size = 0;2050 struct binder_object object;2051 binder_size_t object_offset;2052 2053 if (!binder_alloc_copy_from_buffer(&proc->alloc, &object_offset,2054 buffer, buffer_offset,2055 sizeof(object_offset)))2056 object_size = binder_get_object(proc, NULL, buffer,2057 object_offset, &object);2058 if (object_size == 0) {2059 pr_err("transaction release %d bad object at offset %lld, size %zd\n",2060 debug_id, (u64)object_offset, buffer->data_size);2061 continue;2062 }2063 hdr = &object.hdr;2064 switch (hdr->type) {2065 case BINDER_TYPE_BINDER:2066 case BINDER_TYPE_WEAK_BINDER: {2067 struct flat_binder_object *fp;2068 struct binder_node *node;2069 2070 fp = to_flat_binder_object(hdr);2071 node = binder_get_node(proc, fp->binder);2072 if (node == NULL) {2073 pr_err("transaction release %d bad node %016llx\n",2074 debug_id, (u64)fp->binder);2075 break;2076 }2077 binder_debug(BINDER_DEBUG_TRANSACTION,2078 " node %d u%016llx\n",2079 node->debug_id, (u64)node->ptr);2080 binder_dec_node(node, hdr->type == BINDER_TYPE_BINDER,2081 0);2082 binder_put_node(node);2083 } break;2084 case BINDER_TYPE_HANDLE:2085 case BINDER_TYPE_WEAK_HANDLE: {2086 struct flat_binder_object *fp;2087 struct binder_ref_data rdata;2088 int ret;2089 2090 fp = to_flat_binder_object(hdr);2091 ret = binder_dec_ref_for_handle(proc, fp->handle,2092 hdr->type == BINDER_TYPE_HANDLE, &rdata);2093 2094 if (ret) {2095 pr_err("transaction release %d bad handle %d, ret = %d\n",2096 debug_id, fp->handle, ret);2097 break;2098 }2099 binder_debug(BINDER_DEBUG_TRANSACTION,2100 " ref %d desc %d\n",2101 rdata.debug_id, rdata.desc);2102 } break;2103 2104 case BINDER_TYPE_FD: {2105 /*2106 * No need to close the file here since user-space2107 * closes it for successfully delivered2108 * transactions. For transactions that weren't2109 * delivered, the new fd was never allocated so2110 * there is no need to close and the fput on the2111 * file is done when the transaction is torn2112 * down.2113 */2114 } break;2115 case BINDER_TYPE_PTR:2116 /*2117 * Nothing to do here, this will get cleaned up when the2118 * transaction buffer gets freed2119 */2120 break;2121 case BINDER_TYPE_FDA: {2122 struct binder_fd_array_object *fda;2123 struct binder_buffer_object *parent;2124 struct binder_object ptr_object;2125 binder_size_t fda_offset;2126 size_t fd_index;2127 binder_size_t fd_buf_size;2128 binder_size_t num_valid;2129 2130 if (is_failure) {2131 /*2132 * The fd fixups have not been applied so no2133 * fds need to be closed.2134 */2135 continue;2136 }2137 2138 num_valid = (buffer_offset - off_start_offset) /2139 sizeof(binder_size_t);2140 fda = to_binder_fd_array_object(hdr);2141 parent = binder_validate_ptr(proc, buffer, &ptr_object,2142 fda->parent,2143 off_start_offset,2144 NULL,2145 num_valid);2146 if (!parent) {2147 pr_err("transaction release %d bad parent offset\n",2148 debug_id);2149 continue;2150 }2151 fd_buf_size = sizeof(u32) * fda->num_fds;2152 if (fda->num_fds >= SIZE_MAX / sizeof(u32)) {2153 pr_err("transaction release %d invalid number of fds (%lld)\n",2154 debug_id, (u64)fda->num_fds);2155 continue;2156 }2157 if (fd_buf_size > parent->length ||2158 fda->parent_offset > parent->length - fd_buf_size) {2159 /* No space for all file descriptors here. */2160 pr_err("transaction release %d not enough space for %lld fds in buffer\n",2161 debug_id, (u64)fda->num_fds);2162 continue;2163 }2164 /*2165 * the source data for binder_buffer_object is visible2166 * to user-space and the @buffer element is the user2167 * pointer to the buffer_object containing the fd_array.2168 * Convert the address to an offset relative to2169 * the base of the transaction buffer.2170 */2171 fda_offset = parent->buffer - buffer->user_data +2172 fda->parent_offset;2173 for (fd_index = 0; fd_index < fda->num_fds;2174 fd_index++) {2175 u32 fd;2176 int err;2177 binder_size_t offset = fda_offset +2178 fd_index * sizeof(fd);2179 2180 err = binder_alloc_copy_from_buffer(2181 &proc->alloc, &fd, buffer,2182 offset, sizeof(fd));2183 WARN_ON(err);2184 if (!err) {2185 binder_deferred_fd_close(fd);2186 /*2187 * Need to make sure the thread goes2188 * back to userspace to complete the2189 * deferred close2190 */2191 if (thread)2192 thread->looper_need_return = true;2193 }2194 }2195 } break;2196 default:2197 pr_err("transaction release %d bad object type %x\n",2198 debug_id, hdr->type);2199 break;2200 }2201 }2202}2203 2204/* Clean up all the objects in the buffer */2205static inline void binder_release_entire_buffer(struct binder_proc *proc,2206 struct binder_thread *thread,2207 struct binder_buffer *buffer,2208 bool is_failure)2209{2210 binder_size_t off_end_offset;2211 2212 off_end_offset = ALIGN(buffer->data_size, sizeof(void *));2213 off_end_offset += buffer->offsets_size;2214 2215 binder_transaction_buffer_release(proc, thread, buffer,2216 off_end_offset, is_failure);2217}2218 2219static int binder_translate_binder(struct flat_binder_object *fp,2220 struct binder_transaction *t,2221 struct binder_thread *thread)2222{2223 struct binder_node *node;2224 struct binder_proc *proc = thread->proc;2225 struct binder_proc *target_proc = t->to_proc;2226 struct binder_ref_data rdata;2227 int ret = 0;2228 2229 node = binder_get_node(proc, fp->binder);2230 if (!node) {2231 node = binder_new_node(proc, fp);2232 if (!node)2233 return -ENOMEM;2234 }2235 if (fp->cookie != node->cookie) {2236 binder_user_error("%d:%d sending u%016llx node %d, cookie mismatch %016llx != %016llx\n",2237 proc->pid, thread->pid, (u64)fp->binder,2238 node->debug_id, (u64)fp->cookie,2239 (u64)node->cookie);2240 ret = -EINVAL;2241 goto done;2242 }2243 if (security_binder_transfer_binder(proc->cred, target_proc->cred)) {2244 ret = -EPERM;2245 goto done;2246 }2247 2248 ret = binder_inc_ref_for_node(target_proc, node,2249 fp->hdr.type == BINDER_TYPE_BINDER,2250 &thread->todo, &rdata);2251 if (ret)2252 goto done;2253 2254 if (fp->hdr.type == BINDER_TYPE_BINDER)2255 fp->hdr.type = BINDER_TYPE_HANDLE;2256 else2257 fp->hdr.type = BINDER_TYPE_WEAK_HANDLE;2258 fp->binder = 0;2259 fp->handle = rdata.desc;2260 fp->cookie = 0;2261 2262 trace_binder_transaction_node_to_ref(t, node, &rdata);2263 binder_debug(BINDER_DEBUG_TRANSACTION,2264 " node %d u%016llx -> ref %d desc %d\n",2265 node->debug_id, (u64)node->ptr,2266 rdata.debug_id, rdata.desc);2267done:2268 binder_put_node(node);2269 return ret;2270}2271 2272static int binder_translate_handle(struct flat_binder_object *fp,2273 struct binder_transaction *t,2274 struct binder_thread *thread)2275{2276 struct binder_proc *proc = thread->proc;2277 struct binder_proc *target_proc = t->to_proc;2278 struct binder_node *node;2279 struct binder_ref_data src_rdata;2280 int ret = 0;2281 2282 node = binder_get_node_from_ref(proc, fp->handle,2283 fp->hdr.type == BINDER_TYPE_HANDLE, &src_rdata);2284 if (!node) {2285 binder_user_error("%d:%d got transaction with invalid handle, %d\n",2286 proc->pid, thread->pid, fp->handle);2287 return -EINVAL;2288 }2289 if (security_binder_transfer_binder(proc->cred, target_proc->cred)) {2290 ret = -EPERM;2291 goto done;2292 }2293 2294 binder_node_lock(node);2295 if (node->proc == target_proc) {2296 if (fp->hdr.type == BINDER_TYPE_HANDLE)2297 fp->hdr.type = BINDER_TYPE_BINDER;2298 else2299 fp->hdr.type = BINDER_TYPE_WEAK_BINDER;2300 fp->binder = node->ptr;2301 fp->cookie = node->cookie;2302 if (node->proc)2303 binder_inner_proc_lock(node->proc);2304 else2305 __acquire(&node->proc->inner_lock);2306 binder_inc_node_nilocked(node,2307 fp->hdr.type == BINDER_TYPE_BINDER,2308 0, NULL);2309 if (node->proc)2310 binder_inner_proc_unlock(node->proc);2311 else2312 __release(&node->proc->inner_lock);2313 trace_binder_transaction_ref_to_node(t, node, &src_rdata);2314 binder_debug(BINDER_DEBUG_TRANSACTION,2315 " ref %d desc %d -> node %d u%016llx\n",2316 src_rdata.debug_id, src_rdata.desc, node->debug_id,2317 (u64)node->ptr);2318 binder_node_unlock(node);2319 } else {2320 struct binder_ref_data dest_rdata;2321 2322 binder_node_unlock(node);2323 ret = binder_inc_ref_for_node(target_proc, node,2324 fp->hdr.type == BINDER_TYPE_HANDLE,2325 NULL, &dest_rdata);2326 if (ret)2327 goto done;2328 2329 fp->binder = 0;2330 fp->handle = dest_rdata.desc;2331 fp->cookie = 0;2332 trace_binder_transaction_ref_to_ref(t, node, &src_rdata,2333 &dest_rdata);2334 binder_debug(BINDER_DEBUG_TRANSACTION,2335 " ref %d desc %d -> ref %d desc %d (node %d)\n",2336 src_rdata.debug_id, src_rdata.desc,2337 dest_rdata.debug_id, dest_rdata.desc,2338 node->debug_id);2339 }2340done:2341 binder_put_node(node);2342 return ret;2343}2344 2345static int binder_translate_fd(u32 fd, binder_size_t fd_offset,2346 struct binder_transaction *t,2347 struct binder_thread *thread,2348 struct binder_transaction *in_reply_to)2349{2350 struct binder_proc *proc = thread->proc;2351 struct binder_proc *target_proc = t->to_proc;2352 struct binder_txn_fd_fixup *fixup;2353 struct file *file;2354 int ret = 0;2355 bool target_allows_fd;2356 2357 if (in_reply_to)2358 target_allows_fd = !!(in_reply_to->flags & TF_ACCEPT_FDS);2359 else2360 target_allows_fd = t->buffer->target_node->accept_fds;2361 if (!target_allows_fd) {2362 binder_user_error("%d:%d got %s with fd, %d, but target does not allow fds\n",2363 proc->pid, thread->pid,2364 in_reply_to ? "reply" : "transaction",2365 fd);2366 ret = -EPERM;2367 goto err_fd_not_accepted;2368 }2369 2370 file = fget(fd);2371 if (!file) {2372 binder_user_error("%d:%d got transaction with invalid fd, %d\n",2373 proc->pid, thread->pid, fd);2374 ret = -EBADF;2375 goto err_fget;2376 }2377 ret = security_binder_transfer_file(proc->cred, target_proc->cred, file);2378 if (ret < 0) {2379 ret = -EPERM;2380 goto err_security;2381 }2382 2383 /*2384 * Add fixup record for this transaction. The allocation2385 * of the fd in the target needs to be done from a2386 * target thread.2387 */2388 fixup = kzalloc(sizeof(*fixup), GFP_KERNEL);2389 if (!fixup) {2390 ret = -ENOMEM;2391 goto err_alloc;2392 }2393 fixup->file = file;2394 fixup->offset = fd_offset;2395 fixup->target_fd = -1;2396 trace_binder_transaction_fd_send(t, fd, fixup->offset);2397 list_add_tail(&fixup->fixup_entry, &t->fd_fixups);2398 2399 return ret;2400 2401err_alloc:2402err_security:2403 fput(file);2404err_fget:2405err_fd_not_accepted:2406 return ret;2407}2408 2409/**2410 * struct binder_ptr_fixup - data to be fixed-up in target buffer2411 * @offset offset in target buffer to fixup2412 * @skip_size bytes to skip in copy (fixup will be written later)2413 * @fixup_data data to write at fixup offset2414 * @node list node2415 *2416 * This is used for the pointer fixup list (pf) which is created and consumed2417 * during binder_transaction() and is only accessed locally. No2418 * locking is necessary.2419 *2420 * The list is ordered by @offset.2421 */2422struct binder_ptr_fixup {2423 binder_size_t offset;2424 size_t skip_size;2425 binder_uintptr_t fixup_data;2426 struct list_head node;2427};2428 2429/**2430 * struct binder_sg_copy - scatter-gather data to be copied2431 * @offset offset in target buffer2432 * @sender_uaddr user address in source buffer2433 * @length bytes to copy2434 * @node list node2435 *2436 * This is used for the sg copy list (sgc) which is created and consumed2437 * during binder_transaction() and is only accessed locally. No2438 * locking is necessary.2439 *2440 * The list is ordered by @offset.2441 */2442struct binder_sg_copy {2443 binder_size_t offset;2444 const void __user *sender_uaddr;2445 size_t length;2446 struct list_head node;2447};2448 2449/**2450 * binder_do_deferred_txn_copies() - copy and fixup scatter-gather data2451 * @alloc: binder_alloc associated with @buffer2452 * @buffer: binder buffer in target process2453 * @sgc_head: list_head of scatter-gather copy list2454 * @pf_head: list_head of pointer fixup list2455 *2456 * Processes all elements of @sgc_head, applying fixups from @pf_head2457 * and copying the scatter-gather data from the source process' user2458 * buffer to the target's buffer. It is expected that the list creation2459 * and processing all occurs during binder_transaction() so these lists2460 * are only accessed in local context.2461 *2462 * Return: 0=success, else -errno2463 */2464static int binder_do_deferred_txn_copies(struct binder_alloc *alloc,2465 struct binder_buffer *buffer,2466 struct list_head *sgc_head,2467 struct list_head *pf_head)2468{2469 int ret = 0;2470 struct binder_sg_copy *sgc, *tmpsgc;2471 struct binder_ptr_fixup *tmppf;2472 struct binder_ptr_fixup *pf =2473 list_first_entry_or_null(pf_head, struct binder_ptr_fixup,2474 node);2475 2476 list_for_each_entry_safe(sgc, tmpsgc, sgc_head, node) {2477 size_t bytes_copied = 0;2478 2479 while (bytes_copied < sgc->length) {2480 size_t copy_size;2481 size_t bytes_left = sgc->length - bytes_copied;2482 size_t offset = sgc->offset + bytes_copied;2483 2484 /*2485 * We copy up to the fixup (pointed to by pf)2486 */2487 copy_size = pf ? min(bytes_left, (size_t)pf->offset - offset)2488 : bytes_left;2489 if (!ret && copy_size)2490 ret = binder_alloc_copy_user_to_buffer(2491 alloc, buffer,2492 offset,2493 sgc->sender_uaddr + bytes_copied,2494 copy_size);2495 bytes_copied += copy_size;2496 if (copy_size != bytes_left) {2497 BUG_ON(!pf);2498 /* we stopped at a fixup offset */2499 if (pf->skip_size) {2500 /*2501 * we are just skipping. This is for2502 * BINDER_TYPE_FDA where the translated2503 * fds will be fixed up when we get2504 * to target context.2505 */2506 bytes_copied += pf->skip_size;2507 } else {2508 /* apply the fixup indicated by pf */2509 if (!ret)2510 ret = binder_alloc_copy_to_buffer(2511 alloc, buffer,2512 pf->offset,2513 &pf->fixup_data,2514 sizeof(pf->fixup_data));2515 bytes_copied += sizeof(pf->fixup_data);2516 }2517 list_del(&pf->node);2518 kfree(pf);2519 pf = list_first_entry_or_null(pf_head,2520 struct binder_ptr_fixup, node);2521 }2522 }2523 list_del(&sgc->node);2524 kfree(sgc);2525 }2526 list_for_each_entry_safe(pf, tmppf, pf_head, node) {2527 BUG_ON(pf->skip_size == 0);2528 list_del(&pf->node);2529 kfree(pf);2530 }2531 BUG_ON(!list_empty(sgc_head));2532 2533 return ret > 0 ? -EINVAL : ret;2534}2535 2536/**2537 * binder_cleanup_deferred_txn_lists() - free specified lists2538 * @sgc_head: list_head of scatter-gather copy list2539 * @pf_head: list_head of pointer fixup list2540 *2541 * Called to clean up @sgc_head and @pf_head if there is an2542 * error.2543 */2544static void binder_cleanup_deferred_txn_lists(struct list_head *sgc_head,2545 struct list_head *pf_head)2546{2547 struct binder_sg_copy *sgc, *tmpsgc;2548 struct binder_ptr_fixup *pf, *tmppf;2549 2550 list_for_each_entry_safe(sgc, tmpsgc, sgc_head, node) {2551 list_del(&sgc->node);2552 kfree(sgc);2553 }2554 list_for_each_entry_safe(pf, tmppf, pf_head, node) {2555 list_del(&pf->node);2556 kfree(pf);2557 }2558}2559 2560/**2561 * binder_defer_copy() - queue a scatter-gather buffer for copy2562 * @sgc_head: list_head of scatter-gather copy list2563 * @offset: binder buffer offset in target process2564 * @sender_uaddr: user address in source process2565 * @length: bytes to copy2566 *2567 * Specify a scatter-gather block to be copied. The actual copy must2568 * be deferred until all the needed fixups are identified and queued.2569 * Then the copy and fixups are done together so un-translated values2570 * from the source are never visible in the target buffer.2571 *2572 * We are guaranteed that repeated calls to this function will have2573 * monotonically increasing @offset values so the list will naturally2574 * be ordered.2575 *2576 * Return: 0=success, else -errno2577 */2578static int binder_defer_copy(struct list_head *sgc_head, binder_size_t offset,2579 const void __user *sender_uaddr, size_t length)2580{2581 struct binder_sg_copy *bc = kzalloc(sizeof(*bc), GFP_KERNEL);2582 2583 if (!bc)2584 return -ENOMEM;2585 2586 bc->offset = offset;2587 bc->sender_uaddr = sender_uaddr;2588 bc->length = length;2589 INIT_LIST_HEAD(&bc->node);2590 2591 /*2592 * We are guaranteed that the deferred copies are in-order2593 * so just add to the tail.2594 */2595 list_add_tail(&bc->node, sgc_head);2596 2597 return 0;2598}2599 2600/**2601 * binder_add_fixup() - queue a fixup to be applied to sg copy2602 * @pf_head: list_head of binder ptr fixup list2603 * @offset: binder buffer offset in target process2604 * @fixup: bytes to be copied for fixup2605 * @skip_size: bytes to skip when copying (fixup will be applied later)2606 *2607 * Add the specified fixup to a list ordered by @offset. When copying2608 * the scatter-gather buffers, the fixup will be copied instead of2609 * data from the source buffer. For BINDER_TYPE_FDA fixups, the fixup2610 * will be applied later (in target process context), so we just skip2611 * the bytes specified by @skip_size. If @skip_size is 0, we copy the2612 * value in @fixup.2613 *2614 * This function is called *mostly* in @offset order, but there are2615 * exceptions. Since out-of-order inserts are relatively uncommon,2616 * we insert the new element by searching backward from the tail of2617 * the list.2618 *2619 * Return: 0=success, else -errno2620 */2621static int binder_add_fixup(struct list_head *pf_head, binder_size_t offset,2622 binder_uintptr_t fixup, size_t skip_size)2623{2624 struct binder_ptr_fixup *pf = kzalloc(sizeof(*pf), GFP_KERNEL);2625 struct binder_ptr_fixup *tmppf;2626 2627 if (!pf)2628 return -ENOMEM;2629 2630 pf->offset = offset;2631 pf->fixup_data = fixup;2632 pf->skip_size = skip_size;2633 INIT_LIST_HEAD(&pf->node);2634 2635 /* Fixups are *mostly* added in-order, but there are some2636 * exceptions. Look backwards through list for insertion point.2637 */2638 list_for_each_entry_reverse(tmppf, pf_head, node) {2639 if (tmppf->offset < pf->offset) {2640 list_add(&pf->node, &tmppf->node);2641 return 0;2642 }2643 }2644 /*2645 * if we get here, then the new offset is the lowest so2646 * insert at the head2647 */2648 list_add(&pf->node, pf_head);2649 return 0;2650}2651 2652static int binder_translate_fd_array(struct list_head *pf_head,2653 struct binder_fd_array_object *fda,2654 const void __user *sender_ubuffer,2655 struct binder_buffer_object *parent,2656 struct binder_buffer_object *sender_uparent,2657 struct binder_transaction *t,2658 struct binder_thread *thread,2659 struct binder_transaction *in_reply_to)2660{2661 binder_size_t fdi, fd_buf_size;2662 binder_size_t fda_offset;2663 const void __user *sender_ufda_base;2664 struct binder_proc *proc = thread->proc;2665 int ret;2666 2667 if (fda->num_fds == 0)2668 return 0;2669 2670 fd_buf_size = sizeof(u32) * fda->num_fds;2671 if (fda->num_fds >= SIZE_MAX / sizeof(u32)) {2672 binder_user_error("%d:%d got transaction with invalid number of fds (%lld)\n",2673 proc->pid, thread->pid, (u64)fda->num_fds);2674 return -EINVAL;2675 }2676 if (fd_buf_size > parent->length ||2677 fda->parent_offset > parent->length - fd_buf_size) {2678 /* No space for all file descriptors here. */2679 binder_user_error("%d:%d not enough space to store %lld fds in buffer\n",2680 proc->pid, thread->pid, (u64)fda->num_fds);2681 return -EINVAL;2682 }2683 /*2684 * the source data for binder_buffer_object is visible2685 * to user-space and the @buffer element is the user2686 * pointer to the buffer_object containing the fd_array.2687 * Convert the address to an offset relative to2688 * the base of the transaction buffer.2689 */2690 fda_offset = parent->buffer - t->buffer->user_data +2691 fda->parent_offset;2692 sender_ufda_base = (void __user *)(uintptr_t)sender_uparent->buffer +2693 fda->parent_offset;2694 2695 if (!IS_ALIGNED((unsigned long)fda_offset, sizeof(u32)) ||2696 !IS_ALIGNED((unsigned long)sender_ufda_base, sizeof(u32))) {2697 binder_user_error("%d:%d parent offset not aligned correctly.\n",2698 proc->pid, thread->pid);2699 return -EINVAL;2700 }2701 ret = binder_add_fixup(pf_head, fda_offset, 0, fda->num_fds * sizeof(u32));2702 if (ret)2703 return ret;2704 2705 for (fdi = 0; fdi < fda->num_fds; fdi++) {2706 u32 fd;2707 binder_size_t offset = fda_offset + fdi * sizeof(fd);2708 binder_size_t sender_uoffset = fdi * sizeof(fd);2709 2710 ret = copy_from_user(&fd, sender_ufda_base + sender_uoffset, sizeof(fd));2711 if (!ret)2712 ret = binder_translate_fd(fd, offset, t, thread,2713 in_reply_to);2714 if (ret)2715 return ret > 0 ? -EINVAL : ret;2716 }2717 return 0;2718}2719 2720static int binder_fixup_parent(struct list_head *pf_head,2721 struct binder_transaction *t,2722 struct binder_thread *thread,2723 struct binder_buffer_object *bp,2724 binder_size_t off_start_offset,2725 binder_size_t num_valid,2726 binder_size_t last_fixup_obj_off,2727 binder_size_t last_fixup_min_off)2728{2729 struct binder_buffer_object *parent;2730 struct binder_buffer *b = t->buffer;2731 struct binder_proc *proc = thread->proc;2732 struct binder_proc *target_proc = t->to_proc;2733 struct binder_object object;2734 binder_size_t buffer_offset;2735 binder_size_t parent_offset;2736 2737 if (!(bp->flags & BINDER_BUFFER_FLAG_HAS_PARENT))2738 return 0;2739 2740 parent = binder_validate_ptr(target_proc, b, &object, bp->parent,2741 off_start_offset, &parent_offset,2742 num_valid);2743 if (!parent) {2744 binder_user_error("%d:%d got transaction with invalid parent offset or type\n",2745 proc->pid, thread->pid);2746 return -EINVAL;2747 }2748 2749 if (!binder_validate_fixup(target_proc, b, off_start_offset,2750 parent_offset, bp->parent_offset,2751 last_fixup_obj_off,2752 last_fixup_min_off)) {2753 binder_user_error("%d:%d got transaction with out-of-order buffer fixup\n",2754 proc->pid, thread->pid);2755 return -EINVAL;2756 }2757 2758 if (parent->length < sizeof(binder_uintptr_t) ||2759 bp->parent_offset > parent->length - sizeof(binder_uintptr_t)) {2760 /* No space for a pointer here! */2761 binder_user_error("%d:%d got transaction with invalid parent offset\n",2762 proc->pid, thread->pid);2763 return -EINVAL;2764 }2765 2766 buffer_offset = bp->parent_offset + parent->buffer - b->user_data;2767 2768 return binder_add_fixup(pf_head, buffer_offset, bp->buffer, 0);2769}2770 2771/**2772 * binder_can_update_transaction() - Can a txn be superseded by an updated one?2773 * @t1: the pending async txn in the frozen process2774 * @t2: the new async txn to supersede the outdated pending one2775 *2776 * Return: true if t2 can supersede t12777 * false if t2 can not supersede t12778 */2779static bool binder_can_update_transaction(struct binder_transaction *t1,2780 struct binder_transaction *t2)2781{2782 if ((t1->flags & t2->flags & (TF_ONE_WAY | TF_UPDATE_TXN)) !=2783 (TF_ONE_WAY | TF_UPDATE_TXN) || !t1->to_proc || !t2->to_proc)2784 return false;2785 if (t1->to_proc->tsk == t2->to_proc->tsk && t1->code == t2->code &&2786 t1->flags == t2->flags && t1->buffer->pid == t2->buffer->pid &&2787 t1->buffer->target_node->ptr == t2->buffer->target_node->ptr &&2788 t1->buffer->target_node->cookie == t2->buffer->target_node->cookie)2789 return true;2790 return false;2791}2792 2793/**2794 * binder_find_outdated_transaction_ilocked() - Find the outdated transaction2795 * @t: new async transaction2796 * @target_list: list to find outdated transaction2797 *2798 * Return: the outdated transaction if found2799 * NULL if no outdated transacton can be found2800 *2801 * Requires the proc->inner_lock to be held.2802 */2803static struct binder_transaction *2804binder_find_outdated_transaction_ilocked(struct binder_transaction *t,2805 struct list_head *target_list)2806{2807 struct binder_work *w;2808 2809 list_for_each_entry(w, target_list, entry) {2810 struct binder_transaction *t_queued;2811 2812 if (w->type != BINDER_WORK_TRANSACTION)2813 continue;2814 t_queued = container_of(w, struct binder_transaction, work);2815 if (binder_can_update_transaction(t_queued, t))2816 return t_queued;2817 }2818 return NULL;2819}2820 2821/**2822 * binder_proc_transaction() - sends a transaction to a process and wakes it up2823 * @t: transaction to send2824 * @proc: process to send the transaction to2825 * @thread: thread in @proc to send the transaction to (may be NULL)2826 *2827 * This function queues a transaction to the specified process. It will try2828 * to find a thread in the target process to handle the transaction and2829 * wake it up. If no thread is found, the work is queued to the proc2830 * waitqueue.2831 *2832 * If the @thread parameter is not NULL, the transaction is always queued2833 * to the waitlist of that specific thread.2834 *2835 * Return: 0 if the transaction was successfully queued2836 * BR_DEAD_REPLY if the target process or thread is dead2837 * BR_FROZEN_REPLY if the target process or thread is frozen and2838 * the sync transaction was rejected2839 * BR_TRANSACTION_PENDING_FROZEN if the target process is frozen2840 * and the async transaction was successfully queued2841 */2842static int binder_proc_transaction(struct binder_transaction *t,2843 struct binder_proc *proc,2844 struct binder_thread *thread)2845{2846 struct binder_node *node = t->buffer->target_node;2847 bool oneway = !!(t->flags & TF_ONE_WAY);2848 bool pending_async = false;2849 struct binder_transaction *t_outdated = NULL;2850 bool frozen = false;2851 2852 BUG_ON(!node);2853 binder_node_lock(node);2854 if (oneway) {2855 BUG_ON(thread);2856 if (node->has_async_transaction)2857 pending_async = true;2858 else2859 node->has_async_transaction = true;2860 }2861 2862 binder_inner_proc_lock(proc);2863 if (proc->is_frozen) {2864 frozen = true;2865 proc->sync_recv |= !oneway;2866 proc->async_recv |= oneway;2867 }2868 2869 if ((frozen && !oneway) || proc->is_dead ||2870 (thread && thread->is_dead)) {2871 binder_inner_proc_unlock(proc);2872 binder_node_unlock(node);2873 return frozen ? BR_FROZEN_REPLY : BR_DEAD_REPLY;2874 }2875 2876 if (!thread && !pending_async)2877 thread = binder_select_thread_ilocked(proc);2878 2879 if (thread) {2880 binder_enqueue_thread_work_ilocked(thread, &t->work);2881 } else if (!pending_async) {2882 binder_enqueue_work_ilocked(&t->work, &proc->todo);2883 } else {2884 if ((t->flags & TF_UPDATE_TXN) && frozen) {2885 t_outdated = binder_find_outdated_transaction_ilocked(t,2886 &node->async_todo);2887 if (t_outdated) {2888 binder_debug(BINDER_DEBUG_TRANSACTION,2889 "txn %d supersedes %d\n",2890 t->debug_id, t_outdated->debug_id);2891 list_del_init(&t_outdated->work.entry);2892 proc->outstanding_txns--;2893 }2894 }2895 binder_enqueue_work_ilocked(&t->work, &node->async_todo);2896 }2897 2898 if (!pending_async)2899 binder_wakeup_thread_ilocked(proc, thread, !oneway /* sync */);2900 2901 proc->outstanding_txns++;2902 binder_inner_proc_unlock(proc);2903 binder_node_unlock(node);2904 2905 /*2906 * To reduce potential contention, free the outdated transaction and2907 * buffer after releasing the locks.2908 */2909 if (t_outdated) {2910 struct binder_buffer *buffer = t_outdated->buffer;2911 2912 t_outdated->buffer = NULL;2913 buffer->transaction = NULL;2914 trace_binder_transaction_update_buffer_release(buffer);2915 binder_release_entire_buffer(proc, NULL, buffer, false);2916 binder_alloc_free_buf(&proc->alloc, buffer);2917 kfree(t_outdated);2918 binder_stats_deleted(BINDER_STAT_TRANSACTION);2919 }2920 2921 if (oneway && frozen)2922 return BR_TRANSACTION_PENDING_FROZEN;2923 2924 return 0;2925}2926 2927/**2928 * binder_get_node_refs_for_txn() - Get required refs on node for txn2929 * @node: struct binder_node for which to get refs2930 * @procp: returns @node->proc if valid2931 * @error: if no @procp then returns BR_DEAD_REPLY2932 *2933 * User-space normally keeps the node alive when creating a transaction2934 * since it has a reference to the target. The local strong ref keeps it2935 * alive if the sending process dies before the target process processes2936 * the transaction. If the source process is malicious or has a reference2937 * counting bug, relying on the local strong ref can fail.2938 *2939 * Since user-space can cause the local strong ref to go away, we also take2940 * a tmpref on the node to ensure it survives while we are constructing2941 * the transaction. We also need a tmpref on the proc while we are2942 * constructing the transaction, so we take that here as well.2943 *2944 * Return: The target_node with refs taken or NULL if no @node->proc is NULL.2945 * Also sets @procp if valid. If the @node->proc is NULL indicating that the2946 * target proc has died, @error is set to BR_DEAD_REPLY.2947 */2948static struct binder_node *binder_get_node_refs_for_txn(2949 struct binder_node *node,2950 struct binder_proc **procp,2951 uint32_t *error)2952{2953 struct binder_node *target_node = NULL;2954 2955 binder_node_inner_lock(node);2956 if (node->proc) {2957 target_node = node;2958 binder_inc_node_nilocked(node, 1, 0, NULL);2959 binder_inc_node_tmpref_ilocked(node);2960 node->proc->tmp_ref++;2961 *procp = node->proc;2962 } else2963 *error = BR_DEAD_REPLY;2964 binder_node_inner_unlock(node);2965 2966 return target_node;2967}2968 2969static void binder_set_txn_from_error(struct binder_transaction *t, int id,2970 uint32_t command, int32_t param)2971{2972 struct binder_thread *from = binder_get_txn_from_and_acq_inner(t);2973 2974 if (!from) {2975 /* annotation for sparse */2976 __release(&from->proc->inner_lock);2977 return;2978 }2979 2980 /* don't override existing errors */2981 if (from->ee.command == BR_OK)2982 binder_set_extended_error(&from->ee, id, command, param);2983 binder_inner_proc_unlock(from->proc);2984 binder_thread_dec_tmpref(from);2985}2986 2987static void binder_transaction(struct binder_proc *proc,2988 struct binder_thread *thread,2989 struct binder_transaction_data *tr, int reply,2990 binder_size_t extra_buffers_size)2991{2992 int ret;2993 struct binder_transaction *t;2994 struct binder_work *w;2995 struct binder_work *tcomplete;2996 binder_size_t buffer_offset = 0;2997 binder_size_t off_start_offset, off_end_offset;2998 binder_size_t off_min;2999 binder_size_t sg_buf_offset, sg_buf_end_offset;3000 binder_size_t user_offset = 0;3001 struct binder_proc *target_proc = NULL;3002 struct binder_thread *target_thread = NULL;3003 struct binder_node *target_node = NULL;3004 struct binder_transaction *in_reply_to = NULL;3005 struct binder_transaction_log_entry *e;3006 uint32_t return_error = 0;3007 uint32_t return_error_param = 0;3008 uint32_t return_error_line = 0;3009 binder_size_t last_fixup_obj_off = 0;3010 binder_size_t last_fixup_min_off = 0;3011 struct binder_context *context = proc->context;3012 int t_debug_id = atomic_inc_return(&binder_last_id);3013 ktime_t t_start_time = ktime_get();3014 char *secctx = NULL;3015 u32 secctx_sz = 0;3016 struct list_head sgc_head;3017 struct list_head pf_head;3018 const void __user *user_buffer = (const void __user *)3019 (uintptr_t)tr->data.ptr.buffer;3020 INIT_LIST_HEAD(&sgc_head);3021 INIT_LIST_HEAD(&pf_head);3022 3023 e = binder_transaction_log_add(&binder_transaction_log);3024 e->debug_id = t_debug_id;3025 e->call_type = reply ? 2 : !!(tr->flags & TF_ONE_WAY);3026 e->from_proc = proc->pid;3027 e->from_thread = thread->pid;3028 e->target_handle = tr->target.handle;3029 e->data_size = tr->data_size;3030 e->offsets_size = tr->offsets_size;3031 strscpy(e->context_name, proc->context->name, BINDERFS_MAX_NAME);3032 3033 binder_inner_proc_lock(proc);3034 binder_set_extended_error(&thread->ee, t_debug_id, BR_OK, 0);3035 binder_inner_proc_unlock(proc);3036 3037 if (reply) {3038 binder_inner_proc_lock(proc);3039 in_reply_to = thread->transaction_stack;3040 if (in_reply_to == NULL) {3041 binder_inner_proc_unlock(proc);3042 binder_user_error("%d:%d got reply transaction with no transaction stack\n",3043 proc->pid, thread->pid);3044 return_error = BR_FAILED_REPLY;3045 return_error_param = -EPROTO;3046 return_error_line = __LINE__;3047 goto err_empty_call_stack;3048 }3049 if (in_reply_to->to_thread != thread) {3050 spin_lock(&in_reply_to->lock);3051 binder_user_error("%d:%d got reply transaction with bad transaction stack, transaction %d has target %d:%d\n",3052 proc->pid, thread->pid, in_reply_to->debug_id,3053 in_reply_to->to_proc ?3054 in_reply_to->to_proc->pid : 0,3055 in_reply_to->to_thread ?3056 in_reply_to->to_thread->pid : 0);3057 spin_unlock(&in_reply_to->lock);3058 binder_inner_proc_unlock(proc);3059 return_error = BR_FAILED_REPLY;3060 return_error_param = -EPROTO;3061 return_error_line = __LINE__;3062 in_reply_to = NULL;3063 goto err_bad_call_stack;3064 }3065 thread->transaction_stack = in_reply_to->to_parent;3066 binder_inner_proc_unlock(proc);3067 binder_set_nice(in_reply_to->saved_priority);3068 target_thread = binder_get_txn_from_and_acq_inner(in_reply_to);3069 if (target_thread == NULL) {3070 /* annotation for sparse */3071 __release(&target_thread->proc->inner_lock);3072 binder_txn_error("%d:%d reply target not found\n",3073 thread->pid, proc->pid);3074 return_error = BR_DEAD_REPLY;3075 return_error_line = __LINE__;3076 goto err_dead_binder;3077 }3078 if (target_thread->transaction_stack != in_reply_to) {3079 binder_user_error("%d:%d got reply transaction with bad target transaction stack %d, expected %d\n",3080 proc->pid, thread->pid,3081 target_thread->transaction_stack ?3082 target_thread->transaction_stack->debug_id : 0,3083 in_reply_to->debug_id);3084 binder_inner_proc_unlock(target_thread->proc);3085 return_error = BR_FAILED_REPLY;3086 return_error_param = -EPROTO;3087 return_error_line = __LINE__;3088 in_reply_to = NULL;3089 target_thread = NULL;3090 goto err_dead_binder;3091 }3092 target_proc = target_thread->proc;3093 target_proc->tmp_ref++;3094 binder_inner_proc_unlock(target_thread->proc);3095 } else {3096 if (tr->target.handle) {3097 struct binder_ref *ref;3098 3099 /*3100 * There must already be a strong ref3101 * on this node. If so, do a strong3102 * increment on the node to ensure it3103 * stays alive until the transaction is3104 * done.3105 */3106 binder_proc_lock(proc);3107 ref = binder_get_ref_olocked(proc, tr->target.handle,3108 true);3109 if (ref) {3110 target_node = binder_get_node_refs_for_txn(3111 ref->node, &target_proc,3112 &return_error);3113 } else {3114 binder_user_error("%d:%d got transaction to invalid handle, %u\n",3115 proc->pid, thread->pid, tr->target.handle);3116 return_error = BR_FAILED_REPLY;3117 }3118 binder_proc_unlock(proc);3119 } else {3120 mutex_lock(&context->context_mgr_node_lock);3121 target_node = context->binder_context_mgr_node;3122 if (target_node)3123 target_node = binder_get_node_refs_for_txn(3124 target_node, &target_proc,3125 &return_error);3126 else3127 return_error = BR_DEAD_REPLY;3128 mutex_unlock(&context->context_mgr_node_lock);3129 if (target_node && target_proc->pid == proc->pid) {3130 binder_user_error("%d:%d got transaction to context manager from process owning it\n",3131 proc->pid, thread->pid);3132 return_error = BR_FAILED_REPLY;3133 return_error_param = -EINVAL;3134 return_error_line = __LINE__;3135 goto err_invalid_target_handle;3136 }3137 }3138 if (!target_node) {3139 binder_txn_error("%d:%d cannot find target node\n",3140 thread->pid, proc->pid);3141 /*3142 * return_error is set above3143 */3144 return_error_param = -EINVAL;3145 return_error_line = __LINE__;3146 goto err_dead_binder;3147 }3148 e->to_node = target_node->debug_id;3149 if (WARN_ON(proc == target_proc)) {3150 binder_txn_error("%d:%d self transactions not allowed\n",3151 thread->pid, proc->pid);3152 return_error = BR_FAILED_REPLY;3153 return_error_param = -EINVAL;3154 return_error_line = __LINE__;3155 goto err_invalid_target_handle;3156 }3157 if (security_binder_transaction(proc->cred,3158 target_proc->cred) < 0) {3159 binder_txn_error("%d:%d transaction credentials failed\n",3160 thread->pid, proc->pid);3161 return_error = BR_FAILED_REPLY;3162 return_error_param = -EPERM;3163 return_error_line = __LINE__;3164 goto err_invalid_target_handle;3165 }3166 binder_inner_proc_lock(proc);3167 3168 w = list_first_entry_or_null(&thread->todo,3169 struct binder_work, entry);3170 if (!(tr->flags & TF_ONE_WAY) && w &&3171 w->type == BINDER_WORK_TRANSACTION) {3172 /*3173 * Do not allow new outgoing transaction from a3174 * thread that has a transaction at the head of3175 * its todo list. Only need to check the head3176 * because binder_select_thread_ilocked picks a3177 * thread from proc->waiting_threads to enqueue3178 * the transaction, and nothing is queued to the3179 * todo list while the thread is on waiting_threads.3180 */3181 binder_user_error("%d:%d new transaction not allowed when there is a transaction on thread todo\n",3182 proc->pid, thread->pid);3183 binder_inner_proc_unlock(proc);3184 return_error = BR_FAILED_REPLY;3185 return_error_param = -EPROTO;3186 return_error_line = __LINE__;3187 goto err_bad_todo_list;3188 }3189 3190 if (!(tr->flags & TF_ONE_WAY) && thread->transaction_stack) {3191 struct binder_transaction *tmp;3192 3193 tmp = thread->transaction_stack;3194 if (tmp->to_thread != thread) {3195 spin_lock(&tmp->lock);3196 binder_user_error("%d:%d got new transaction with bad transaction stack, transaction %d has target %d:%d\n",3197 proc->pid, thread->pid, tmp->debug_id,3198 tmp->to_proc ? tmp->to_proc->pid : 0,3199 tmp->to_thread ?3200 tmp->to_thread->pid : 0);3201 spin_unlock(&tmp->lock);3202 binder_inner_proc_unlock(proc);3203 return_error = BR_FAILED_REPLY;3204 return_error_param = -EPROTO;3205 return_error_line = __LINE__;3206 goto err_bad_call_stack;3207 }3208 while (tmp) {3209 struct binder_thread *from;3210 3211 spin_lock(&tmp->lock);3212 from = tmp->from;3213 if (from && from->proc == target_proc) {3214 atomic_inc(&from->tmp_ref);3215 target_thread = from;3216 spin_unlock(&tmp->lock);3217 break;3218 }3219 spin_unlock(&tmp->lock);3220 tmp = tmp->from_parent;3221 }3222 }3223 binder_inner_proc_unlock(proc);3224 }3225 if (target_thread)3226 e->to_thread = target_thread->pid;3227 e->to_proc = target_proc->pid;3228 3229 /* TODO: reuse incoming transaction for reply */3230 t = kzalloc(sizeof(*t), GFP_KERNEL);3231 if (t == NULL) {3232 binder_txn_error("%d:%d cannot allocate transaction\n",3233 thread->pid, proc->pid);3234 return_error = BR_FAILED_REPLY;3235 return_error_param = -ENOMEM;3236 return_error_line = __LINE__;3237 goto err_alloc_t_failed;3238 }3239 INIT_LIST_HEAD(&t->fd_fixups);3240 binder_stats_created(BINDER_STAT_TRANSACTION);3241 spin_lock_init(&t->lock);3242 3243 tcomplete = kzalloc(sizeof(*tcomplete), GFP_KERNEL);3244 if (tcomplete == NULL) {3245 binder_txn_error("%d:%d cannot allocate work for transaction\n",3246 thread->pid, proc->pid);3247 return_error = BR_FAILED_REPLY;3248 return_error_param = -ENOMEM;3249 return_error_line = __LINE__;3250 goto err_alloc_tcomplete_failed;3251 }3252 binder_stats_created(BINDER_STAT_TRANSACTION_COMPLETE);3253 3254 t->debug_id = t_debug_id;3255 t->start_time = t_start_time;3256 3257 if (reply)3258 binder_debug(BINDER_DEBUG_TRANSACTION,3259 "%d:%d BC_REPLY %d -> %d:%d, data %016llx-%016llx size %lld-%lld-%lld\n",3260 proc->pid, thread->pid, t->debug_id,3261 target_proc->pid, target_thread->pid,3262 (u64)tr->data.ptr.buffer,3263 (u64)tr->data.ptr.offsets,3264 (u64)tr->data_size, (u64)tr->offsets_size,3265 (u64)extra_buffers_size);3266 else3267 binder_debug(BINDER_DEBUG_TRANSACTION,3268 "%d:%d BC_TRANSACTION %d -> %d - node %d, data %016llx-%016llx size %lld-%lld-%lld\n",3269 proc->pid, thread->pid, t->debug_id,3270 target_proc->pid, target_node->debug_id,3271 (u64)tr->data.ptr.buffer,3272 (u64)tr->data.ptr.offsets,3273 (u64)tr->data_size, (u64)tr->offsets_size,3274 (u64)extra_buffers_size);3275 3276 if (!reply && !(tr->flags & TF_ONE_WAY))3277 t->from = thread;3278 else3279 t->from = NULL;3280 t->from_pid = proc->pid;3281 t->from_tid = thread->pid;3282 t->sender_euid = task_euid(proc->tsk);3283 t->to_proc = target_proc;3284 t->to_thread = target_thread;3285 t->code = tr->code;3286 t->flags = tr->flags;3287 t->priority = task_nice(current);3288 3289 if (target_node && target_node->txn_security_ctx) {3290 u32 secid;3291 size_t added_size;3292 3293 security_cred_getsecid(proc->cred, &secid);3294 ret = security_secid_to_secctx(secid, &secctx, &secctx_sz);3295 if (ret) {3296 binder_txn_error("%d:%d failed to get security context\n",3297 thread->pid, proc->pid);3298 return_error = BR_FAILED_REPLY;3299 return_error_param = ret;3300 return_error_line = __LINE__;3301 goto err_get_secctx_failed;3302 }3303 added_size = ALIGN(secctx_sz, sizeof(u64));3304 extra_buffers_size += added_size;3305 if (extra_buffers_size < added_size) {3306 binder_txn_error("%d:%d integer overflow of extra_buffers_size\n",3307 thread->pid, proc->pid);3308 return_error = BR_FAILED_REPLY;3309 return_error_param = -EINVAL;3310 return_error_line = __LINE__;3311 goto err_bad_extra_size;3312 }3313 }3314 3315 trace_binder_transaction(reply, t, target_node);3316 3317 t->buffer = binder_alloc_new_buf(&target_proc->alloc, tr->data_size,3318 tr->offsets_size, extra_buffers_size,3319 !reply && (t->flags & TF_ONE_WAY));3320 if (IS_ERR(t->buffer)) {3321 char *s;3322 3323 ret = PTR_ERR(t->buffer);3324 s = (ret == -ESRCH) ? ": vma cleared, target dead or dying"3325 : (ret == -ENOSPC) ? ": no space left"3326 : (ret == -ENOMEM) ? ": memory allocation failed"3327 : "";3328 binder_txn_error("cannot allocate buffer%s", s);3329 3330 return_error_param = PTR_ERR(t->buffer);3331 return_error = return_error_param == -ESRCH ?3332 BR_DEAD_REPLY : BR_FAILED_REPLY;3333 return_error_line = __LINE__;3334 t->buffer = NULL;3335 goto err_binder_alloc_buf_failed;3336 }3337 if (secctx) {3338 int err;3339 size_t buf_offset = ALIGN(tr->data_size, sizeof(void *)) +3340 ALIGN(tr->offsets_size, sizeof(void *)) +3341 ALIGN(extra_buffers_size, sizeof(void *)) -3342 ALIGN(secctx_sz, sizeof(u64));3343 3344 t->security_ctx = t->buffer->user_data + buf_offset;3345 err = binder_alloc_copy_to_buffer(&target_proc->alloc,3346 t->buffer, buf_offset,3347 secctx, secctx_sz);3348 if (err) {3349 t->security_ctx = 0;3350 WARN_ON(1);3351 }3352 security_release_secctx(secctx, secctx_sz);3353 secctx = NULL;3354 }3355 t->buffer->debug_id = t->debug_id;3356 t->buffer->transaction = t;3357 t->buffer->target_node = target_node;3358 t->buffer->clear_on_free = !!(t->flags & TF_CLEAR_BUF);3359 trace_binder_transaction_alloc_buf(t->buffer);3360 3361 if (binder_alloc_copy_user_to_buffer(3362 &target_proc->alloc,3363 t->buffer,3364 ALIGN(tr->data_size, sizeof(void *)),3365 (const void __user *)3366 (uintptr_t)tr->data.ptr.offsets,3367 tr->offsets_size)) {3368 binder_user_error("%d:%d got transaction with invalid offsets ptr\n",3369 proc->pid, thread->pid);3370 return_error = BR_FAILED_REPLY;3371 return_error_param = -EFAULT;3372 return_error_line = __LINE__;3373 goto err_copy_data_failed;3374 }3375 if (!IS_ALIGNED(tr->offsets_size, sizeof(binder_size_t))) {3376 binder_user_error("%d:%d got transaction with invalid offsets size, %lld\n",3377 proc->pid, thread->pid, (u64)tr->offsets_size);3378 return_error = BR_FAILED_REPLY;3379 return_error_param = -EINVAL;3380 return_error_line = __LINE__;3381 goto err_bad_offset;3382 }3383 if (!IS_ALIGNED(extra_buffers_size, sizeof(u64))) {3384 binder_user_error("%d:%d got transaction with unaligned buffers size, %lld\n",3385 proc->pid, thread->pid,3386 (u64)extra_buffers_size);3387 return_error = BR_FAILED_REPLY;3388 return_error_param = -EINVAL;3389 return_error_line = __LINE__;3390 goto err_bad_offset;3391 }3392 off_start_offset = ALIGN(tr->data_size, sizeof(void *));3393 buffer_offset = off_start_offset;3394 off_end_offset = off_start_offset + tr->offsets_size;3395 sg_buf_offset = ALIGN(off_end_offset, sizeof(void *));3396 sg_buf_end_offset = sg_buf_offset + extra_buffers_size -3397 ALIGN(secctx_sz, sizeof(u64));3398 off_min = 0;3399 for (buffer_offset = off_start_offset; buffer_offset < off_end_offset;3400 buffer_offset += sizeof(binder_size_t)) {3401 struct binder_object_header *hdr;3402 size_t object_size;3403 struct binder_object object;3404 binder_size_t object_offset;3405 binder_size_t copy_size;3406 3407 if (binder_alloc_copy_from_buffer(&target_proc->alloc,3408 &object_offset,3409 t->buffer,3410 buffer_offset,3411 sizeof(object_offset))) {3412 binder_txn_error("%d:%d copy offset from buffer failed\n",3413 thread->pid, proc->pid);3414 return_error = BR_FAILED_REPLY;3415 return_error_param = -EINVAL;3416 return_error_line = __LINE__;3417 goto err_bad_offset;3418 }3419 3420 /*3421 * Copy the source user buffer up to the next object3422 * that will be processed.3423 */3424 copy_size = object_offset - user_offset;3425 if (copy_size && (user_offset > object_offset ||3426 object_offset > tr->data_size ||3427 binder_alloc_copy_user_to_buffer(3428 &target_proc->alloc,3429 t->buffer, user_offset,3430 user_buffer + user_offset,3431 copy_size))) {3432 binder_user_error("%d:%d got transaction with invalid data ptr\n",3433 proc->pid, thread->pid);3434 return_error = BR_FAILED_REPLY;3435 return_error_param = -EFAULT;3436 return_error_line = __LINE__;3437 goto err_copy_data_failed;3438 }3439 object_size = binder_get_object(target_proc, user_buffer,3440 t->buffer, object_offset, &object);3441 if (object_size == 0 || object_offset < off_min) {3442 binder_user_error("%d:%d got transaction with invalid offset (%lld, min %lld max %lld) or object.\n",3443 proc->pid, thread->pid,3444 (u64)object_offset,3445 (u64)off_min,3446 (u64)t->buffer->data_size);3447 return_error = BR_FAILED_REPLY;3448 return_error_param = -EINVAL;3449 return_error_line = __LINE__;3450 goto err_bad_offset;3451 }3452 /*3453 * Set offset to the next buffer fragment to be3454 * copied3455 */3456 user_offset = object_offset + object_size;3457 3458 hdr = &object.hdr;3459 off_min = object_offset + object_size;3460 switch (hdr->type) {3461 case BINDER_TYPE_BINDER:3462 case BINDER_TYPE_WEAK_BINDER: {3463 struct flat_binder_object *fp;3464 3465 fp = to_flat_binder_object(hdr);3466 ret = binder_translate_binder(fp, t, thread);3467 3468 if (ret < 0 ||3469 binder_alloc_copy_to_buffer(&target_proc->alloc,3470 t->buffer,3471 object_offset,3472 fp, sizeof(*fp))) {3473 binder_txn_error("%d:%d translate binder failed\n",3474 thread->pid, proc->pid);3475 return_error = BR_FAILED_REPLY;3476 return_error_param = ret;3477 return_error_line = __LINE__;3478 goto err_translate_failed;3479 }3480 } break;3481 case BINDER_TYPE_HANDLE:3482 case BINDER_TYPE_WEAK_HANDLE: {3483 struct flat_binder_object *fp;3484 3485 fp = to_flat_binder_object(hdr);3486 ret = binder_translate_handle(fp, t, thread);3487 if (ret < 0 ||3488 binder_alloc_copy_to_buffer(&target_proc->alloc,3489 t->buffer,3490 object_offset,3491 fp, sizeof(*fp))) {3492 binder_txn_error("%d:%d translate handle failed\n",3493 thread->pid, proc->pid);3494 return_error = BR_FAILED_REPLY;3495 return_error_param = ret;3496 return_error_line = __LINE__;3497 goto err_translate_failed;3498 }3499 } break;3500 3501 case BINDER_TYPE_FD: {3502 struct binder_fd_object *fp = to_binder_fd_object(hdr);3503 binder_size_t fd_offset = object_offset +3504 (uintptr_t)&fp->fd - (uintptr_t)fp;3505 int ret = binder_translate_fd(fp->fd, fd_offset, t,3506 thread, in_reply_to);3507 3508 fp->pad_binder = 0;3509 if (ret < 0 ||3510 binder_alloc_copy_to_buffer(&target_proc->alloc,3511 t->buffer,3512 object_offset,3513 fp, sizeof(*fp))) {3514 binder_txn_error("%d:%d translate fd failed\n",3515 thread->pid, proc->pid);3516 return_error = BR_FAILED_REPLY;3517 return_error_param = ret;3518 return_error_line = __LINE__;3519 goto err_translate_failed;3520 }3521 } break;3522 case BINDER_TYPE_FDA: {3523 struct binder_object ptr_object;3524 binder_size_t parent_offset;3525 struct binder_object user_object;3526 size_t user_parent_size;3527 struct binder_fd_array_object *fda =3528 to_binder_fd_array_object(hdr);3529 size_t num_valid = (buffer_offset - off_start_offset) /3530 sizeof(binder_size_t);3531 struct binder_buffer_object *parent =3532 binder_validate_ptr(target_proc, t->buffer,3533 &ptr_object, fda->parent,3534 off_start_offset,3535 &parent_offset,3536 num_valid);3537 if (!parent) {3538 binder_user_error("%d:%d got transaction with invalid parent offset or type\n",3539 proc->pid, thread->pid);3540 return_error = BR_FAILED_REPLY;3541 return_error_param = -EINVAL;3542 return_error_line = __LINE__;3543 goto err_bad_parent;3544 }3545 if (!binder_validate_fixup(target_proc, t->buffer,3546 off_start_offset,3547 parent_offset,3548 fda->parent_offset,3549 last_fixup_obj_off,3550 last_fixup_min_off)) {3551 binder_user_error("%d:%d got transaction with out-of-order buffer fixup\n",3552 proc->pid, thread->pid);3553 return_error = BR_FAILED_REPLY;3554 return_error_param = -EINVAL;3555 return_error_line = __LINE__;3556 goto err_bad_parent;3557 }3558 /*3559 * We need to read the user version of the parent3560 * object to get the original user offset3561 */3562 user_parent_size =3563 binder_get_object(proc, user_buffer, t->buffer,3564 parent_offset, &user_object);3565 if (user_parent_size != sizeof(user_object.bbo)) {3566 binder_user_error("%d:%d invalid ptr object size: %zd vs %zd\n",3567 proc->pid, thread->pid,3568 user_parent_size,3569 sizeof(user_object.bbo));3570 return_error = BR_FAILED_REPLY;3571 return_error_param = -EINVAL;3572 return_error_line = __LINE__;3573 goto err_bad_parent;3574 }3575 ret = binder_translate_fd_array(&pf_head, fda,3576 user_buffer, parent,3577 &user_object.bbo, t,3578 thread, in_reply_to);3579 if (!ret)3580 ret = binder_alloc_copy_to_buffer(&target_proc->alloc,3581 t->buffer,3582 object_offset,3583 fda, sizeof(*fda));3584 if (ret) {3585 binder_txn_error("%d:%d translate fd array failed\n",3586 thread->pid, proc->pid);3587 return_error = BR_FAILED_REPLY;3588 return_error_param = ret > 0 ? -EINVAL : ret;3589 return_error_line = __LINE__;3590 goto err_translate_failed;3591 }3592 last_fixup_obj_off = parent_offset;3593 last_fixup_min_off =3594 fda->parent_offset + sizeof(u32) * fda->num_fds;3595 } break;3596 case BINDER_TYPE_PTR: {3597 struct binder_buffer_object *bp =3598 to_binder_buffer_object(hdr);3599 size_t buf_left = sg_buf_end_offset - sg_buf_offset;3600 size_t num_valid;3601 3602 if (bp->length > buf_left) {3603 binder_user_error("%d:%d got transaction with too large buffer\n",3604 proc->pid, thread->pid);3605 return_error = BR_FAILED_REPLY;3606 return_error_param = -EINVAL;3607 return_error_line = __LINE__;3608 goto err_bad_offset;3609 }3610 ret = binder_defer_copy(&sgc_head, sg_buf_offset,3611 (const void __user *)(uintptr_t)bp->buffer,3612 bp->length);3613 if (ret) {3614 binder_txn_error("%d:%d deferred copy failed\n",3615 thread->pid, proc->pid);3616 return_error = BR_FAILED_REPLY;3617 return_error_param = ret;3618 return_error_line = __LINE__;3619 goto err_translate_failed;3620 }3621 /* Fixup buffer pointer to target proc address space */3622 bp->buffer = t->buffer->user_data + sg_buf_offset;3623 sg_buf_offset += ALIGN(bp->length, sizeof(u64));3624 3625 num_valid = (buffer_offset - off_start_offset) /3626 sizeof(binder_size_t);3627 ret = binder_fixup_parent(&pf_head, t,3628 thread, bp,3629 off_start_offset,3630 num_valid,3631 last_fixup_obj_off,3632 last_fixup_min_off);3633 if (ret < 0 ||3634 binder_alloc_copy_to_buffer(&target_proc->alloc,3635 t->buffer,3636 object_offset,3637 bp, sizeof(*bp))) {3638 binder_txn_error("%d:%d failed to fixup parent\n",3639 thread->pid, proc->pid);3640 return_error = BR_FAILED_REPLY;3641 return_error_param = ret;3642 return_error_line = __LINE__;3643 goto err_translate_failed;3644 }3645 last_fixup_obj_off = object_offset;3646 last_fixup_min_off = 0;3647 } break;3648 default:3649 binder_user_error("%d:%d got transaction with invalid object type, %x\n",3650 proc->pid, thread->pid, hdr->type);3651 return_error = BR_FAILED_REPLY;3652 return_error_param = -EINVAL;3653 return_error_line = __LINE__;3654 goto err_bad_object_type;3655 }3656 }3657 /* Done processing objects, copy the rest of the buffer */3658 if (binder_alloc_copy_user_to_buffer(3659 &target_proc->alloc,3660 t->buffer, user_offset,3661 user_buffer + user_offset,3662 tr->data_size - user_offset)) {3663 binder_user_error("%d:%d got transaction with invalid data ptr\n",3664 proc->pid, thread->pid);3665 return_error = BR_FAILED_REPLY;3666 return_error_param = -EFAULT;3667 return_error_line = __LINE__;3668 goto err_copy_data_failed;3669 }3670 3671 ret = binder_do_deferred_txn_copies(&target_proc->alloc, t->buffer,3672 &sgc_head, &pf_head);3673 if (ret) {3674 binder_user_error("%d:%d got transaction with invalid offsets ptr\n",3675 proc->pid, thread->pid);3676 return_error = BR_FAILED_REPLY;3677 return_error_param = ret;3678 return_error_line = __LINE__;3679 goto err_copy_data_failed;3680 }3681 if (t->buffer->oneway_spam_suspect)3682 tcomplete->type = BINDER_WORK_TRANSACTION_ONEWAY_SPAM_SUSPECT;3683 else3684 tcomplete->type = BINDER_WORK_TRANSACTION_COMPLETE;3685 t->work.type = BINDER_WORK_TRANSACTION;3686 3687 if (reply) {3688 binder_enqueue_thread_work(thread, tcomplete);3689 binder_inner_proc_lock(target_proc);3690 if (target_thread->is_dead) {3691 return_error = BR_DEAD_REPLY;3692 binder_inner_proc_unlock(target_proc);3693 goto err_dead_proc_or_thread;3694 }3695 BUG_ON(t->buffer->async_transaction != 0);3696 binder_pop_transaction_ilocked(target_thread, in_reply_to);3697 binder_enqueue_thread_work_ilocked(target_thread, &t->work);3698 target_proc->outstanding_txns++;3699 binder_inner_proc_unlock(target_proc);3700 wake_up_interruptible_sync(&target_thread->wait);3701 binder_free_transaction(in_reply_to);3702 } else if (!(t->flags & TF_ONE_WAY)) {3703 BUG_ON(t->buffer->async_transaction != 0);3704 binder_inner_proc_lock(proc);3705 /*3706 * Defer the TRANSACTION_COMPLETE, so we don't return to3707 * userspace immediately; this allows the target process to3708 * immediately start processing this transaction, reducing3709 * latency. We will then return the TRANSACTION_COMPLETE when3710 * the target replies (or there is an error).3711 */3712 binder_enqueue_deferred_thread_work_ilocked(thread, tcomplete);3713 t->need_reply = 1;3714 t->from_parent = thread->transaction_stack;3715 thread->transaction_stack = t;3716 binder_inner_proc_unlock(proc);3717 return_error = binder_proc_transaction(t,3718 target_proc, target_thread);3719 if (return_error) {3720 binder_inner_proc_lock(proc);3721 binder_pop_transaction_ilocked(thread, t);3722 binder_inner_proc_unlock(proc);3723 goto err_dead_proc_or_thread;3724 }3725 } else {3726 BUG_ON(target_node == NULL);3727 BUG_ON(t->buffer->async_transaction != 1);3728 return_error = binder_proc_transaction(t, target_proc, NULL);3729 /*3730 * Let the caller know when async transaction reaches a frozen3731 * process and is put in a pending queue, waiting for the target3732 * process to be unfrozen.3733 */3734 if (return_error == BR_TRANSACTION_PENDING_FROZEN)3735 tcomplete->type = BINDER_WORK_TRANSACTION_PENDING;3736 binder_enqueue_thread_work(thread, tcomplete);3737 if (return_error &&3738 return_error != BR_TRANSACTION_PENDING_FROZEN)3739 goto err_dead_proc_or_thread;3740 }3741 if (target_thread)3742 binder_thread_dec_tmpref(target_thread);3743 binder_proc_dec_tmpref(target_proc);3744 if (target_node)3745 binder_dec_node_tmpref(target_node);3746 /*3747 * write barrier to synchronize with initialization3748 * of log entry3749 */3750 smp_wmb();3751 WRITE_ONCE(e->debug_id_done, t_debug_id);3752 return;3753 3754err_dead_proc_or_thread:3755 binder_txn_error("%d:%d dead process or thread\n",3756 thread->pid, proc->pid);3757 return_error_line = __LINE__;3758 binder_dequeue_work(proc, tcomplete);3759err_translate_failed:3760err_bad_object_type:3761err_bad_offset:3762err_bad_parent:3763err_copy_data_failed:3764 binder_cleanup_deferred_txn_lists(&sgc_head, &pf_head);3765 binder_free_txn_fixups(t);3766 trace_binder_transaction_failed_buffer_release(t->buffer);3767 binder_transaction_buffer_release(target_proc, NULL, t->buffer,3768 buffer_offset, true);3769 if (target_node)3770 binder_dec_node_tmpref(target_node);3771 target_node = NULL;3772 t->buffer->transaction = NULL;3773 binder_alloc_free_buf(&target_proc->alloc, t->buffer);3774err_binder_alloc_buf_failed:3775err_bad_extra_size:3776 if (secctx)3777 security_release_secctx(secctx, secctx_sz);3778err_get_secctx_failed:3779 kfree(tcomplete);3780 binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE);3781err_alloc_tcomplete_failed:3782 if (trace_binder_txn_latency_free_enabled())3783 binder_txn_latency_free(t);3784 kfree(t);3785 binder_stats_deleted(BINDER_STAT_TRANSACTION);3786err_alloc_t_failed:3787err_bad_todo_list:3788err_bad_call_stack:3789err_empty_call_stack:3790err_dead_binder:3791err_invalid_target_handle:3792 if (target_node) {3793 binder_dec_node(target_node, 1, 0);3794 binder_dec_node_tmpref(target_node);3795 }3796 3797 binder_debug(BINDER_DEBUG_FAILED_TRANSACTION,3798 "%d:%d transaction %s to %d:%d failed %d/%d/%d, size %lld-%lld line %d\n",3799 proc->pid, thread->pid, reply ? "reply" :3800 (tr->flags & TF_ONE_WAY ? "async" : "call"),3801 target_proc ? target_proc->pid : 0,3802 target_thread ? target_thread->pid : 0,3803 t_debug_id, return_error, return_error_param,3804 (u64)tr->data_size, (u64)tr->offsets_size,3805 return_error_line);3806 3807 if (target_thread)3808 binder_thread_dec_tmpref(target_thread);3809 if (target_proc)3810 binder_proc_dec_tmpref(target_proc);3811 3812 {3813 struct binder_transaction_log_entry *fe;3814 3815 e->return_error = return_error;3816 e->return_error_param = return_error_param;3817 e->return_error_line = return_error_line;3818 fe = binder_transaction_log_add(&binder_transaction_log_failed);3819 *fe = *e;3820 /*3821 * write barrier to synchronize with initialization3822 * of log entry3823 */3824 smp_wmb();3825 WRITE_ONCE(e->debug_id_done, t_debug_id);3826 WRITE_ONCE(fe->debug_id_done, t_debug_id);3827 }3828 3829 BUG_ON(thread->return_error.cmd != BR_OK);3830 if (in_reply_to) {3831 binder_set_txn_from_error(in_reply_to, t_debug_id,3832 return_error, return_error_param);3833 thread->return_error.cmd = BR_TRANSACTION_COMPLETE;3834 binder_enqueue_thread_work(thread, &thread->return_error.work);3835 binder_send_failed_reply(in_reply_to, return_error);3836 } else {3837 binder_inner_proc_lock(proc);3838 binder_set_extended_error(&thread->ee, t_debug_id,3839 return_error, return_error_param);3840 binder_inner_proc_unlock(proc);3841 thread->return_error.cmd = return_error;3842 binder_enqueue_thread_work(thread, &thread->return_error.work);3843 }3844}3845 3846static int3847binder_request_freeze_notification(struct binder_proc *proc,3848 struct binder_thread *thread,3849 struct binder_handle_cookie *handle_cookie)3850{3851 struct binder_ref_freeze *freeze;3852 struct binder_ref *ref;3853 bool is_frozen;3854 3855 freeze = kzalloc(sizeof(*freeze), GFP_KERNEL);3856 if (!freeze)3857 return -ENOMEM;3858 binder_proc_lock(proc);3859 ref = binder_get_ref_olocked(proc, handle_cookie->handle, false);3860 if (!ref) {3861 binder_user_error("%d:%d BC_REQUEST_FREEZE_NOTIFICATION invalid ref %d\n",3862 proc->pid, thread->pid, handle_cookie->handle);3863 binder_proc_unlock(proc);3864 kfree(freeze);3865 return -EINVAL;3866 }3867 3868 binder_node_lock(ref->node);3869 3870 if (ref->freeze || !ref->node->proc) {3871 binder_user_error("%d:%d invalid BC_REQUEST_FREEZE_NOTIFICATION %s\n",3872 proc->pid, thread->pid,3873 ref->freeze ? "already set" : "dead node");3874 binder_node_unlock(ref->node);3875 binder_proc_unlock(proc);3876 kfree(freeze);3877 return -EINVAL;3878 }3879 binder_inner_proc_lock(ref->node->proc);3880 is_frozen = ref->node->proc->is_frozen;3881 binder_inner_proc_unlock(ref->node->proc);3882 3883 binder_stats_created(BINDER_STAT_FREEZE);3884 INIT_LIST_HEAD(&freeze->work.entry);3885 freeze->cookie = handle_cookie->cookie;3886 freeze->work.type = BINDER_WORK_FROZEN_BINDER;3887 freeze->is_frozen = is_frozen;3888 3889 ref->freeze = freeze;3890 3891 binder_inner_proc_lock(proc);3892 binder_enqueue_work_ilocked(&ref->freeze->work, &proc->todo);3893 binder_wakeup_proc_ilocked(proc);3894 binder_inner_proc_unlock(proc);3895 3896 binder_node_unlock(ref->node);3897 binder_proc_unlock(proc);3898 return 0;3899}3900 3901static int3902binder_clear_freeze_notification(struct binder_proc *proc,3903 struct binder_thread *thread,3904 struct binder_handle_cookie *handle_cookie)3905{3906 struct binder_ref_freeze *freeze;3907 struct binder_ref *ref;3908 3909 binder_proc_lock(proc);3910 ref = binder_get_ref_olocked(proc, handle_cookie->handle, false);3911 if (!ref) {3912 binder_user_error("%d:%d BC_CLEAR_FREEZE_NOTIFICATION invalid ref %d\n",3913 proc->pid, thread->pid, handle_cookie->handle);3914 binder_proc_unlock(proc);3915 return -EINVAL;3916 }3917 3918 binder_node_lock(ref->node);3919 3920 if (!ref->freeze) {3921 binder_user_error("%d:%d BC_CLEAR_FREEZE_NOTIFICATION freeze notification not active\n",3922 proc->pid, thread->pid);3923 binder_node_unlock(ref->node);3924 binder_proc_unlock(proc);3925 return -EINVAL;3926 }3927 freeze = ref->freeze;3928 binder_inner_proc_lock(proc);3929 if (freeze->cookie != handle_cookie->cookie) {3930 binder_user_error("%d:%d BC_CLEAR_FREEZE_NOTIFICATION freeze notification cookie mismatch %016llx != %016llx\n",3931 proc->pid, thread->pid, (u64)freeze->cookie,3932 (u64)handle_cookie->cookie);3933 binder_inner_proc_unlock(proc);3934 binder_node_unlock(ref->node);3935 binder_proc_unlock(proc);3936 return -EINVAL;3937 }3938 ref->freeze = NULL;3939 /*3940 * Take the existing freeze object and overwrite its work type. There are three cases here:3941 * 1. No pending notification. In this case just add the work to the queue.3942 * 2. A notification was sent and is pending an ack from userspace. Once an ack arrives, we3943 * should resend with the new work type.3944 * 3. A notification is pending to be sent. Since the work is already in the queue, nothing3945 * needs to be done here.3946 */3947 freeze->work.type = BINDER_WORK_CLEAR_FREEZE_NOTIFICATION;3948 if (list_empty(&freeze->work.entry)) {3949 binder_enqueue_work_ilocked(&freeze->work, &proc->todo);3950 binder_wakeup_proc_ilocked(proc);3951 } else if (freeze->sent) {3952 freeze->resend = true;3953 }3954 binder_inner_proc_unlock(proc);3955 binder_node_unlock(ref->node);3956 binder_proc_unlock(proc);3957 return 0;3958}3959 3960static int3961binder_freeze_notification_done(struct binder_proc *proc,3962 struct binder_thread *thread,3963 binder_uintptr_t cookie)3964{3965 struct binder_ref_freeze *freeze = NULL;3966 struct binder_work *w;3967 3968 binder_inner_proc_lock(proc);3969 list_for_each_entry(w, &proc->delivered_freeze, entry) {3970 struct binder_ref_freeze *tmp_freeze =3971 container_of(w, struct binder_ref_freeze, work);3972 3973 if (tmp_freeze->cookie == cookie) {3974 freeze = tmp_freeze;3975 break;3976 }3977 }3978 if (!freeze) {3979 binder_user_error("%d:%d BC_FREEZE_NOTIFICATION_DONE %016llx not found\n",3980 proc->pid, thread->pid, (u64)cookie);3981 binder_inner_proc_unlock(proc);3982 return -EINVAL;3983 }3984 binder_dequeue_work_ilocked(&freeze->work);3985 freeze->sent = false;3986 if (freeze->resend) {3987 freeze->resend = false;3988 binder_enqueue_work_ilocked(&freeze->work, &proc->todo);3989 binder_wakeup_proc_ilocked(proc);3990 }3991 binder_inner_proc_unlock(proc);3992 return 0;3993}3994 3995/**3996 * binder_free_buf() - free the specified buffer3997 * @proc: binder proc that owns buffer3998 * @buffer: buffer to be freed3999 * @is_failure: failed to send transaction4000 *4001 * If buffer for an async transaction, enqueue the next async4002 * transaction from the node.4003 *4004 * Cleanup buffer and free it.4005 */4006static void4007binder_free_buf(struct binder_proc *proc,4008 struct binder_thread *thread,4009 struct binder_buffer *buffer, bool is_failure)4010{4011 binder_inner_proc_lock(proc);4012 if (buffer->transaction) {4013 buffer->transaction->buffer = NULL;4014 buffer->transaction = NULL;4015 }4016 binder_inner_proc_unlock(proc);4017 if (buffer->async_transaction && buffer->target_node) {4018 struct binder_node *buf_node;4019 struct binder_work *w;4020 4021 buf_node = buffer->target_node;4022 binder_node_inner_lock(buf_node);4023 BUG_ON(!buf_node->has_async_transaction);4024 BUG_ON(buf_node->proc != proc);4025 w = binder_dequeue_work_head_ilocked(4026 &buf_node->async_todo);4027 if (!w) {4028 buf_node->has_async_transaction = false;4029 } else {4030 binder_enqueue_work_ilocked(4031 w, &proc->todo);4032 binder_wakeup_proc_ilocked(proc);4033 }4034 binder_node_inner_unlock(buf_node);4035 }4036 trace_binder_transaction_buffer_release(buffer);4037 binder_release_entire_buffer(proc, thread, buffer, is_failure);4038 binder_alloc_free_buf(&proc->alloc, buffer);4039}4040 4041static int binder_thread_write(struct binder_proc *proc,4042 struct binder_thread *thread,4043 binder_uintptr_t binder_buffer, size_t size,4044 binder_size_t *consumed)4045{4046 uint32_t cmd;4047 struct binder_context *context = proc->context;4048 void __user *buffer = (void __user *)(uintptr_t)binder_buffer;4049 void __user *ptr = buffer + *consumed;4050 void __user *end = buffer + size;4051 4052 while (ptr < end && thread->return_error.cmd == BR_OK) {4053 int ret;4054 4055 if (get_user(cmd, (uint32_t __user *)ptr))4056 return -EFAULT;4057 ptr += sizeof(uint32_t);4058 trace_binder_command(cmd);4059 if (_IOC_NR(cmd) < ARRAY_SIZE(binder_stats.bc)) {4060 atomic_inc(&binder_stats.bc[_IOC_NR(cmd)]);4061 atomic_inc(&proc->stats.bc[_IOC_NR(cmd)]);4062 atomic_inc(&thread->stats.bc[_IOC_NR(cmd)]);4063 }4064 switch (cmd) {4065 case BC_INCREFS:4066 case BC_ACQUIRE:4067 case BC_RELEASE:4068 case BC_DECREFS: {4069 uint32_t target;4070 const char *debug_string;4071 bool strong = cmd == BC_ACQUIRE || cmd == BC_RELEASE;4072 bool increment = cmd == BC_INCREFS || cmd == BC_ACQUIRE;4073 struct binder_ref_data rdata;4074 4075 if (get_user(target, (uint32_t __user *)ptr))4076 return -EFAULT;4077 4078 ptr += sizeof(uint32_t);4079 ret = -1;4080 if (increment && !target) {4081 struct binder_node *ctx_mgr_node;4082 4083 mutex_lock(&context->context_mgr_node_lock);4084 ctx_mgr_node = context->binder_context_mgr_node;4085 if (ctx_mgr_node) {4086 if (ctx_mgr_node->proc == proc) {4087 binder_user_error("%d:%d context manager tried to acquire desc 0\n",4088 proc->pid, thread->pid);4089 mutex_unlock(&context->context_mgr_node_lock);4090 return -EINVAL;4091 }4092 ret = binder_inc_ref_for_node(4093 proc, ctx_mgr_node,4094 strong, NULL, &rdata);4095 }4096 mutex_unlock(&context->context_mgr_node_lock);4097 }4098 if (ret)4099 ret = binder_update_ref_for_handle(4100 proc, target, increment, strong,4101 &rdata);4102 if (!ret && rdata.desc != target) {4103 binder_user_error("%d:%d tried to acquire reference to desc %d, got %d instead\n",4104 proc->pid, thread->pid,4105 target, rdata.desc);4106 }4107 switch (cmd) {4108 case BC_INCREFS:4109 debug_string = "IncRefs";4110 break;4111 case BC_ACQUIRE:4112 debug_string = "Acquire";4113 break;4114 case BC_RELEASE:4115 debug_string = "Release";4116 break;4117 case BC_DECREFS:4118 default:4119 debug_string = "DecRefs";4120 break;4121 }4122 if (ret) {4123 binder_user_error("%d:%d %s %d refcount change on invalid ref %d ret %d\n",4124 proc->pid, thread->pid, debug_string,4125 strong, target, ret);4126 break;4127 }4128 binder_debug(BINDER_DEBUG_USER_REFS,4129 "%d:%d %s ref %d desc %d s %d w %d\n",4130 proc->pid, thread->pid, debug_string,4131 rdata.debug_id, rdata.desc, rdata.strong,4132 rdata.weak);4133 break;4134 }4135 case BC_INCREFS_DONE:4136 case BC_ACQUIRE_DONE: {4137 binder_uintptr_t node_ptr;4138 binder_uintptr_t cookie;4139 struct binder_node *node;4140 bool free_node;4141 4142 if (get_user(node_ptr, (binder_uintptr_t __user *)ptr))4143 return -EFAULT;4144 ptr += sizeof(binder_uintptr_t);4145 if (get_user(cookie, (binder_uintptr_t __user *)ptr))4146 return -EFAULT;4147 ptr += sizeof(binder_uintptr_t);4148 node = binder_get_node(proc, node_ptr);4149 if (node == NULL) {4150 binder_user_error("%d:%d %s u%016llx no match\n",4151 proc->pid, thread->pid,4152 cmd == BC_INCREFS_DONE ?4153 "BC_INCREFS_DONE" :4154 "BC_ACQUIRE_DONE",4155 (u64)node_ptr);4156 break;4157 }4158 if (cookie != node->cookie) {4159 binder_user_error("%d:%d %s u%016llx node %d cookie mismatch %016llx != %016llx\n",4160 proc->pid, thread->pid,4161 cmd == BC_INCREFS_DONE ?4162 "BC_INCREFS_DONE" : "BC_ACQUIRE_DONE",4163 (u64)node_ptr, node->debug_id,4164 (u64)cookie, (u64)node->cookie);4165 binder_put_node(node);4166 break;4167 }4168 binder_node_inner_lock(node);4169 if (cmd == BC_ACQUIRE_DONE) {4170 if (node->pending_strong_ref == 0) {4171 binder_user_error("%d:%d BC_ACQUIRE_DONE node %d has no pending acquire request\n",4172 proc->pid, thread->pid,4173 node->debug_id);4174 binder_node_inner_unlock(node);4175 binder_put_node(node);4176 break;4177 }4178 node->pending_strong_ref = 0;4179 } else {4180 if (node->pending_weak_ref == 0) {4181 binder_user_error("%d:%d BC_INCREFS_DONE node %d has no pending increfs request\n",4182 proc->pid, thread->pid,4183 node->debug_id);4184 binder_node_inner_unlock(node);4185 binder_put_node(node);4186 break;4187 }4188 node->pending_weak_ref = 0;4189 }4190 free_node = binder_dec_node_nilocked(node,4191 cmd == BC_ACQUIRE_DONE, 0);4192 WARN_ON(free_node);4193 binder_debug(BINDER_DEBUG_USER_REFS,4194 "%d:%d %s node %d ls %d lw %d tr %d\n",4195 proc->pid, thread->pid,4196 cmd == BC_INCREFS_DONE ? "BC_INCREFS_DONE" : "BC_ACQUIRE_DONE",4197 node->debug_id, node->local_strong_refs,4198 node->local_weak_refs, node->tmp_refs);4199 binder_node_inner_unlock(node);4200 binder_put_node(node);4201 break;4202 }4203 case BC_ATTEMPT_ACQUIRE:4204 pr_err("BC_ATTEMPT_ACQUIRE not supported\n");4205 return -EINVAL;4206 case BC_ACQUIRE_RESULT:4207 pr_err("BC_ACQUIRE_RESULT not supported\n");4208 return -EINVAL;4209 4210 case BC_FREE_BUFFER: {4211 binder_uintptr_t data_ptr;4212 struct binder_buffer *buffer;4213 4214 if (get_user(data_ptr, (binder_uintptr_t __user *)ptr))4215 return -EFAULT;4216 ptr += sizeof(binder_uintptr_t);4217 4218 buffer = binder_alloc_prepare_to_free(&proc->alloc,4219 data_ptr);4220 if (IS_ERR_OR_NULL(buffer)) {4221 if (PTR_ERR(buffer) == -EPERM) {4222 binder_user_error(4223 "%d:%d BC_FREE_BUFFER u%016llx matched unreturned or currently freeing buffer\n",4224 proc->pid, thread->pid,4225 (u64)data_ptr);4226 } else {4227 binder_user_error(4228 "%d:%d BC_FREE_BUFFER u%016llx no match\n",4229 proc->pid, thread->pid,4230 (u64)data_ptr);4231 }4232 break;4233 }4234 binder_debug(BINDER_DEBUG_FREE_BUFFER,4235 "%d:%d BC_FREE_BUFFER u%016llx found buffer %d for %s transaction\n",4236 proc->pid, thread->pid, (u64)data_ptr,4237 buffer->debug_id,4238 buffer->transaction ? "active" : "finished");4239 binder_free_buf(proc, thread, buffer, false);4240 break;4241 }4242 4243 case BC_TRANSACTION_SG:4244 case BC_REPLY_SG: {4245 struct binder_transaction_data_sg tr;4246 4247 if (copy_from_user(&tr, ptr, sizeof(tr)))4248 return -EFAULT;4249 ptr += sizeof(tr);4250 binder_transaction(proc, thread, &tr.transaction_data,4251 cmd == BC_REPLY_SG, tr.buffers_size);4252 break;4253 }4254 case BC_TRANSACTION:4255 case BC_REPLY: {4256 struct binder_transaction_data tr;4257 4258 if (copy_from_user(&tr, ptr, sizeof(tr)))4259 return -EFAULT;4260 ptr += sizeof(tr);4261 binder_transaction(proc, thread, &tr,4262 cmd == BC_REPLY, 0);4263 break;4264 }4265 4266 case BC_REGISTER_LOOPER:4267 binder_debug(BINDER_DEBUG_THREADS,4268 "%d:%d BC_REGISTER_LOOPER\n",4269 proc->pid, thread->pid);4270 binder_inner_proc_lock(proc);4271 if (thread->looper & BINDER_LOOPER_STATE_ENTERED) {4272 thread->looper |= BINDER_LOOPER_STATE_INVALID;4273 binder_user_error("%d:%d ERROR: BC_REGISTER_LOOPER called after BC_ENTER_LOOPER\n",4274 proc->pid, thread->pid);4275 } else if (proc->requested_threads == 0) {4276 thread->looper |= BINDER_LOOPER_STATE_INVALID;4277 binder_user_error("%d:%d ERROR: BC_REGISTER_LOOPER called without request\n",4278 proc->pid, thread->pid);4279 } else {4280 proc->requested_threads--;4281 proc->requested_threads_started++;4282 }4283 thread->looper |= BINDER_LOOPER_STATE_REGISTERED;4284 binder_inner_proc_unlock(proc);4285 break;4286 case BC_ENTER_LOOPER:4287 binder_debug(BINDER_DEBUG_THREADS,4288 "%d:%d BC_ENTER_LOOPER\n",4289 proc->pid, thread->pid);4290 if (thread->looper & BINDER_LOOPER_STATE_REGISTERED) {4291 thread->looper |= BINDER_LOOPER_STATE_INVALID;4292 binder_user_error("%d:%d ERROR: BC_ENTER_LOOPER called after BC_REGISTER_LOOPER\n",4293 proc->pid, thread->pid);4294 }4295 thread->looper |= BINDER_LOOPER_STATE_ENTERED;4296 break;4297 case BC_EXIT_LOOPER:4298 binder_debug(BINDER_DEBUG_THREADS,4299 "%d:%d BC_EXIT_LOOPER\n",4300 proc->pid, thread->pid);4301 thread->looper |= BINDER_LOOPER_STATE_EXITED;4302 break;4303 4304 case BC_REQUEST_DEATH_NOTIFICATION:4305 case BC_CLEAR_DEATH_NOTIFICATION: {4306 uint32_t target;4307 binder_uintptr_t cookie;4308 struct binder_ref *ref;4309 struct binder_ref_death *death = NULL;4310 4311 if (get_user(target, (uint32_t __user *)ptr))4312 return -EFAULT;4313 ptr += sizeof(uint32_t);4314 if (get_user(cookie, (binder_uintptr_t __user *)ptr))4315 return -EFAULT;4316 ptr += sizeof(binder_uintptr_t);4317 if (cmd == BC_REQUEST_DEATH_NOTIFICATION) {4318 /*4319 * Allocate memory for death notification4320 * before taking lock4321 */4322 death = kzalloc(sizeof(*death), GFP_KERNEL);4323 if (death == NULL) {4324 WARN_ON(thread->return_error.cmd !=4325 BR_OK);4326 thread->return_error.cmd = BR_ERROR;4327 binder_enqueue_thread_work(4328 thread,4329 &thread->return_error.work);4330 binder_debug(4331 BINDER_DEBUG_FAILED_TRANSACTION,4332 "%d:%d BC_REQUEST_DEATH_NOTIFICATION failed\n",4333 proc->pid, thread->pid);4334 break;4335 }4336 }4337 binder_proc_lock(proc);4338 ref = binder_get_ref_olocked(proc, target, false);4339 if (ref == NULL) {4340 binder_user_error("%d:%d %s invalid ref %d\n",4341 proc->pid, thread->pid,4342 cmd == BC_REQUEST_DEATH_NOTIFICATION ?4343 "BC_REQUEST_DEATH_NOTIFICATION" :4344 "BC_CLEAR_DEATH_NOTIFICATION",4345 target);4346 binder_proc_unlock(proc);4347 kfree(death);4348 break;4349 }4350 4351 binder_debug(BINDER_DEBUG_DEATH_NOTIFICATION,4352 "%d:%d %s %016llx ref %d desc %d s %d w %d for node %d\n",4353 proc->pid, thread->pid,4354 cmd == BC_REQUEST_DEATH_NOTIFICATION ?4355 "BC_REQUEST_DEATH_NOTIFICATION" :4356 "BC_CLEAR_DEATH_NOTIFICATION",4357 (u64)cookie, ref->data.debug_id,4358 ref->data.desc, ref->data.strong,4359 ref->data.weak, ref->node->debug_id);4360 4361 binder_node_lock(ref->node);4362 if (cmd == BC_REQUEST_DEATH_NOTIFICATION) {4363 if (ref->death) {4364 binder_user_error("%d:%d BC_REQUEST_DEATH_NOTIFICATION death notification already set\n",4365 proc->pid, thread->pid);4366 binder_node_unlock(ref->node);4367 binder_proc_unlock(proc);4368 kfree(death);4369 break;4370 }4371 binder_stats_created(BINDER_STAT_DEATH);4372 INIT_LIST_HEAD(&death->work.entry);4373 death->cookie = cookie;4374 ref->death = death;4375 if (ref->node->proc == NULL) {4376 ref->death->work.type = BINDER_WORK_DEAD_BINDER;4377 4378 binder_inner_proc_lock(proc);4379 binder_enqueue_work_ilocked(4380 &ref->death->work, &proc->todo);4381 binder_wakeup_proc_ilocked(proc);4382 binder_inner_proc_unlock(proc);4383 }4384 } else {4385 if (ref->death == NULL) {4386 binder_user_error("%d:%d BC_CLEAR_DEATH_NOTIFICATION death notification not active\n",4387 proc->pid, thread->pid);4388 binder_node_unlock(ref->node);4389 binder_proc_unlock(proc);4390 break;4391 }4392 death = ref->death;4393 if (death->cookie != cookie) {4394 binder_user_error("%d:%d BC_CLEAR_DEATH_NOTIFICATION death notification cookie mismatch %016llx != %016llx\n",4395 proc->pid, thread->pid,4396 (u64)death->cookie,4397 (u64)cookie);4398 binder_node_unlock(ref->node);4399 binder_proc_unlock(proc);4400 break;4401 }4402 ref->death = NULL;4403 binder_inner_proc_lock(proc);4404 if (list_empty(&death->work.entry)) {4405 death->work.type = BINDER_WORK_CLEAR_DEATH_NOTIFICATION;4406 if (thread->looper &4407 (BINDER_LOOPER_STATE_REGISTERED |4408 BINDER_LOOPER_STATE_ENTERED))4409 binder_enqueue_thread_work_ilocked(4410 thread,4411 &death->work);4412 else {4413 binder_enqueue_work_ilocked(4414 &death->work,4415 &proc->todo);4416 binder_wakeup_proc_ilocked(4417 proc);4418 }4419 } else {4420 BUG_ON(death->work.type != BINDER_WORK_DEAD_BINDER);4421 death->work.type = BINDER_WORK_DEAD_BINDER_AND_CLEAR;4422 }4423 binder_inner_proc_unlock(proc);4424 }4425 binder_node_unlock(ref->node);4426 binder_proc_unlock(proc);4427 } break;4428 case BC_DEAD_BINDER_DONE: {4429 struct binder_work *w;4430 binder_uintptr_t cookie;4431 struct binder_ref_death *death = NULL;4432 4433 if (get_user(cookie, (binder_uintptr_t __user *)ptr))4434 return -EFAULT;4435 4436 ptr += sizeof(cookie);4437 binder_inner_proc_lock(proc);4438 list_for_each_entry(w, &proc->delivered_death,4439 entry) {4440 struct binder_ref_death *tmp_death =4441 container_of(w,4442 struct binder_ref_death,4443 work);4444 4445 if (tmp_death->cookie == cookie) {4446 death = tmp_death;4447 break;4448 }4449 }4450 binder_debug(BINDER_DEBUG_DEAD_BINDER,4451 "%d:%d BC_DEAD_BINDER_DONE %016llx found %pK\n",4452 proc->pid, thread->pid, (u64)cookie,4453 death);4454 if (death == NULL) {4455 binder_user_error("%d:%d BC_DEAD_BINDER_DONE %016llx not found\n",4456 proc->pid, thread->pid, (u64)cookie);4457 binder_inner_proc_unlock(proc);4458 break;4459 }4460 binder_dequeue_work_ilocked(&death->work);4461 if (death->work.type == BINDER_WORK_DEAD_BINDER_AND_CLEAR) {4462 death->work.type = BINDER_WORK_CLEAR_DEATH_NOTIFICATION;4463 if (thread->looper &4464 (BINDER_LOOPER_STATE_REGISTERED |4465 BINDER_LOOPER_STATE_ENTERED))4466 binder_enqueue_thread_work_ilocked(4467 thread, &death->work);4468 else {4469 binder_enqueue_work_ilocked(4470 &death->work,4471 &proc->todo);4472 binder_wakeup_proc_ilocked(proc);4473 }4474 }4475 binder_inner_proc_unlock(proc);4476 } break;4477 4478 case BC_REQUEST_FREEZE_NOTIFICATION: {4479 struct binder_handle_cookie handle_cookie;4480 int error;4481 4482 if (copy_from_user(&handle_cookie, ptr, sizeof(handle_cookie)))4483 return -EFAULT;4484 ptr += sizeof(handle_cookie);4485 error = binder_request_freeze_notification(proc, thread,4486 &handle_cookie);4487 if (error)4488 return error;4489 } break;4490 4491 case BC_CLEAR_FREEZE_NOTIFICATION: {4492 struct binder_handle_cookie handle_cookie;4493 int error;4494 4495 if (copy_from_user(&handle_cookie, ptr, sizeof(handle_cookie)))4496 return -EFAULT;4497 ptr += sizeof(handle_cookie);4498 error = binder_clear_freeze_notification(proc, thread, &handle_cookie);4499 if (error)4500 return error;4501 } break;4502 4503 case BC_FREEZE_NOTIFICATION_DONE: {4504 binder_uintptr_t cookie;4505 int error;4506 4507 if (get_user(cookie, (binder_uintptr_t __user *)ptr))4508 return -EFAULT;4509 4510 ptr += sizeof(cookie);4511 error = binder_freeze_notification_done(proc, thread, cookie);4512 if (error)4513 return error;4514 } break;4515 4516 default:4517 pr_err("%d:%d unknown command %u\n",4518 proc->pid, thread->pid, cmd);4519 return -EINVAL;4520 }4521 *consumed = ptr - buffer;4522 }4523 return 0;4524}4525 4526static void binder_stat_br(struct binder_proc *proc,4527 struct binder_thread *thread, uint32_t cmd)4528{4529 trace_binder_return(cmd);4530 if (_IOC_NR(cmd) < ARRAY_SIZE(binder_stats.br)) {4531 atomic_inc(&binder_stats.br[_IOC_NR(cmd)]);4532 atomic_inc(&proc->stats.br[_IOC_NR(cmd)]);4533 atomic_inc(&thread->stats.br[_IOC_NR(cmd)]);4534 }4535}4536 4537static int binder_put_node_cmd(struct binder_proc *proc,4538 struct binder_thread *thread,4539 void __user **ptrp,4540 binder_uintptr_t node_ptr,4541 binder_uintptr_t node_cookie,4542 int node_debug_id,4543 uint32_t cmd, const char *cmd_name)4544{4545 void __user *ptr = *ptrp;4546 4547 if (put_user(cmd, (uint32_t __user *)ptr))4548 return -EFAULT;4549 ptr += sizeof(uint32_t);4550 4551 if (put_user(node_ptr, (binder_uintptr_t __user *)ptr))4552 return -EFAULT;4553 ptr += sizeof(binder_uintptr_t);4554 4555 if (put_user(node_cookie, (binder_uintptr_t __user *)ptr))4556 return -EFAULT;4557 ptr += sizeof(binder_uintptr_t);4558 4559 binder_stat_br(proc, thread, cmd);4560 binder_debug(BINDER_DEBUG_USER_REFS, "%d:%d %s %d u%016llx c%016llx\n",4561 proc->pid, thread->pid, cmd_name, node_debug_id,4562 (u64)node_ptr, (u64)node_cookie);4563 4564 *ptrp = ptr;4565 return 0;4566}4567 4568static int binder_wait_for_work(struct binder_thread *thread,4569 bool do_proc_work)4570{4571 DEFINE_WAIT(wait);4572 struct binder_proc *proc = thread->proc;4573 int ret = 0;4574 4575 binder_inner_proc_lock(proc);4576 for (;;) {4577 prepare_to_wait(&thread->wait, &wait, TASK_INTERRUPTIBLE|TASK_FREEZABLE);4578 if (binder_has_work_ilocked(thread, do_proc_work))4579 break;4580 if (do_proc_work)4581 list_add(&thread->waiting_thread_node,4582 &proc->waiting_threads);4583 binder_inner_proc_unlock(proc);4584 schedule();4585 binder_inner_proc_lock(proc);4586 list_del_init(&thread->waiting_thread_node);4587 if (signal_pending(current)) {4588 ret = -EINTR;4589 break;4590 }4591 }4592 finish_wait(&thread->wait, &wait);4593 binder_inner_proc_unlock(proc);4594 4595 return ret;4596}4597 4598/**4599 * binder_apply_fd_fixups() - finish fd translation4600 * @proc: binder_proc associated @t->buffer4601 * @t: binder transaction with list of fd fixups4602 *4603 * Now that we are in the context of the transaction target4604 * process, we can allocate and install fds. Process the4605 * list of fds to translate and fixup the buffer with the4606 * new fds first and only then install the files.4607 *4608 * If we fail to allocate an fd, skip the install and release4609 * any fds that have already been allocated.4610 */4611static int binder_apply_fd_fixups(struct binder_proc *proc,4612 struct binder_transaction *t)4613{4614 struct binder_txn_fd_fixup *fixup, *tmp;4615 int ret = 0;4616 4617 list_for_each_entry(fixup, &t->fd_fixups, fixup_entry) {4618 int fd = get_unused_fd_flags(O_CLOEXEC);4619 4620 if (fd < 0) {4621 binder_debug(BINDER_DEBUG_TRANSACTION,4622 "failed fd fixup txn %d fd %d\n",4623 t->debug_id, fd);4624 ret = -ENOMEM;4625 goto err;4626 }4627 binder_debug(BINDER_DEBUG_TRANSACTION,4628 "fd fixup txn %d fd %d\n",4629 t->debug_id, fd);4630 trace_binder_transaction_fd_recv(t, fd, fixup->offset);4631 fixup->target_fd = fd;4632 if (binder_alloc_copy_to_buffer(&proc->alloc, t->buffer,4633 fixup->offset, &fd,4634 sizeof(u32))) {4635 ret = -EINVAL;4636 goto err;4637 }4638 }4639 list_for_each_entry_safe(fixup, tmp, &t->fd_fixups, fixup_entry) {4640 fd_install(fixup->target_fd, fixup->file);4641 list_del(&fixup->fixup_entry);4642 kfree(fixup);4643 }4644 4645 return ret;4646 4647err:4648 binder_free_txn_fixups(t);4649 return ret;4650}4651 4652static int binder_thread_read(struct binder_proc *proc,4653 struct binder_thread *thread,4654 binder_uintptr_t binder_buffer, size_t size,4655 binder_size_t *consumed, int non_block)4656{4657 void __user *buffer = (void __user *)(uintptr_t)binder_buffer;4658 void __user *ptr = buffer + *consumed;4659 void __user *end = buffer + size;4660 4661 int ret = 0;4662 int wait_for_proc_work;4663 4664 if (*consumed == 0) {4665 if (put_user(BR_NOOP, (uint32_t __user *)ptr))4666 return -EFAULT;4667 ptr += sizeof(uint32_t);4668 }4669 4670retry:4671 binder_inner_proc_lock(proc);4672 wait_for_proc_work = binder_available_for_proc_work_ilocked(thread);4673 binder_inner_proc_unlock(proc);4674 4675 thread->looper |= BINDER_LOOPER_STATE_WAITING;4676 4677 trace_binder_wait_for_work(wait_for_proc_work,4678 !!thread->transaction_stack,4679 !binder_worklist_empty(proc, &thread->todo));4680 if (wait_for_proc_work) {4681 if (!(thread->looper & (BINDER_LOOPER_STATE_REGISTERED |4682 BINDER_LOOPER_STATE_ENTERED))) {4683 binder_user_error("%d:%d ERROR: Thread waiting for process work before calling BC_REGISTER_LOOPER or BC_ENTER_LOOPER (state %x)\n",4684 proc->pid, thread->pid, thread->looper);4685 wait_event_interruptible(binder_user_error_wait,4686 binder_stop_on_user_error < 2);4687 }4688 binder_set_nice(proc->default_priority);4689 }4690 4691 if (non_block) {4692 if (!binder_has_work(thread, wait_for_proc_work))4693 ret = -EAGAIN;4694 } else {4695 ret = binder_wait_for_work(thread, wait_for_proc_work);4696 }4697 4698 thread->looper &= ~BINDER_LOOPER_STATE_WAITING;4699 4700 if (ret)4701 return ret;4702 4703 while (1) {4704 uint32_t cmd;4705 struct binder_transaction_data_secctx tr;4706 struct binder_transaction_data *trd = &tr.transaction_data;4707 struct binder_work *w = NULL;4708 struct list_head *list = NULL;4709 struct binder_transaction *t = NULL;4710 struct binder_thread *t_from;4711 size_t trsize = sizeof(*trd);4712 4713 binder_inner_proc_lock(proc);4714 if (!binder_worklist_empty_ilocked(&thread->todo))4715 list = &thread->todo;4716 else if (!binder_worklist_empty_ilocked(&proc->todo) &&4717 wait_for_proc_work)4718 list = &proc->todo;4719 else {4720 binder_inner_proc_unlock(proc);4721 4722 /* no data added */4723 if (ptr - buffer == 4 && !thread->looper_need_return)4724 goto retry;4725 break;4726 }4727 4728 if (end - ptr < sizeof(tr) + 4) {4729 binder_inner_proc_unlock(proc);4730 break;4731 }4732 w = binder_dequeue_work_head_ilocked(list);4733 if (binder_worklist_empty_ilocked(&thread->todo))4734 thread->process_todo = false;4735 4736 switch (w->type) {4737 case BINDER_WORK_TRANSACTION: {4738 binder_inner_proc_unlock(proc);4739 t = container_of(w, struct binder_transaction, work);4740 } break;4741 case BINDER_WORK_RETURN_ERROR: {4742 struct binder_error *e = container_of(4743 w, struct binder_error, work);4744 4745 WARN_ON(e->cmd == BR_OK);4746 binder_inner_proc_unlock(proc);4747 if (put_user(e->cmd, (uint32_t __user *)ptr))4748 return -EFAULT;4749 cmd = e->cmd;4750 e->cmd = BR_OK;4751 ptr += sizeof(uint32_t);4752 4753 binder_stat_br(proc, thread, cmd);4754 } break;4755 case BINDER_WORK_TRANSACTION_COMPLETE:4756 case BINDER_WORK_TRANSACTION_PENDING:4757 case BINDER_WORK_TRANSACTION_ONEWAY_SPAM_SUSPECT: {4758 if (proc->oneway_spam_detection_enabled &&4759 w->type == BINDER_WORK_TRANSACTION_ONEWAY_SPAM_SUSPECT)4760 cmd = BR_ONEWAY_SPAM_SUSPECT;4761 else if (w->type == BINDER_WORK_TRANSACTION_PENDING)4762 cmd = BR_TRANSACTION_PENDING_FROZEN;4763 else4764 cmd = BR_TRANSACTION_COMPLETE;4765 binder_inner_proc_unlock(proc);4766 kfree(w);4767 binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE);4768 if (put_user(cmd, (uint32_t __user *)ptr))4769 return -EFAULT;4770 ptr += sizeof(uint32_t);4771 4772 binder_stat_br(proc, thread, cmd);4773 binder_debug(BINDER_DEBUG_TRANSACTION_COMPLETE,4774 "%d:%d BR_TRANSACTION_COMPLETE\n",4775 proc->pid, thread->pid);4776 } break;4777 case BINDER_WORK_NODE: {4778 struct binder_node *node = container_of(w, struct binder_node, work);4779 int strong, weak;4780 binder_uintptr_t node_ptr = node->ptr;4781 binder_uintptr_t node_cookie = node->cookie;4782 int node_debug_id = node->debug_id;4783 int has_weak_ref;4784 int has_strong_ref;4785 void __user *orig_ptr = ptr;4786 4787 BUG_ON(proc != node->proc);4788 strong = node->internal_strong_refs ||4789 node->local_strong_refs;4790 weak = !hlist_empty(&node->refs) ||4791 node->local_weak_refs ||4792 node->tmp_refs || strong;4793 has_strong_ref = node->has_strong_ref;4794 has_weak_ref = node->has_weak_ref;4795 4796 if (weak && !has_weak_ref) {4797 node->has_weak_ref = 1;4798 node->pending_weak_ref = 1;4799 node->local_weak_refs++;4800 }4801 if (strong && !has_strong_ref) {4802 node->has_strong_ref = 1;4803 node->pending_strong_ref = 1;4804 node->local_strong_refs++;4805 }4806 if (!strong && has_strong_ref)4807 node->has_strong_ref = 0;4808 if (!weak && has_weak_ref)4809 node->has_weak_ref = 0;4810 if (!weak && !strong) {4811 binder_debug(BINDER_DEBUG_INTERNAL_REFS,4812 "%d:%d node %d u%016llx c%016llx deleted\n",4813 proc->pid, thread->pid,4814 node_debug_id,4815 (u64)node_ptr,4816 (u64)node_cookie);4817 rb_erase(&node->rb_node, &proc->nodes);4818 binder_inner_proc_unlock(proc);4819 binder_node_lock(node);4820 /*4821 * Acquire the node lock before freeing the4822 * node to serialize with other threads that4823 * may have been holding the node lock while4824 * decrementing this node (avoids race where4825 * this thread frees while the other thread4826 * is unlocking the node after the final4827 * decrement)4828 */4829 binder_node_unlock(node);4830 binder_free_node(node);4831 } else4832 binder_inner_proc_unlock(proc);4833 4834 if (weak && !has_weak_ref)4835 ret = binder_put_node_cmd(4836 proc, thread, &ptr, node_ptr,4837 node_cookie, node_debug_id,4838 BR_INCREFS, "BR_INCREFS");4839 if (!ret && strong && !has_strong_ref)4840 ret = binder_put_node_cmd(4841 proc, thread, &ptr, node_ptr,4842 node_cookie, node_debug_id,4843 BR_ACQUIRE, "BR_ACQUIRE");4844 if (!ret && !strong && has_strong_ref)4845 ret = binder_put_node_cmd(4846 proc, thread, &ptr, node_ptr,4847 node_cookie, node_debug_id,4848 BR_RELEASE, "BR_RELEASE");4849 if (!ret && !weak && has_weak_ref)4850 ret = binder_put_node_cmd(4851 proc, thread, &ptr, node_ptr,4852 node_cookie, node_debug_id,4853 BR_DECREFS, "BR_DECREFS");4854 if (orig_ptr == ptr)4855 binder_debug(BINDER_DEBUG_INTERNAL_REFS,4856 "%d:%d node %d u%016llx c%016llx state unchanged\n",4857 proc->pid, thread->pid,4858 node_debug_id,4859 (u64)node_ptr,4860 (u64)node_cookie);4861 if (ret)4862 return ret;4863 } break;4864 case BINDER_WORK_DEAD_BINDER:4865 case BINDER_WORK_DEAD_BINDER_AND_CLEAR:4866 case BINDER_WORK_CLEAR_DEATH_NOTIFICATION: {4867 struct binder_ref_death *death;4868 uint32_t cmd;4869 binder_uintptr_t cookie;4870 4871 death = container_of(w, struct binder_ref_death, work);4872 if (w->type == BINDER_WORK_CLEAR_DEATH_NOTIFICATION)4873 cmd = BR_CLEAR_DEATH_NOTIFICATION_DONE;4874 else4875 cmd = BR_DEAD_BINDER;4876 cookie = death->cookie;4877 4878 binder_debug(BINDER_DEBUG_DEATH_NOTIFICATION,4879 "%d:%d %s %016llx\n",4880 proc->pid, thread->pid,4881 cmd == BR_DEAD_BINDER ?4882 "BR_DEAD_BINDER" :4883 "BR_CLEAR_DEATH_NOTIFICATION_DONE",4884 (u64)cookie);4885 if (w->type == BINDER_WORK_CLEAR_DEATH_NOTIFICATION) {4886 binder_inner_proc_unlock(proc);4887 kfree(death);4888 binder_stats_deleted(BINDER_STAT_DEATH);4889 } else {4890 binder_enqueue_work_ilocked(4891 w, &proc->delivered_death);4892 binder_inner_proc_unlock(proc);4893 }4894 if (put_user(cmd, (uint32_t __user *)ptr))4895 return -EFAULT;4896 ptr += sizeof(uint32_t);4897 if (put_user(cookie,4898 (binder_uintptr_t __user *)ptr))4899 return -EFAULT;4900 ptr += sizeof(binder_uintptr_t);4901 binder_stat_br(proc, thread, cmd);4902 if (cmd == BR_DEAD_BINDER)4903 goto done; /* DEAD_BINDER notifications can cause transactions */4904 } break;4905 4906 case BINDER_WORK_FROZEN_BINDER: {4907 struct binder_ref_freeze *freeze;4908 struct binder_frozen_state_info info;4909 4910 memset(&info, 0, sizeof(info));4911 freeze = container_of(w, struct binder_ref_freeze, work);4912 info.is_frozen = freeze->is_frozen;4913 info.cookie = freeze->cookie;4914 freeze->sent = true;4915 binder_enqueue_work_ilocked(w, &proc->delivered_freeze);4916 binder_inner_proc_unlock(proc);4917 4918 if (put_user(BR_FROZEN_BINDER, (uint32_t __user *)ptr))4919 return -EFAULT;4920 ptr += sizeof(uint32_t);4921 if (copy_to_user(ptr, &info, sizeof(info)))4922 return -EFAULT;4923 ptr += sizeof(info);4924 binder_stat_br(proc, thread, BR_FROZEN_BINDER);4925 goto done; /* BR_FROZEN_BINDER notifications can cause transactions */4926 } break;4927 4928 case BINDER_WORK_CLEAR_FREEZE_NOTIFICATION: {4929 struct binder_ref_freeze *freeze =4930 container_of(w, struct binder_ref_freeze, work);4931 binder_uintptr_t cookie = freeze->cookie;4932 4933 binder_inner_proc_unlock(proc);4934 kfree(freeze);4935 binder_stats_deleted(BINDER_STAT_FREEZE);4936 if (put_user(BR_CLEAR_FREEZE_NOTIFICATION_DONE, (uint32_t __user *)ptr))4937 return -EFAULT;4938 ptr += sizeof(uint32_t);4939 if (put_user(cookie, (binder_uintptr_t __user *)ptr))4940 return -EFAULT;4941 ptr += sizeof(binder_uintptr_t);4942 binder_stat_br(proc, thread, BR_CLEAR_FREEZE_NOTIFICATION_DONE);4943 } break;4944 4945 default:4946 binder_inner_proc_unlock(proc);4947 pr_err("%d:%d: bad work type %d\n",4948 proc->pid, thread->pid, w->type);4949 break;4950 }4951 4952 if (!t)4953 continue;4954 4955 BUG_ON(t->buffer == NULL);4956 if (t->buffer->target_node) {4957 struct binder_node *target_node = t->buffer->target_node;4958 4959 trd->target.ptr = target_node->ptr;4960 trd->cookie = target_node->cookie;4961 t->saved_priority = task_nice(current);4962 if (t->priority < target_node->min_priority &&4963 !(t->flags & TF_ONE_WAY))4964 binder_set_nice(t->priority);4965 else if (!(t->flags & TF_ONE_WAY) ||4966 t->saved_priority > target_node->min_priority)4967 binder_set_nice(target_node->min_priority);4968 cmd = BR_TRANSACTION;4969 } else {4970 trd->target.ptr = 0;4971 trd->cookie = 0;4972 cmd = BR_REPLY;4973 }4974 trd->code = t->code;4975 trd->flags = t->flags;4976 trd->sender_euid = from_kuid(current_user_ns(), t->sender_euid);4977 4978 t_from = binder_get_txn_from(t);4979 if (t_from) {4980 struct task_struct *sender = t_from->proc->tsk;4981 4982 trd->sender_pid =4983 task_tgid_nr_ns(sender,4984 task_active_pid_ns(current));4985 } else {4986 trd->sender_pid = 0;4987 }4988 4989 ret = binder_apply_fd_fixups(proc, t);4990 if (ret) {4991 struct binder_buffer *buffer = t->buffer;4992 bool oneway = !!(t->flags & TF_ONE_WAY);4993 int tid = t->debug_id;4994 4995 if (t_from)4996 binder_thread_dec_tmpref(t_from);4997 buffer->transaction = NULL;4998 binder_cleanup_transaction(t, "fd fixups failed",4999 BR_FAILED_REPLY);5000 binder_free_buf(proc, thread, buffer, true);5001 binder_debug(BINDER_DEBUG_FAILED_TRANSACTION,5002 "%d:%d %stransaction %d fd fixups failed %d/%d, line %d\n",5003 proc->pid, thread->pid,5004 oneway ? "async " :5005 (cmd == BR_REPLY ? "reply " : ""),5006 tid, BR_FAILED_REPLY, ret, __LINE__);5007 if (cmd == BR_REPLY) {5008 cmd = BR_FAILED_REPLY;5009 if (put_user(cmd, (uint32_t __user *)ptr))5010 return -EFAULT;5011 ptr += sizeof(uint32_t);5012 binder_stat_br(proc, thread, cmd);5013 break;5014 }5015 continue;5016 }5017 trd->data_size = t->buffer->data_size;5018 trd->offsets_size = t->buffer->offsets_size;5019 trd->data.ptr.buffer = t->buffer->user_data;5020 trd->data.ptr.offsets = trd->data.ptr.buffer +5021 ALIGN(t->buffer->data_size,5022 sizeof(void *));5023 5024 tr.secctx = t->security_ctx;5025 if (t->security_ctx) {5026 cmd = BR_TRANSACTION_SEC_CTX;5027 trsize = sizeof(tr);5028 }5029 if (put_user(cmd, (uint32_t __user *)ptr)) {5030 if (t_from)5031 binder_thread_dec_tmpref(t_from);5032 5033 binder_cleanup_transaction(t, "put_user failed",5034 BR_FAILED_REPLY);5035 5036 return -EFAULT;5037 }5038 ptr += sizeof(uint32_t);5039 if (copy_to_user(ptr, &tr, trsize)) {5040 if (t_from)5041 binder_thread_dec_tmpref(t_from);5042 5043 binder_cleanup_transaction(t, "copy_to_user failed",5044 BR_FAILED_REPLY);5045 5046 return -EFAULT;5047 }5048 ptr += trsize;5049 5050 trace_binder_transaction_received(t);5051 binder_stat_br(proc, thread, cmd);5052 binder_debug(BINDER_DEBUG_TRANSACTION,5053 "%d:%d %s %d %d:%d, cmd %u size %zd-%zd ptr %016llx-%016llx\n",5054 proc->pid, thread->pid,5055 (cmd == BR_TRANSACTION) ? "BR_TRANSACTION" :5056 (cmd == BR_TRANSACTION_SEC_CTX) ?5057 "BR_TRANSACTION_SEC_CTX" : "BR_REPLY",5058 t->debug_id, t_from ? t_from->proc->pid : 0,5059 t_from ? t_from->pid : 0, cmd,5060 t->buffer->data_size, t->buffer->offsets_size,5061 (u64)trd->data.ptr.buffer,5062 (u64)trd->data.ptr.offsets);5063 5064 if (t_from)5065 binder_thread_dec_tmpref(t_from);5066 t->buffer->allow_user_free = 1;5067 if (cmd != BR_REPLY && !(t->flags & TF_ONE_WAY)) {5068 binder_inner_proc_lock(thread->proc);5069 t->to_parent = thread->transaction_stack;5070 t->to_thread = thread;5071 thread->transaction_stack = t;5072 binder_inner_proc_unlock(thread->proc);5073 } else {5074 binder_free_transaction(t);5075 }5076 break;5077 }5078 5079done:5080 5081 *consumed = ptr - buffer;5082 binder_inner_proc_lock(proc);5083 if (proc->requested_threads == 0 &&5084 list_empty(&thread->proc->waiting_threads) &&5085 proc->requested_threads_started < proc->max_threads &&5086 (thread->looper & (BINDER_LOOPER_STATE_REGISTERED |5087 BINDER_LOOPER_STATE_ENTERED)) /* the user-space code fails to */5088 /*spawn a new thread if we leave this out */) {5089 proc->requested_threads++;5090 binder_inner_proc_unlock(proc);5091 binder_debug(BINDER_DEBUG_THREADS,5092 "%d:%d BR_SPAWN_LOOPER\n",5093 proc->pid, thread->pid);5094 if (put_user(BR_SPAWN_LOOPER, (uint32_t __user *)buffer))5095 return -EFAULT;5096 binder_stat_br(proc, thread, BR_SPAWN_LOOPER);5097 } else5098 binder_inner_proc_unlock(proc);5099 return 0;5100}5101 5102static void binder_release_work(struct binder_proc *proc,5103 struct list_head *list)5104{5105 struct binder_work *w;5106 enum binder_work_type wtype;5107 5108 while (1) {5109 binder_inner_proc_lock(proc);5110 w = binder_dequeue_work_head_ilocked(list);5111 wtype = w ? w->type : 0;5112 binder_inner_proc_unlock(proc);5113 if (!w)5114 return;5115 5116 switch (wtype) {5117 case BINDER_WORK_TRANSACTION: {5118 struct binder_transaction *t;5119 5120 t = container_of(w, struct binder_transaction, work);5121 5122 binder_cleanup_transaction(t, "process died.",5123 BR_DEAD_REPLY);5124 } break;5125 case BINDER_WORK_RETURN_ERROR: {5126 struct binder_error *e = container_of(5127 w, struct binder_error, work);5128 5129 binder_debug(BINDER_DEBUG_DEAD_TRANSACTION,5130 "undelivered TRANSACTION_ERROR: %u\n",5131 e->cmd);5132 } break;5133 case BINDER_WORK_TRANSACTION_PENDING:5134 case BINDER_WORK_TRANSACTION_ONEWAY_SPAM_SUSPECT:5135 case BINDER_WORK_TRANSACTION_COMPLETE: {5136 binder_debug(BINDER_DEBUG_DEAD_TRANSACTION,5137 "undelivered TRANSACTION_COMPLETE\n");5138 kfree(w);5139 binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE);5140 } break;5141 case BINDER_WORK_DEAD_BINDER_AND_CLEAR:5142 case BINDER_WORK_CLEAR_DEATH_NOTIFICATION: {5143 struct binder_ref_death *death;5144 5145 death = container_of(w, struct binder_ref_death, work);5146 binder_debug(BINDER_DEBUG_DEAD_TRANSACTION,5147 "undelivered death notification, %016llx\n",5148 (u64)death->cookie);5149 kfree(death);5150 binder_stats_deleted(BINDER_STAT_DEATH);5151 } break;5152 case BINDER_WORK_NODE:5153 break;5154 default:5155 pr_err("unexpected work type, %d, not freed\n",5156 wtype);5157 break;5158 }5159 }5160 5161}5162 5163static struct binder_thread *binder_get_thread_ilocked(5164 struct binder_proc *proc, struct binder_thread *new_thread)5165{5166 struct binder_thread *thread = NULL;5167 struct rb_node *parent = NULL;5168 struct rb_node **p = &proc->threads.rb_node;5169 5170 while (*p) {5171 parent = *p;5172 thread = rb_entry(parent, struct binder_thread, rb_node);5173 5174 if (current->pid < thread->pid)5175 p = &(*p)->rb_left;5176 else if (current->pid > thread->pid)5177 p = &(*p)->rb_right;5178 else5179 return thread;5180 }5181 if (!new_thread)5182 return NULL;5183 thread = new_thread;5184 binder_stats_created(BINDER_STAT_THREAD);5185 thread->proc = proc;5186 thread->pid = current->pid;5187 atomic_set(&thread->tmp_ref, 0);5188 init_waitqueue_head(&thread->wait);5189 INIT_LIST_HEAD(&thread->todo);5190 rb_link_node(&thread->rb_node, parent, p);5191 rb_insert_color(&thread->rb_node, &proc->threads);5192 thread->looper_need_return = true;5193 thread->return_error.work.type = BINDER_WORK_RETURN_ERROR;5194 thread->return_error.cmd = BR_OK;5195 thread->reply_error.work.type = BINDER_WORK_RETURN_ERROR;5196 thread->reply_error.cmd = BR_OK;5197 thread->ee.command = BR_OK;5198 INIT_LIST_HEAD(&new_thread->waiting_thread_node);5199 return thread;5200}5201 5202static struct binder_thread *binder_get_thread(struct binder_proc *proc)5203{5204 struct binder_thread *thread;5205 struct binder_thread *new_thread;5206 5207 binder_inner_proc_lock(proc);5208 thread = binder_get_thread_ilocked(proc, NULL);5209 binder_inner_proc_unlock(proc);5210 if (!thread) {5211 new_thread = kzalloc(sizeof(*thread), GFP_KERNEL);5212 if (new_thread == NULL)5213 return NULL;5214 binder_inner_proc_lock(proc);5215 thread = binder_get_thread_ilocked(proc, new_thread);5216 binder_inner_proc_unlock(proc);5217 if (thread != new_thread)5218 kfree(new_thread);5219 }5220 return thread;5221}5222 5223static void binder_free_proc(struct binder_proc *proc)5224{5225 struct binder_device *device;5226 5227 BUG_ON(!list_empty(&proc->todo));5228 BUG_ON(!list_empty(&proc->delivered_death));5229 if (proc->outstanding_txns)5230 pr_warn("%s: Unexpected outstanding_txns %d\n",5231 __func__, proc->outstanding_txns);5232 device = container_of(proc->context, struct binder_device, context);5233 if (refcount_dec_and_test(&device->ref)) {5234 kfree(proc->context->name);5235 kfree(device);5236 }5237 binder_alloc_deferred_release(&proc->alloc);5238 put_task_struct(proc->tsk);5239 put_cred(proc->cred);5240 binder_stats_deleted(BINDER_STAT_PROC);5241 dbitmap_free(&proc->dmap);5242 kfree(proc);5243}5244 5245static void binder_free_thread(struct binder_thread *thread)5246{5247 BUG_ON(!list_empty(&thread->todo));5248 binder_stats_deleted(BINDER_STAT_THREAD);5249 binder_proc_dec_tmpref(thread->proc);5250 kfree(thread);5251}5252 5253static int binder_thread_release(struct binder_proc *proc,5254 struct binder_thread *thread)5255{5256 struct binder_transaction *t;5257 struct binder_transaction *send_reply = NULL;5258 int active_transactions = 0;5259 struct binder_transaction *last_t = NULL;5260 5261 binder_inner_proc_lock(thread->proc);5262 /*5263 * take a ref on the proc so it survives5264 * after we remove this thread from proc->threads.5265 * The corresponding dec is when we actually5266 * free the thread in binder_free_thread()5267 */5268 proc->tmp_ref++;5269 /*5270 * take a ref on this thread to ensure it5271 * survives while we are releasing it5272 */5273 atomic_inc(&thread->tmp_ref);5274 rb_erase(&thread->rb_node, &proc->threads);5275 t = thread->transaction_stack;5276 if (t) {5277 spin_lock(&t->lock);5278 if (t->to_thread == thread)5279 send_reply = t;5280 } else {5281 __acquire(&t->lock);5282 }5283 thread->is_dead = true;5284 5285 while (t) {5286 last_t = t;5287 active_transactions++;5288 binder_debug(BINDER_DEBUG_DEAD_TRANSACTION,5289 "release %d:%d transaction %d %s, still active\n",5290 proc->pid, thread->pid,5291 t->debug_id,5292 (t->to_thread == thread) ? "in" : "out");5293 5294 if (t->to_thread == thread) {5295 thread->proc->outstanding_txns--;5296 t->to_proc = NULL;5297 t->to_thread = NULL;5298 if (t->buffer) {5299 t->buffer->transaction = NULL;5300 t->buffer = NULL;5301 }5302 t = t->to_parent;5303 } else if (t->from == thread) {5304 t->from = NULL;5305 t = t->from_parent;5306 } else5307 BUG();5308 spin_unlock(&last_t->lock);5309 if (t)5310 spin_lock(&t->lock);5311 else5312 __acquire(&t->lock);5313 }5314 /* annotation for sparse, lock not acquired in last iteration above */5315 __release(&t->lock);5316 5317 /*5318 * If this thread used poll, make sure we remove the waitqueue from any5319 * poll data structures holding it.5320 */5321 if (thread->looper & BINDER_LOOPER_STATE_POLL)5322 wake_up_pollfree(&thread->wait);5323 5324 binder_inner_proc_unlock(thread->proc);5325 5326 /*5327 * This is needed to avoid races between wake_up_pollfree() above and5328 * someone else removing the last entry from the queue for other reasons5329 * (e.g. ep_remove_wait_queue() being called due to an epoll file5330 * descriptor being closed). Such other users hold an RCU read lock, so5331 * we can be sure they're done after we call synchronize_rcu().5332 */5333 if (thread->looper & BINDER_LOOPER_STATE_POLL)5334 synchronize_rcu();5335 5336 if (send_reply)5337 binder_send_failed_reply(send_reply, BR_DEAD_REPLY);5338 binder_release_work(proc, &thread->todo);5339 binder_thread_dec_tmpref(thread);5340 return active_transactions;5341}5342 5343static __poll_t binder_poll(struct file *filp,5344 struct poll_table_struct *wait)5345{5346 struct binder_proc *proc = filp->private_data;5347 struct binder_thread *thread = NULL;5348 bool wait_for_proc_work;5349 5350 thread = binder_get_thread(proc);5351 if (!thread)5352 return EPOLLERR;5353 5354 binder_inner_proc_lock(thread->proc);5355 thread->looper |= BINDER_LOOPER_STATE_POLL;5356 wait_for_proc_work = binder_available_for_proc_work_ilocked(thread);5357 5358 binder_inner_proc_unlock(thread->proc);5359 5360 poll_wait(filp, &thread->wait, wait);5361 5362 if (binder_has_work(thread, wait_for_proc_work))5363 return EPOLLIN;5364 5365 return 0;5366}5367 5368static int binder_ioctl_write_read(struct file *filp, unsigned long arg,5369 struct binder_thread *thread)5370{5371 int ret = 0;5372 struct binder_proc *proc = filp->private_data;5373 void __user *ubuf = (void __user *)arg;5374 struct binder_write_read bwr;5375 5376 if (copy_from_user(&bwr, ubuf, sizeof(bwr))) {5377 ret = -EFAULT;5378 goto out;5379 }5380 binder_debug(BINDER_DEBUG_READ_WRITE,5381 "%d:%d write %lld at %016llx, read %lld at %016llx\n",5382 proc->pid, thread->pid,5383 (u64)bwr.write_size, (u64)bwr.write_buffer,5384 (u64)bwr.read_size, (u64)bwr.read_buffer);5385 5386 if (bwr.write_size > 0) {5387 ret = binder_thread_write(proc, thread,5388 bwr.write_buffer,5389 bwr.write_size,5390 &bwr.write_consumed);5391 trace_binder_write_done(ret);5392 if (ret < 0) {5393 bwr.read_consumed = 0;5394 if (copy_to_user(ubuf, &bwr, sizeof(bwr)))5395 ret = -EFAULT;5396 goto out;5397 }5398 }5399 if (bwr.read_size > 0) {5400 ret = binder_thread_read(proc, thread, bwr.read_buffer,5401 bwr.read_size,5402 &bwr.read_consumed,5403 filp->f_flags & O_NONBLOCK);5404 trace_binder_read_done(ret);5405 binder_inner_proc_lock(proc);5406 if (!binder_worklist_empty_ilocked(&proc->todo))5407 binder_wakeup_proc_ilocked(proc);5408 binder_inner_proc_unlock(proc);5409 if (ret < 0) {5410 if (copy_to_user(ubuf, &bwr, sizeof(bwr)))5411 ret = -EFAULT;5412 goto out;5413 }5414 }5415 binder_debug(BINDER_DEBUG_READ_WRITE,5416 "%d:%d wrote %lld of %lld, read return %lld of %lld\n",5417 proc->pid, thread->pid,5418 (u64)bwr.write_consumed, (u64)bwr.write_size,5419 (u64)bwr.read_consumed, (u64)bwr.read_size);5420 if (copy_to_user(ubuf, &bwr, sizeof(bwr))) {5421 ret = -EFAULT;5422 goto out;5423 }5424out:5425 return ret;5426}5427 5428static int binder_ioctl_set_ctx_mgr(struct file *filp,5429 struct flat_binder_object *fbo)5430{5431 int ret = 0;5432 struct binder_proc *proc = filp->private_data;5433 struct binder_context *context = proc->context;5434 struct binder_node *new_node;5435 kuid_t curr_euid = current_euid();5436 5437 mutex_lock(&context->context_mgr_node_lock);5438 if (context->binder_context_mgr_node) {5439 pr_err("BINDER_SET_CONTEXT_MGR already set\n");5440 ret = -EBUSY;5441 goto out;5442 }5443 ret = security_binder_set_context_mgr(proc->cred);5444 if (ret < 0)5445 goto out;5446 if (uid_valid(context->binder_context_mgr_uid)) {5447 if (!uid_eq(context->binder_context_mgr_uid, curr_euid)) {5448 pr_err("BINDER_SET_CONTEXT_MGR bad uid %d != %d\n",5449 from_kuid(&init_user_ns, curr_euid),5450 from_kuid(&init_user_ns,5451 context->binder_context_mgr_uid));5452 ret = -EPERM;5453 goto out;5454 }5455 } else {5456 context->binder_context_mgr_uid = curr_euid;5457 }5458 new_node = binder_new_node(proc, fbo);5459 if (!new_node) {5460 ret = -ENOMEM;5461 goto out;5462 }5463 binder_node_lock(new_node);5464 new_node->local_weak_refs++;5465 new_node->local_strong_refs++;5466 new_node->has_strong_ref = 1;5467 new_node->has_weak_ref = 1;5468 context->binder_context_mgr_node = new_node;5469 binder_node_unlock(new_node);5470 binder_put_node(new_node);5471out:5472 mutex_unlock(&context->context_mgr_node_lock);5473 return ret;5474}5475 5476static int binder_ioctl_get_node_info_for_ref(struct binder_proc *proc,5477 struct binder_node_info_for_ref *info)5478{5479 struct binder_node *node;5480 struct binder_context *context = proc->context;5481 __u32 handle = info->handle;5482 5483 if (info->strong_count || info->weak_count || info->reserved1 ||5484 info->reserved2 || info->reserved3) {5485 binder_user_error("%d BINDER_GET_NODE_INFO_FOR_REF: only handle may be non-zero.",5486 proc->pid);5487 return -EINVAL;5488 }5489 5490 /* This ioctl may only be used by the context manager */5491 mutex_lock(&context->context_mgr_node_lock);5492 if (!context->binder_context_mgr_node ||5493 context->binder_context_mgr_node->proc != proc) {5494 mutex_unlock(&context->context_mgr_node_lock);5495 return -EPERM;5496 }5497 mutex_unlock(&context->context_mgr_node_lock);5498 5499 node = binder_get_node_from_ref(proc, handle, true, NULL);5500 if (!node)5501 return -EINVAL;5502 5503 info->strong_count = node->local_strong_refs +5504 node->internal_strong_refs;5505 info->weak_count = node->local_weak_refs;5506 5507 binder_put_node(node);5508 5509 return 0;5510}5511 5512static int binder_ioctl_get_node_debug_info(struct binder_proc *proc,5513 struct binder_node_debug_info *info)5514{5515 struct rb_node *n;5516 binder_uintptr_t ptr = info->ptr;5517 5518 memset(info, 0, sizeof(*info));5519 5520 binder_inner_proc_lock(proc);5521 for (n = rb_first(&proc->nodes); n != NULL; n = rb_next(n)) {5522 struct binder_node *node = rb_entry(n, struct binder_node,5523 rb_node);5524 if (node->ptr > ptr) {5525 info->ptr = node->ptr;5526 info->cookie = node->cookie;5527 info->has_strong_ref = node->has_strong_ref;5528 info->has_weak_ref = node->has_weak_ref;5529 break;5530 }5531 }5532 binder_inner_proc_unlock(proc);5533 5534 return 0;5535}5536 5537static bool binder_txns_pending_ilocked(struct binder_proc *proc)5538{5539 struct rb_node *n;5540 struct binder_thread *thread;5541 5542 if (proc->outstanding_txns > 0)5543 return true;5544 5545 for (n = rb_first(&proc->threads); n; n = rb_next(n)) {5546 thread = rb_entry(n, struct binder_thread, rb_node);5547 if (thread->transaction_stack)5548 return true;5549 }5550 return false;5551}5552 5553static void binder_add_freeze_work(struct binder_proc *proc, bool is_frozen)5554{5555 struct rb_node *n;5556 struct binder_ref *ref;5557 5558 binder_inner_proc_lock(proc);5559 for (n = rb_first(&proc->nodes); n; n = rb_next(n)) {5560 struct binder_node *node;5561 5562 node = rb_entry(n, struct binder_node, rb_node);5563 binder_inner_proc_unlock(proc);5564 binder_node_lock(node);5565 hlist_for_each_entry(ref, &node->refs, node_entry) {5566 /*5567 * Need the node lock to synchronize5568 * with new notification requests and the5569 * inner lock to synchronize with queued5570 * freeze notifications.5571 */5572 binder_inner_proc_lock(ref->proc);5573 if (!ref->freeze) {5574 binder_inner_proc_unlock(ref->proc);5575 continue;5576 }5577 ref->freeze->work.type = BINDER_WORK_FROZEN_BINDER;5578 if (list_empty(&ref->freeze->work.entry)) {5579 ref->freeze->is_frozen = is_frozen;5580 binder_enqueue_work_ilocked(&ref->freeze->work, &ref->proc->todo);5581 binder_wakeup_proc_ilocked(ref->proc);5582 } else {5583 if (ref->freeze->sent && ref->freeze->is_frozen != is_frozen)5584 ref->freeze->resend = true;5585 ref->freeze->is_frozen = is_frozen;5586 }5587 binder_inner_proc_unlock(ref->proc);5588 }5589 binder_node_unlock(node);5590 binder_inner_proc_lock(proc);5591 }5592 binder_inner_proc_unlock(proc);5593}5594 5595static int binder_ioctl_freeze(struct binder_freeze_info *info,5596 struct binder_proc *target_proc)5597{5598 int ret = 0;5599 5600 if (!info->enable) {5601 binder_inner_proc_lock(target_proc);5602 target_proc->sync_recv = false;5603 target_proc->async_recv = false;5604 target_proc->is_frozen = false;5605 binder_inner_proc_unlock(target_proc);5606 binder_add_freeze_work(target_proc, false);5607 return 0;5608 }5609 5610 /*5611 * Freezing the target. Prevent new transactions by5612 * setting frozen state. If timeout specified, wait5613 * for transactions to drain.5614 */5615 binder_inner_proc_lock(target_proc);5616 target_proc->sync_recv = false;5617 target_proc->async_recv = false;5618 target_proc->is_frozen = true;5619 binder_inner_proc_unlock(target_proc);5620 5621 if (info->timeout_ms > 0)5622 ret = wait_event_interruptible_timeout(5623 target_proc->freeze_wait,5624 (!target_proc->outstanding_txns),5625 msecs_to_jiffies(info->timeout_ms));5626 5627 /* Check pending transactions that wait for reply */5628 if (ret >= 0) {5629 binder_inner_proc_lock(target_proc);5630 if (binder_txns_pending_ilocked(target_proc))5631 ret = -EAGAIN;5632 binder_inner_proc_unlock(target_proc);5633 }5634 5635 if (ret < 0) {5636 binder_inner_proc_lock(target_proc);5637 target_proc->is_frozen = false;5638 binder_inner_proc_unlock(target_proc);5639 } else {5640 binder_add_freeze_work(target_proc, true);5641 }5642 5643 return ret;5644}5645 5646static int binder_ioctl_get_freezer_info(5647 struct binder_frozen_status_info *info)5648{5649 struct binder_proc *target_proc;5650 bool found = false;5651 __u32 txns_pending;5652 5653 info->sync_recv = 0;5654 info->async_recv = 0;5655 5656 mutex_lock(&binder_procs_lock);5657 hlist_for_each_entry(target_proc, &binder_procs, proc_node) {5658 if (target_proc->pid == info->pid) {5659 found = true;5660 binder_inner_proc_lock(target_proc);5661 txns_pending = binder_txns_pending_ilocked(target_proc);5662 info->sync_recv |= target_proc->sync_recv |5663 (txns_pending << 1);5664 info->async_recv |= target_proc->async_recv;5665 binder_inner_proc_unlock(target_proc);5666 }5667 }5668 mutex_unlock(&binder_procs_lock);5669 5670 if (!found)5671 return -EINVAL;5672 5673 return 0;5674}5675 5676static int binder_ioctl_get_extended_error(struct binder_thread *thread,5677 void __user *ubuf)5678{5679 struct binder_extended_error ee;5680 5681 binder_inner_proc_lock(thread->proc);5682 ee = thread->ee;5683 binder_set_extended_error(&thread->ee, 0, BR_OK, 0);5684 binder_inner_proc_unlock(thread->proc);5685 5686 if (copy_to_user(ubuf, &ee, sizeof(ee)))5687 return -EFAULT;5688 5689 return 0;5690}5691 5692static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)5693{5694 int ret;5695 struct binder_proc *proc = filp->private_data;5696 struct binder_thread *thread;5697 void __user *ubuf = (void __user *)arg;5698 5699 /*pr_info("binder_ioctl: %d:%d %x %lx\n",5700 proc->pid, current->pid, cmd, arg);*/5701 5702 binder_selftest_alloc(&proc->alloc);5703 5704 trace_binder_ioctl(cmd, arg);5705 5706 ret = wait_event_interruptible(binder_user_error_wait, binder_stop_on_user_error < 2);5707 if (ret)5708 goto err_unlocked;5709 5710 thread = binder_get_thread(proc);5711 if (thread == NULL) {5712 ret = -ENOMEM;5713 goto err;5714 }5715 5716 switch (cmd) {5717 case BINDER_WRITE_READ:5718 ret = binder_ioctl_write_read(filp, arg, thread);5719 if (ret)5720 goto err;5721 break;5722 case BINDER_SET_MAX_THREADS: {5723 u32 max_threads;5724 5725 if (copy_from_user(&max_threads, ubuf,5726 sizeof(max_threads))) {5727 ret = -EINVAL;5728 goto err;5729 }5730 binder_inner_proc_lock(proc);5731 proc->max_threads = max_threads;5732 binder_inner_proc_unlock(proc);5733 break;5734 }5735 case BINDER_SET_CONTEXT_MGR_EXT: {5736 struct flat_binder_object fbo;5737 5738 if (copy_from_user(&fbo, ubuf, sizeof(fbo))) {5739 ret = -EINVAL;5740 goto err;5741 }5742 ret = binder_ioctl_set_ctx_mgr(filp, &fbo);5743 if (ret)5744 goto err;5745 break;5746 }5747 case BINDER_SET_CONTEXT_MGR:5748 ret = binder_ioctl_set_ctx_mgr(filp, NULL);5749 if (ret)5750 goto err;5751 break;5752 case BINDER_THREAD_EXIT:5753 binder_debug(BINDER_DEBUG_THREADS, "%d:%d exit\n",5754 proc->pid, thread->pid);5755 binder_thread_release(proc, thread);5756 thread = NULL;5757 break;5758 case BINDER_VERSION: {5759 struct binder_version __user *ver = ubuf;5760 5761 if (put_user(BINDER_CURRENT_PROTOCOL_VERSION,5762 &ver->protocol_version)) {5763 ret = -EINVAL;5764 goto err;5765 }5766 break;5767 }5768 case BINDER_GET_NODE_INFO_FOR_REF: {5769 struct binder_node_info_for_ref info;5770 5771 if (copy_from_user(&info, ubuf, sizeof(info))) {5772 ret = -EFAULT;5773 goto err;5774 }5775 5776 ret = binder_ioctl_get_node_info_for_ref(proc, &info);5777 if (ret < 0)5778 goto err;5779 5780 if (copy_to_user(ubuf, &info, sizeof(info))) {5781 ret = -EFAULT;5782 goto err;5783 }5784 5785 break;5786 }5787 case BINDER_GET_NODE_DEBUG_INFO: {5788 struct binder_node_debug_info info;5789 5790 if (copy_from_user(&info, ubuf, sizeof(info))) {5791 ret = -EFAULT;5792 goto err;5793 }5794 5795 ret = binder_ioctl_get_node_debug_info(proc, &info);5796 if (ret < 0)5797 goto err;5798 5799 if (copy_to_user(ubuf, &info, sizeof(info))) {5800 ret = -EFAULT;5801 goto err;5802 }5803 break;5804 }5805 case BINDER_FREEZE: {5806 struct binder_freeze_info info;5807 struct binder_proc **target_procs = NULL, *target_proc;5808 int target_procs_count = 0, i = 0;5809 5810 ret = 0;5811 5812 if (copy_from_user(&info, ubuf, sizeof(info))) {5813 ret = -EFAULT;5814 goto err;5815 }5816 5817 mutex_lock(&binder_procs_lock);5818 hlist_for_each_entry(target_proc, &binder_procs, proc_node) {5819 if (target_proc->pid == info.pid)5820 target_procs_count++;5821 }5822 5823 if (target_procs_count == 0) {5824 mutex_unlock(&binder_procs_lock);5825 ret = -EINVAL;5826 goto err;5827 }5828 5829 target_procs = kcalloc(target_procs_count,5830 sizeof(struct binder_proc *),5831 GFP_KERNEL);5832 5833 if (!target_procs) {5834 mutex_unlock(&binder_procs_lock);5835 ret = -ENOMEM;5836 goto err;5837 }5838 5839 hlist_for_each_entry(target_proc, &binder_procs, proc_node) {5840 if (target_proc->pid != info.pid)5841 continue;5842 5843 binder_inner_proc_lock(target_proc);5844 target_proc->tmp_ref++;5845 binder_inner_proc_unlock(target_proc);5846 5847 target_procs[i++] = target_proc;5848 }5849 mutex_unlock(&binder_procs_lock);5850 5851 for (i = 0; i < target_procs_count; i++) {5852 if (ret >= 0)5853 ret = binder_ioctl_freeze(&info,5854 target_procs[i]);5855 5856 binder_proc_dec_tmpref(target_procs[i]);5857 }5858 5859 kfree(target_procs);5860 5861 if (ret < 0)5862 goto err;5863 break;5864 }5865 case BINDER_GET_FROZEN_INFO: {5866 struct binder_frozen_status_info info;5867 5868 if (copy_from_user(&info, ubuf, sizeof(info))) {5869 ret = -EFAULT;5870 goto err;5871 }5872 5873 ret = binder_ioctl_get_freezer_info(&info);5874 if (ret < 0)5875 goto err;5876 5877 if (copy_to_user(ubuf, &info, sizeof(info))) {5878 ret = -EFAULT;5879 goto err;5880 }5881 break;5882 }5883 case BINDER_ENABLE_ONEWAY_SPAM_DETECTION: {5884 uint32_t enable;5885 5886 if (copy_from_user(&enable, ubuf, sizeof(enable))) {5887 ret = -EFAULT;5888 goto err;5889 }5890 binder_inner_proc_lock(proc);5891 proc->oneway_spam_detection_enabled = (bool)enable;5892 binder_inner_proc_unlock(proc);5893 break;5894 }5895 case BINDER_GET_EXTENDED_ERROR:5896 ret = binder_ioctl_get_extended_error(thread, ubuf);5897 if (ret < 0)5898 goto err;5899 break;5900 default:5901 ret = -EINVAL;5902 goto err;5903 }5904 ret = 0;5905err:5906 if (thread)5907 thread->looper_need_return = false;5908 wait_event_interruptible(binder_user_error_wait, binder_stop_on_user_error < 2);5909 if (ret && ret != -EINTR)5910 pr_info("%d:%d ioctl %x %lx returned %d\n", proc->pid, current->pid, cmd, arg, ret);5911err_unlocked:5912 trace_binder_ioctl_done(ret);5913 return ret;5914}5915 5916static void binder_vma_open(struct vm_area_struct *vma)5917{5918 struct binder_proc *proc = vma->vm_private_data;5919 5920 binder_debug(BINDER_DEBUG_OPEN_CLOSE,5921 "%d open vm area %lx-%lx (%ld K) vma %lx pagep %lx\n",5922 proc->pid, vma->vm_start, vma->vm_end,5923 (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags,5924 (unsigned long)pgprot_val(vma->vm_page_prot));5925}5926 5927static void binder_vma_close(struct vm_area_struct *vma)5928{5929 struct binder_proc *proc = vma->vm_private_data;5930 5931 binder_debug(BINDER_DEBUG_OPEN_CLOSE,5932 "%d close vm area %lx-%lx (%ld K) vma %lx pagep %lx\n",5933 proc->pid, vma->vm_start, vma->vm_end,5934 (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags,5935 (unsigned long)pgprot_val(vma->vm_page_prot));5936 binder_alloc_vma_close(&proc->alloc);5937}5938 5939static vm_fault_t binder_vm_fault(struct vm_fault *vmf)5940{5941 return VM_FAULT_SIGBUS;5942}5943 5944static const struct vm_operations_struct binder_vm_ops = {5945 .open = binder_vma_open,5946 .close = binder_vma_close,5947 .fault = binder_vm_fault,5948};5949 5950static int binder_mmap(struct file *filp, struct vm_area_struct *vma)5951{5952 struct binder_proc *proc = filp->private_data;5953 5954 if (proc->tsk != current->group_leader)5955 return -EINVAL;5956 5957 binder_debug(BINDER_DEBUG_OPEN_CLOSE,5958 "%s: %d %lx-%lx (%ld K) vma %lx pagep %lx\n",5959 __func__, proc->pid, vma->vm_start, vma->vm_end,5960 (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags,5961 (unsigned long)pgprot_val(vma->vm_page_prot));5962 5963 if (vma->vm_flags & FORBIDDEN_MMAP_FLAGS) {5964 pr_err("%s: %d %lx-%lx %s failed %d\n", __func__,5965 proc->pid, vma->vm_start, vma->vm_end, "bad vm_flags", -EPERM);5966 return -EPERM;5967 }5968 vm_flags_mod(vma, VM_DONTCOPY | VM_MIXEDMAP, VM_MAYWRITE);5969 5970 vma->vm_ops = &binder_vm_ops;5971 vma->vm_private_data = proc;5972 5973 return binder_alloc_mmap_handler(&proc->alloc, vma);5974}5975 5976static int binder_open(struct inode *nodp, struct file *filp)5977{5978 struct binder_proc *proc, *itr;5979 struct binder_device *binder_dev;5980 struct binderfs_info *info;5981 struct dentry *binder_binderfs_dir_entry_proc = NULL;5982 bool existing_pid = false;5983 5984 binder_debug(BINDER_DEBUG_OPEN_CLOSE, "%s: %d:%d\n", __func__,5985 current->group_leader->pid, current->pid);5986 5987 proc = kzalloc(sizeof(*proc), GFP_KERNEL);5988 if (proc == NULL)5989 return -ENOMEM;5990 5991 dbitmap_init(&proc->dmap);5992 spin_lock_init(&proc->inner_lock);5993 spin_lock_init(&proc->outer_lock);5994 get_task_struct(current->group_leader);5995 proc->tsk = current->group_leader;5996 proc->cred = get_cred(filp->f_cred);5997 INIT_LIST_HEAD(&proc->todo);5998 init_waitqueue_head(&proc->freeze_wait);5999 proc->default_priority = task_nice(current);6000 /* binderfs stashes devices in i_private */6001 if (is_binderfs_device(nodp)) {6002 binder_dev = nodp->i_private;6003 info = nodp->i_sb->s_fs_info;6004 binder_binderfs_dir_entry_proc = info->proc_log_dir;6005 } else {6006 binder_dev = container_of(filp->private_data,6007 struct binder_device, miscdev);6008 }6009 refcount_inc(&binder_dev->ref);6010 proc->context = &binder_dev->context;6011 binder_alloc_init(&proc->alloc);6012 6013 binder_stats_created(BINDER_STAT_PROC);6014 proc->pid = current->group_leader->pid;6015 INIT_LIST_HEAD(&proc->delivered_death);6016 INIT_LIST_HEAD(&proc->delivered_freeze);6017 INIT_LIST_HEAD(&proc->waiting_threads);6018 filp->private_data = proc;6019 6020 mutex_lock(&binder_procs_lock);6021 hlist_for_each_entry(itr, &binder_procs, proc_node) {6022 if (itr->pid == proc->pid) {6023 existing_pid = true;6024 break;6025 }6026 }6027 hlist_add_head(&proc->proc_node, &binder_procs);6028 mutex_unlock(&binder_procs_lock);6029 6030 if (binder_debugfs_dir_entry_proc && !existing_pid) {6031 char strbuf[11];6032 6033 snprintf(strbuf, sizeof(strbuf), "%u", proc->pid);6034 /*6035 * proc debug entries are shared between contexts.6036 * Only create for the first PID to avoid debugfs log spamming6037 * The printing code will anyway print all contexts for a given6038 * PID so this is not a problem.6039 */6040 proc->debugfs_entry = debugfs_create_file(strbuf, 0444,6041 binder_debugfs_dir_entry_proc,6042 (void *)(unsigned long)proc->pid,6043 &proc_fops);6044 }6045 6046 if (binder_binderfs_dir_entry_proc && !existing_pid) {6047 char strbuf[11];6048 struct dentry *binderfs_entry;6049 6050 snprintf(strbuf, sizeof(strbuf), "%u", proc->pid);6051 /*6052 * Similar to debugfs, the process specific log file is shared6053 * between contexts. Only create for the first PID.6054 * This is ok since same as debugfs, the log file will contain6055 * information on all contexts of a given PID.6056 */6057 binderfs_entry = binderfs_create_file(binder_binderfs_dir_entry_proc,6058 strbuf, &proc_fops, (void *)(unsigned long)proc->pid);6059 if (!IS_ERR(binderfs_entry)) {6060 proc->binderfs_entry = binderfs_entry;6061 } else {6062 int error;6063 6064 error = PTR_ERR(binderfs_entry);6065 pr_warn("Unable to create file %s in binderfs (error %d)\n",6066 strbuf, error);6067 }6068 }6069 6070 return 0;6071}6072 6073static int binder_flush(struct file *filp, fl_owner_t id)6074{6075 struct binder_proc *proc = filp->private_data;6076 6077 binder_defer_work(proc, BINDER_DEFERRED_FLUSH);6078 6079 return 0;6080}6081 6082static void binder_deferred_flush(struct binder_proc *proc)6083{6084 struct rb_node *n;6085 int wake_count = 0;6086 6087 binder_inner_proc_lock(proc);6088 for (n = rb_first(&proc->threads); n != NULL; n = rb_next(n)) {6089 struct binder_thread *thread = rb_entry(n, struct binder_thread, rb_node);6090 6091 thread->looper_need_return = true;6092 if (thread->looper & BINDER_LOOPER_STATE_WAITING) {6093 wake_up_interruptible(&thread->wait);6094 wake_count++;6095 }6096 }6097 binder_inner_proc_unlock(proc);6098 6099 binder_debug(BINDER_DEBUG_OPEN_CLOSE,6100 "binder_flush: %d woke %d threads\n", proc->pid,6101 wake_count);6102}6103 6104static int binder_release(struct inode *nodp, struct file *filp)6105{6106 struct binder_proc *proc = filp->private_data;6107 6108 debugfs_remove(proc->debugfs_entry);6109 6110 if (proc->binderfs_entry) {6111 binderfs_remove_file(proc->binderfs_entry);6112 proc->binderfs_entry = NULL;6113 }6114 6115 binder_defer_work(proc, BINDER_DEFERRED_RELEASE);6116 6117 return 0;6118}6119 6120static int binder_node_release(struct binder_node *node, int refs)6121{6122 struct binder_ref *ref;6123 int death = 0;6124 struct binder_proc *proc = node->proc;6125 6126 binder_release_work(proc, &node->async_todo);6127 6128 binder_node_lock(node);6129 binder_inner_proc_lock(proc);6130 binder_dequeue_work_ilocked(&node->work);6131 /*6132 * The caller must have taken a temporary ref on the node,6133 */6134 BUG_ON(!node->tmp_refs);6135 if (hlist_empty(&node->refs) && node->tmp_refs == 1) {6136 binder_inner_proc_unlock(proc);6137 binder_node_unlock(node);6138 binder_free_node(node);6139 6140 return refs;6141 }6142 6143 node->proc = NULL;6144 node->local_strong_refs = 0;6145 node->local_weak_refs = 0;6146 binder_inner_proc_unlock(proc);6147 6148 spin_lock(&binder_dead_nodes_lock);6149 hlist_add_head(&node->dead_node, &binder_dead_nodes);6150 spin_unlock(&binder_dead_nodes_lock);6151 6152 hlist_for_each_entry(ref, &node->refs, node_entry) {6153 refs++;6154 /*6155 * Need the node lock to synchronize6156 * with new notification requests and the6157 * inner lock to synchronize with queued6158 * death notifications.6159 */6160 binder_inner_proc_lock(ref->proc);6161 if (!ref->death) {6162 binder_inner_proc_unlock(ref->proc);6163 continue;6164 }6165 6166 death++;6167 6168 BUG_ON(!list_empty(&ref->death->work.entry));6169 ref->death->work.type = BINDER_WORK_DEAD_BINDER;6170 binder_enqueue_work_ilocked(&ref->death->work,6171 &ref->proc->todo);6172 binder_wakeup_proc_ilocked(ref->proc);6173 binder_inner_proc_unlock(ref->proc);6174 }6175 6176 binder_debug(BINDER_DEBUG_DEAD_BINDER,6177 "node %d now dead, refs %d, death %d\n",6178 node->debug_id, refs, death);6179 binder_node_unlock(node);6180 binder_put_node(node);6181 6182 return refs;6183}6184 6185static void binder_deferred_release(struct binder_proc *proc)6186{6187 struct binder_context *context = proc->context;6188 struct rb_node *n;6189 int threads, nodes, incoming_refs, outgoing_refs, active_transactions;6190 6191 mutex_lock(&binder_procs_lock);6192 hlist_del(&proc->proc_node);6193 mutex_unlock(&binder_procs_lock);6194 6195 mutex_lock(&context->context_mgr_node_lock);6196 if (context->binder_context_mgr_node &&6197 context->binder_context_mgr_node->proc == proc) {6198 binder_debug(BINDER_DEBUG_DEAD_BINDER,6199 "%s: %d context_mgr_node gone\n",6200 __func__, proc->pid);6201 context->binder_context_mgr_node = NULL;6202 }6203 mutex_unlock(&context->context_mgr_node_lock);6204 binder_inner_proc_lock(proc);6205 /*6206 * Make sure proc stays alive after we6207 * remove all the threads6208 */6209 proc->tmp_ref++;6210 6211 proc->is_dead = true;6212 proc->is_frozen = false;6213 proc->sync_recv = false;6214 proc->async_recv = false;6215 threads = 0;6216 active_transactions = 0;6217 while ((n = rb_first(&proc->threads))) {6218 struct binder_thread *thread;6219 6220 thread = rb_entry(n, struct binder_thread, rb_node);6221 binder_inner_proc_unlock(proc);6222 threads++;6223 active_transactions += binder_thread_release(proc, thread);6224 binder_inner_proc_lock(proc);6225 }6226 6227 nodes = 0;6228 incoming_refs = 0;6229 while ((n = rb_first(&proc->nodes))) {6230 struct binder_node *node;6231 6232 node = rb_entry(n, struct binder_node, rb_node);6233 nodes++;6234 /*6235 * take a temporary ref on the node before6236 * calling binder_node_release() which will either6237 * kfree() the node or call binder_put_node()6238 */6239 binder_inc_node_tmpref_ilocked(node);6240 rb_erase(&node->rb_node, &proc->nodes);6241 binder_inner_proc_unlock(proc);6242 incoming_refs = binder_node_release(node, incoming_refs);6243 binder_inner_proc_lock(proc);6244 }6245 binder_inner_proc_unlock(proc);6246 6247 outgoing_refs = 0;6248 binder_proc_lock(proc);6249 while ((n = rb_first(&proc->refs_by_desc))) {6250 struct binder_ref *ref;6251 6252 ref = rb_entry(n, struct binder_ref, rb_node_desc);6253 outgoing_refs++;6254 binder_cleanup_ref_olocked(ref);6255 binder_proc_unlock(proc);6256 binder_free_ref(ref);6257 binder_proc_lock(proc);6258 }6259 binder_proc_unlock(proc);6260 6261 binder_release_work(proc, &proc->todo);6262 binder_release_work(proc, &proc->delivered_death);6263 6264 binder_debug(BINDER_DEBUG_OPEN_CLOSE,6265 "%s: %d threads %d, nodes %d (ref %d), refs %d, active transactions %d\n",6266 __func__, proc->pid, threads, nodes, incoming_refs,6267 outgoing_refs, active_transactions);6268 6269 binder_proc_dec_tmpref(proc);6270}6271 6272static void binder_deferred_func(struct work_struct *work)6273{6274 struct binder_proc *proc;6275 6276 int defer;6277 6278 do {6279 mutex_lock(&binder_deferred_lock);6280 if (!hlist_empty(&binder_deferred_list)) {6281 proc = hlist_entry(binder_deferred_list.first,6282 struct binder_proc, deferred_work_node);6283 hlist_del_init(&proc->deferred_work_node);6284 defer = proc->deferred_work;6285 proc->deferred_work = 0;6286 } else {6287 proc = NULL;6288 defer = 0;6289 }6290 mutex_unlock(&binder_deferred_lock);6291 6292 if (defer & BINDER_DEFERRED_FLUSH)6293 binder_deferred_flush(proc);6294 6295 if (defer & BINDER_DEFERRED_RELEASE)6296 binder_deferred_release(proc); /* frees proc */6297 } while (proc);6298}6299static DECLARE_WORK(binder_deferred_work, binder_deferred_func);6300 6301static void6302binder_defer_work(struct binder_proc *proc, enum binder_deferred_state defer)6303{6304 mutex_lock(&binder_deferred_lock);6305 proc->deferred_work |= defer;6306 if (hlist_unhashed(&proc->deferred_work_node)) {6307 hlist_add_head(&proc->deferred_work_node,6308 &binder_deferred_list);6309 schedule_work(&binder_deferred_work);6310 }6311 mutex_unlock(&binder_deferred_lock);6312}6313 6314static void print_binder_transaction_ilocked(struct seq_file *m,6315 struct binder_proc *proc,6316 const char *prefix,6317 struct binder_transaction *t)6318{6319 struct binder_proc *to_proc;6320 struct binder_buffer *buffer = t->buffer;6321 ktime_t current_time = ktime_get();6322 6323 spin_lock(&t->lock);6324 to_proc = t->to_proc;6325 seq_printf(m,6326 "%s %d: %pK from %d:%d to %d:%d code %x flags %x pri %ld r%d elapsed %lldms",6327 prefix, t->debug_id, t,6328 t->from_pid,6329 t->from_tid,6330 to_proc ? to_proc->pid : 0,6331 t->to_thread ? t->to_thread->pid : 0,6332 t->code, t->flags, t->priority, t->need_reply,6333 ktime_ms_delta(current_time, t->start_time));6334 spin_unlock(&t->lock);6335 6336 if (proc != to_proc) {6337 /*6338 * Can only safely deref buffer if we are holding the6339 * correct proc inner lock for this node6340 */6341 seq_puts(m, "\n");6342 return;6343 }6344 6345 if (buffer == NULL) {6346 seq_puts(m, " buffer free\n");6347 return;6348 }6349 if (buffer->target_node)6350 seq_printf(m, " node %d", buffer->target_node->debug_id);6351 seq_printf(m, " size %zd:%zd offset %lx\n",6352 buffer->data_size, buffer->offsets_size,6353 proc->alloc.buffer - buffer->user_data);6354}6355 6356static void print_binder_work_ilocked(struct seq_file *m,6357 struct binder_proc *proc,6358 const char *prefix,6359 const char *transaction_prefix,6360 struct binder_work *w)6361{6362 struct binder_node *node;6363 struct binder_transaction *t;6364 6365 switch (w->type) {6366 case BINDER_WORK_TRANSACTION:6367 t = container_of(w, struct binder_transaction, work);6368 print_binder_transaction_ilocked(6369 m, proc, transaction_prefix, t);6370 break;6371 case BINDER_WORK_RETURN_ERROR: {6372 struct binder_error *e = container_of(6373 w, struct binder_error, work);6374 6375 seq_printf(m, "%stransaction error: %u\n",6376 prefix, e->cmd);6377 } break;6378 case BINDER_WORK_TRANSACTION_COMPLETE:6379 seq_printf(m, "%stransaction complete\n", prefix);6380 break;6381 case BINDER_WORK_NODE:6382 node = container_of(w, struct binder_node, work);6383 seq_printf(m, "%snode work %d: u%016llx c%016llx\n",6384 prefix, node->debug_id,6385 (u64)node->ptr, (u64)node->cookie);6386 break;6387 case BINDER_WORK_DEAD_BINDER:6388 seq_printf(m, "%shas dead binder\n", prefix);6389 break;6390 case BINDER_WORK_DEAD_BINDER_AND_CLEAR:6391 seq_printf(m, "%shas cleared dead binder\n", prefix);6392 break;6393 case BINDER_WORK_CLEAR_DEATH_NOTIFICATION:6394 seq_printf(m, "%shas cleared death notification\n", prefix);6395 break;6396 default:6397 seq_printf(m, "%sunknown work: type %d\n", prefix, w->type);6398 break;6399 }6400}6401 6402static void print_binder_thread_ilocked(struct seq_file *m,6403 struct binder_thread *thread,6404 int print_always)6405{6406 struct binder_transaction *t;6407 struct binder_work *w;6408 size_t start_pos = m->count;6409 size_t header_pos;6410 6411 seq_printf(m, " thread %d: l %02x need_return %d tr %d\n",6412 thread->pid, thread->looper,6413 thread->looper_need_return,6414 atomic_read(&thread->tmp_ref));6415 header_pos = m->count;6416 t = thread->transaction_stack;6417 while (t) {6418 if (t->from == thread) {6419 print_binder_transaction_ilocked(m, thread->proc,6420 " outgoing transaction", t);6421 t = t->from_parent;6422 } else if (t->to_thread == thread) {6423 print_binder_transaction_ilocked(m, thread->proc,6424 " incoming transaction", t);6425 t = t->to_parent;6426 } else {6427 print_binder_transaction_ilocked(m, thread->proc,6428 " bad transaction", t);6429 t = NULL;6430 }6431 }6432 list_for_each_entry(w, &thread->todo, entry) {6433 print_binder_work_ilocked(m, thread->proc, " ",6434 " pending transaction", w);6435 }6436 if (!print_always && m->count == header_pos)6437 m->count = start_pos;6438}6439 6440static void print_binder_node_nilocked(struct seq_file *m,6441 struct binder_node *node)6442{6443 struct binder_ref *ref;6444 struct binder_work *w;6445 int count;6446 6447 count = hlist_count_nodes(&node->refs);6448 6449 seq_printf(m, " node %d: u%016llx c%016llx hs %d hw %d ls %d lw %d is %d iw %d tr %d",6450 node->debug_id, (u64)node->ptr, (u64)node->cookie,6451 node->has_strong_ref, node->has_weak_ref,6452 node->local_strong_refs, node->local_weak_refs,6453 node->internal_strong_refs, count, node->tmp_refs);6454 if (count) {6455 seq_puts(m, " proc");6456 hlist_for_each_entry(ref, &node->refs, node_entry)6457 seq_printf(m, " %d", ref->proc->pid);6458 }6459 seq_puts(m, "\n");6460 if (node->proc) {6461 list_for_each_entry(w, &node->async_todo, entry)6462 print_binder_work_ilocked(m, node->proc, " ",6463 " pending async transaction", w);6464 }6465}6466 6467static void print_binder_ref_olocked(struct seq_file *m,6468 struct binder_ref *ref)6469{6470 binder_node_lock(ref->node);6471 seq_printf(m, " ref %d: desc %d %snode %d s %d w %d d %pK\n",6472 ref->data.debug_id, ref->data.desc,6473 ref->node->proc ? "" : "dead ",6474 ref->node->debug_id, ref->data.strong,6475 ref->data.weak, ref->death);6476 binder_node_unlock(ref->node);6477}6478 6479static void print_binder_proc(struct seq_file *m,6480 struct binder_proc *proc, int print_all)6481{6482 struct binder_work *w;6483 struct rb_node *n;6484 size_t start_pos = m->count;6485 size_t header_pos;6486 struct binder_node *last_node = NULL;6487 6488 seq_printf(m, "proc %d\n", proc->pid);6489 seq_printf(m, "context %s\n", proc->context->name);6490 header_pos = m->count;6491 6492 binder_inner_proc_lock(proc);6493 for (n = rb_first(&proc->threads); n != NULL; n = rb_next(n))6494 print_binder_thread_ilocked(m, rb_entry(n, struct binder_thread,6495 rb_node), print_all);6496 6497 for (n = rb_first(&proc->nodes); n != NULL; n = rb_next(n)) {6498 struct binder_node *node = rb_entry(n, struct binder_node,6499 rb_node);6500 if (!print_all && !node->has_async_transaction)6501 continue;6502 6503 /*6504 * take a temporary reference on the node so it6505 * survives and isn't removed from the tree6506 * while we print it.6507 */6508 binder_inc_node_tmpref_ilocked(node);6509 /* Need to drop inner lock to take node lock */6510 binder_inner_proc_unlock(proc);6511 if (last_node)6512 binder_put_node(last_node);6513 binder_node_inner_lock(node);6514 print_binder_node_nilocked(m, node);6515 binder_node_inner_unlock(node);6516 last_node = node;6517 binder_inner_proc_lock(proc);6518 }6519 binder_inner_proc_unlock(proc);6520 if (last_node)6521 binder_put_node(last_node);6522 6523 if (print_all) {6524 binder_proc_lock(proc);6525 for (n = rb_first(&proc->refs_by_desc);6526 n != NULL;6527 n = rb_next(n))6528 print_binder_ref_olocked(m, rb_entry(n,6529 struct binder_ref,6530 rb_node_desc));6531 binder_proc_unlock(proc);6532 }6533 binder_alloc_print_allocated(m, &proc->alloc);6534 binder_inner_proc_lock(proc);6535 list_for_each_entry(w, &proc->todo, entry)6536 print_binder_work_ilocked(m, proc, " ",6537 " pending transaction", w);6538 list_for_each_entry(w, &proc->delivered_death, entry) {6539 seq_puts(m, " has delivered dead binder\n");6540 break;6541 }6542 binder_inner_proc_unlock(proc);6543 if (!print_all && m->count == header_pos)6544 m->count = start_pos;6545}6546 6547static const char * const binder_return_strings[] = {6548 "BR_ERROR",6549 "BR_OK",6550 "BR_TRANSACTION",6551 "BR_REPLY",6552 "BR_ACQUIRE_RESULT",6553 "BR_DEAD_REPLY",6554 "BR_TRANSACTION_COMPLETE",6555 "BR_INCREFS",6556 "BR_ACQUIRE",6557 "BR_RELEASE",6558 "BR_DECREFS",6559 "BR_ATTEMPT_ACQUIRE",6560 "BR_NOOP",6561 "BR_SPAWN_LOOPER",6562 "BR_FINISHED",6563 "BR_DEAD_BINDER",6564 "BR_CLEAR_DEATH_NOTIFICATION_DONE",6565 "BR_FAILED_REPLY",6566 "BR_FROZEN_REPLY",6567 "BR_ONEWAY_SPAM_SUSPECT",6568 "BR_TRANSACTION_PENDING_FROZEN",6569 "BR_FROZEN_BINDER",6570 "BR_CLEAR_FREEZE_NOTIFICATION_DONE",6571};6572 6573static const char * const binder_command_strings[] = {6574 "BC_TRANSACTION",6575 "BC_REPLY",6576 "BC_ACQUIRE_RESULT",6577 "BC_FREE_BUFFER",6578 "BC_INCREFS",6579 "BC_ACQUIRE",6580 "BC_RELEASE",6581 "BC_DECREFS",6582 "BC_INCREFS_DONE",6583 "BC_ACQUIRE_DONE",6584 "BC_ATTEMPT_ACQUIRE",6585 "BC_REGISTER_LOOPER",6586 "BC_ENTER_LOOPER",6587 "BC_EXIT_LOOPER",6588 "BC_REQUEST_DEATH_NOTIFICATION",6589 "BC_CLEAR_DEATH_NOTIFICATION",6590 "BC_DEAD_BINDER_DONE",6591 "BC_TRANSACTION_SG",6592 "BC_REPLY_SG",6593 "BC_REQUEST_FREEZE_NOTIFICATION",6594 "BC_CLEAR_FREEZE_NOTIFICATION",6595 "BC_FREEZE_NOTIFICATION_DONE",6596};6597 6598static const char * const binder_objstat_strings[] = {6599 "proc",6600 "thread",6601 "node",6602 "ref",6603 "death",6604 "transaction",6605 "transaction_complete",6606 "freeze",6607};6608 6609static void print_binder_stats(struct seq_file *m, const char *prefix,6610 struct binder_stats *stats)6611{6612 int i;6613 6614 BUILD_BUG_ON(ARRAY_SIZE(stats->bc) !=6615 ARRAY_SIZE(binder_command_strings));6616 for (i = 0; i < ARRAY_SIZE(stats->bc); i++) {6617 int temp = atomic_read(&stats->bc[i]);6618 6619 if (temp)6620 seq_printf(m, "%s%s: %d\n", prefix,6621 binder_command_strings[i], temp);6622 }6623 6624 BUILD_BUG_ON(ARRAY_SIZE(stats->br) !=6625 ARRAY_SIZE(binder_return_strings));6626 for (i = 0; i < ARRAY_SIZE(stats->br); i++) {6627 int temp = atomic_read(&stats->br[i]);6628 6629 if (temp)6630 seq_printf(m, "%s%s: %d\n", prefix,6631 binder_return_strings[i], temp);6632 }6633 6634 BUILD_BUG_ON(ARRAY_SIZE(stats->obj_created) !=6635 ARRAY_SIZE(binder_objstat_strings));6636 BUILD_BUG_ON(ARRAY_SIZE(stats->obj_created) !=6637 ARRAY_SIZE(stats->obj_deleted));6638 for (i = 0; i < ARRAY_SIZE(stats->obj_created); i++) {6639 int created = atomic_read(&stats->obj_created[i]);6640 int deleted = atomic_read(&stats->obj_deleted[i]);6641 6642 if (created || deleted)6643 seq_printf(m, "%s%s: active %d total %d\n",6644 prefix,6645 binder_objstat_strings[i],6646 created - deleted,6647 created);6648 }6649}6650 6651static void print_binder_proc_stats(struct seq_file *m,6652 struct binder_proc *proc)6653{6654 struct binder_work *w;6655 struct binder_thread *thread;6656 struct rb_node *n;6657 int count, strong, weak, ready_threads;6658 size_t free_async_space =6659 binder_alloc_get_free_async_space(&proc->alloc);6660 6661 seq_printf(m, "proc %d\n", proc->pid);6662 seq_printf(m, "context %s\n", proc->context->name);6663 count = 0;6664 ready_threads = 0;6665 binder_inner_proc_lock(proc);6666 for (n = rb_first(&proc->threads); n != NULL; n = rb_next(n))6667 count++;6668 6669 list_for_each_entry(thread, &proc->waiting_threads, waiting_thread_node)6670 ready_threads++;6671 6672 seq_printf(m, " threads: %d\n", count);6673 seq_printf(m, " requested threads: %d+%d/%d\n"6674 " ready threads %d\n"6675 " free async space %zd\n", proc->requested_threads,6676 proc->requested_threads_started, proc->max_threads,6677 ready_threads,6678 free_async_space);6679 count = 0;6680 for (n = rb_first(&proc->nodes); n != NULL; n = rb_next(n))6681 count++;6682 binder_inner_proc_unlock(proc);6683 seq_printf(m, " nodes: %d\n", count);6684 count = 0;6685 strong = 0;6686 weak = 0;6687 binder_proc_lock(proc);6688 for (n = rb_first(&proc->refs_by_desc); n != NULL; n = rb_next(n)) {6689 struct binder_ref *ref = rb_entry(n, struct binder_ref,6690 rb_node_desc);6691 count++;6692 strong += ref->data.strong;6693 weak += ref->data.weak;6694 }6695 binder_proc_unlock(proc);6696 seq_printf(m, " refs: %d s %d w %d\n", count, strong, weak);6697 6698 count = binder_alloc_get_allocated_count(&proc->alloc);6699 seq_printf(m, " buffers: %d\n", count);6700 6701 binder_alloc_print_pages(m, &proc->alloc);6702 6703 count = 0;6704 binder_inner_proc_lock(proc);6705 list_for_each_entry(w, &proc->todo, entry) {6706 if (w->type == BINDER_WORK_TRANSACTION)6707 count++;6708 }6709 binder_inner_proc_unlock(proc);6710 seq_printf(m, " pending transactions: %d\n", count);6711 6712 print_binder_stats(m, " ", &proc->stats);6713}6714 6715static int state_show(struct seq_file *m, void *unused)6716{6717 struct binder_proc *proc;6718 struct binder_node *node;6719 struct binder_node *last_node = NULL;6720 6721 seq_puts(m, "binder state:\n");6722 6723 spin_lock(&binder_dead_nodes_lock);6724 if (!hlist_empty(&binder_dead_nodes))6725 seq_puts(m, "dead nodes:\n");6726 hlist_for_each_entry(node, &binder_dead_nodes, dead_node) {6727 /*6728 * take a temporary reference on the node so it6729 * survives and isn't removed from the list6730 * while we print it.6731 */6732 node->tmp_refs++;6733 spin_unlock(&binder_dead_nodes_lock);6734 if (last_node)6735 binder_put_node(last_node);6736 binder_node_lock(node);6737 print_binder_node_nilocked(m, node);6738 binder_node_unlock(node);6739 last_node = node;6740 spin_lock(&binder_dead_nodes_lock);6741 }6742 spin_unlock(&binder_dead_nodes_lock);6743 if (last_node)6744 binder_put_node(last_node);6745 6746 mutex_lock(&binder_procs_lock);6747 hlist_for_each_entry(proc, &binder_procs, proc_node)6748 print_binder_proc(m, proc, 1);6749 mutex_unlock(&binder_procs_lock);6750 6751 return 0;6752}6753 6754static int stats_show(struct seq_file *m, void *unused)6755{6756 struct binder_proc *proc;6757 6758 seq_puts(m, "binder stats:\n");6759 6760 print_binder_stats(m, "", &binder_stats);6761 6762 mutex_lock(&binder_procs_lock);6763 hlist_for_each_entry(proc, &binder_procs, proc_node)6764 print_binder_proc_stats(m, proc);6765 mutex_unlock(&binder_procs_lock);6766 6767 return 0;6768}6769 6770static int transactions_show(struct seq_file *m, void *unused)6771{6772 struct binder_proc *proc;6773 6774 seq_puts(m, "binder transactions:\n");6775 mutex_lock(&binder_procs_lock);6776 hlist_for_each_entry(proc, &binder_procs, proc_node)6777 print_binder_proc(m, proc, 0);6778 mutex_unlock(&binder_procs_lock);6779 6780 return 0;6781}6782 6783static int proc_show(struct seq_file *m, void *unused)6784{6785 struct binder_proc *itr;6786 int pid = (unsigned long)m->private;6787 6788 mutex_lock(&binder_procs_lock);6789 hlist_for_each_entry(itr, &binder_procs, proc_node) {6790 if (itr->pid == pid) {6791 seq_puts(m, "binder proc state:\n");6792 print_binder_proc(m, itr, 1);6793 }6794 }6795 mutex_unlock(&binder_procs_lock);6796 6797 return 0;6798}6799 6800static void print_binder_transaction_log_entry(struct seq_file *m,6801 struct binder_transaction_log_entry *e)6802{6803 int debug_id = READ_ONCE(e->debug_id_done);6804 /*6805 * read barrier to guarantee debug_id_done read before6806 * we print the log values6807 */6808 smp_rmb();6809 seq_printf(m,6810 "%d: %s from %d:%d to %d:%d context %s node %d handle %d size %d:%d ret %d/%d l=%d",6811 e->debug_id, (e->call_type == 2) ? "reply" :6812 ((e->call_type == 1) ? "async" : "call "), e->from_proc,6813 e->from_thread, e->to_proc, e->to_thread, e->context_name,6814 e->to_node, e->target_handle, e->data_size, e->offsets_size,6815 e->return_error, e->return_error_param,6816 e->return_error_line);6817 /*6818 * read-barrier to guarantee read of debug_id_done after6819 * done printing the fields of the entry6820 */6821 smp_rmb();6822 seq_printf(m, debug_id && debug_id == READ_ONCE(e->debug_id_done) ?6823 "\n" : " (incomplete)\n");6824}6825 6826static int transaction_log_show(struct seq_file *m, void *unused)6827{6828 struct binder_transaction_log *log = m->private;6829 unsigned int log_cur = atomic_read(&log->cur);6830 unsigned int count;6831 unsigned int cur;6832 int i;6833 6834 count = log_cur + 1;6835 cur = count < ARRAY_SIZE(log->entry) && !log->full ?6836 0 : count % ARRAY_SIZE(log->entry);6837 if (count > ARRAY_SIZE(log->entry) || log->full)6838 count = ARRAY_SIZE(log->entry);6839 for (i = 0; i < count; i++) {6840 unsigned int index = cur++ % ARRAY_SIZE(log->entry);6841 6842 print_binder_transaction_log_entry(m, &log->entry[index]);6843 }6844 return 0;6845}6846 6847const struct file_operations binder_fops = {6848 .owner = THIS_MODULE,6849 .poll = binder_poll,6850 .unlocked_ioctl = binder_ioctl,6851 .compat_ioctl = compat_ptr_ioctl,6852 .mmap = binder_mmap,6853 .open = binder_open,6854 .flush = binder_flush,6855 .release = binder_release,6856};6857 6858DEFINE_SHOW_ATTRIBUTE(state);6859DEFINE_SHOW_ATTRIBUTE(stats);6860DEFINE_SHOW_ATTRIBUTE(transactions);6861DEFINE_SHOW_ATTRIBUTE(transaction_log);6862 6863const struct binder_debugfs_entry binder_debugfs_entries[] = {6864 {6865 .name = "state",6866 .mode = 0444,6867 .fops = &state_fops,6868 .data = NULL,6869 },6870 {6871 .name = "stats",6872 .mode = 0444,6873 .fops = &stats_fops,6874 .data = NULL,6875 },6876 {6877 .name = "transactions",6878 .mode = 0444,6879 .fops = &transactions_fops,6880 .data = NULL,6881 },6882 {6883 .name = "transaction_log",6884 .mode = 0444,6885 .fops = &transaction_log_fops,6886 .data = &binder_transaction_log,6887 },6888 {6889 .name = "failed_transaction_log",6890 .mode = 0444,6891 .fops = &transaction_log_fops,6892 .data = &binder_transaction_log_failed,6893 },6894 {} /* terminator */6895};6896 6897static int __init init_binder_device(const char *name)6898{6899 int ret;6900 struct binder_device *binder_device;6901 6902 binder_device = kzalloc(sizeof(*binder_device), GFP_KERNEL);6903 if (!binder_device)6904 return -ENOMEM;6905 6906 binder_device->miscdev.fops = &binder_fops;6907 binder_device->miscdev.minor = MISC_DYNAMIC_MINOR;6908 binder_device->miscdev.name = name;6909 6910 refcount_set(&binder_device->ref, 1);6911 binder_device->context.binder_context_mgr_uid = INVALID_UID;6912 binder_device->context.name = name;6913 mutex_init(&binder_device->context.context_mgr_node_lock);6914 6915 ret = misc_register(&binder_device->miscdev);6916 if (ret < 0) {6917 kfree(binder_device);6918 return ret;6919 }6920 6921 hlist_add_head(&binder_device->hlist, &binder_devices);6922 6923 return ret;6924}6925 6926static int __init binder_init(void)6927{6928 int ret;6929 char *device_name, *device_tmp;6930 struct binder_device *device;6931 struct hlist_node *tmp;6932 char *device_names = NULL;6933 const struct binder_debugfs_entry *db_entry;6934 6935 ret = binder_alloc_shrinker_init();6936 if (ret)6937 return ret;6938 6939 atomic_set(&binder_transaction_log.cur, ~0U);6940 atomic_set(&binder_transaction_log_failed.cur, ~0U);6941 6942 binder_debugfs_dir_entry_root = debugfs_create_dir("binder", NULL);6943 6944 binder_for_each_debugfs_entry(db_entry)6945 debugfs_create_file(db_entry->name,6946 db_entry->mode,6947 binder_debugfs_dir_entry_root,6948 db_entry->data,6949 db_entry->fops);6950 6951 binder_debugfs_dir_entry_proc = debugfs_create_dir("proc",6952 binder_debugfs_dir_entry_root);6953 6954 if (!IS_ENABLED(CONFIG_ANDROID_BINDERFS) &&6955 strcmp(binder_devices_param, "") != 0) {6956 /*6957 * Copy the module_parameter string, because we don't want to6958 * tokenize it in-place.6959 */6960 device_names = kstrdup(binder_devices_param, GFP_KERNEL);6961 if (!device_names) {6962 ret = -ENOMEM;6963 goto err_alloc_device_names_failed;6964 }6965 6966 device_tmp = device_names;6967 while ((device_name = strsep(&device_tmp, ","))) {6968 ret = init_binder_device(device_name);6969 if (ret)6970 goto err_init_binder_device_failed;6971 }6972 }6973 6974 ret = init_binderfs();6975 if (ret)6976 goto err_init_binder_device_failed;6977 6978 return ret;6979 6980err_init_binder_device_failed:6981 hlist_for_each_entry_safe(device, tmp, &binder_devices, hlist) {6982 misc_deregister(&device->miscdev);6983 hlist_del(&device->hlist);6984 kfree(device);6985 }6986 6987 kfree(device_names);6988 6989err_alloc_device_names_failed:6990 debugfs_remove_recursive(binder_debugfs_dir_entry_root);6991 binder_alloc_shrinker_exit();6992 6993 return ret;6994}6995 6996device_initcall(binder_init);6997 6998#define CREATE_TRACE_POINTS6999#include "binder_trace.h"7000 7001MODULE_LICENSE("GPL v2");7002