tracehook.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. /*
  2. * Tracing hooks
  3. *
  4. * Copyright (C) 2008 Red Hat, Inc. All rights reserved.
  5. *
  6. * This copyrighted material is made available to anyone wishing to use,
  7. * modify, copy, or redistribute it subject to the terms and conditions
  8. * of the GNU General Public License v.2.
  9. *
  10. * This file defines hook entry points called by core code where
  11. * user tracing/debugging support might need to do something. These
  12. * entry points are called tracehook_*(). Each hook declared below
  13. * has a detailed kerneldoc comment giving the context (locking et
  14. * al) from which it is called, and the meaning of its return value.
  15. *
  16. * Each function here typically has only one call site, so it is ok
  17. * to have some nontrivial tracehook_*() inlines. In all cases, the
  18. * fast path when no tracing is enabled should be very short.
  19. *
  20. * The purpose of this file and the tracehook_* layer is to consolidate
  21. * the interface that the kernel core and arch code uses to enable any
  22. * user debugging or tracing facility (such as ptrace). The interfaces
  23. * here are carefully documented so that maintainers of core and arch
  24. * code do not need to think about the implementation details of the
  25. * tracing facilities. Likewise, maintainers of the tracing code do not
  26. * need to understand all the calling core or arch code in detail, just
  27. * documented circumstances of each call, such as locking conditions.
  28. *
  29. * If the calling core code changes so that locking is different, then
  30. * it is ok to change the interface documented here. The maintainer of
  31. * core code changing should notify the maintainers of the tracing code
  32. * that they need to work out the change.
  33. *
  34. * Some tracehook_*() inlines take arguments that the current tracing
  35. * implementations might not necessarily use. These function signatures
  36. * are chosen to pass in all the information that is on hand in the
  37. * caller and might conceivably be relevant to a tracer, so that the
  38. * core code won't have to be updated when tracing adds more features.
  39. * If a call site changes so that some of those parameters are no longer
  40. * already on hand without extra work, then the tracehook_* interface
  41. * can change so there is no make-work burden on the core code. The
  42. * maintainer of core code changing should notify the maintainers of the
  43. * tracing code that they need to work out the change.
  44. */
  45. #ifndef _LINUX_TRACEHOOK_H
  46. #define _LINUX_TRACEHOOK_H 1
  47. #include <linux/sched.h>
  48. #include <linux/ptrace.h>
  49. #include <linux/security.h>
  50. struct linux_binprm;
  51. /**
  52. * tracehook_unsafe_exec - check for exec declared unsafe due to tracing
  53. * @task: current task doing exec
  54. *
  55. * Return %LSM_UNSAFE_* bits applied to an exec because of tracing.
  56. *
  57. * Called with task_lock() held on @task.
  58. */
  59. static inline int tracehook_unsafe_exec(struct task_struct *task)
  60. {
  61. int unsafe = 0;
  62. int ptrace = task_ptrace(task);
  63. if (ptrace & PT_PTRACED) {
  64. if (ptrace & PT_PTRACE_CAP)
  65. unsafe |= LSM_UNSAFE_PTRACE_CAP;
  66. else
  67. unsafe |= LSM_UNSAFE_PTRACE;
  68. }
  69. return unsafe;
  70. }
  71. /**
  72. * tracehook_report_exec - a successful exec was completed
  73. * @fmt: &struct linux_binfmt that performed the exec
  74. * @bprm: &struct linux_binprm containing exec details
  75. * @regs: user-mode register state
  76. *
  77. * An exec just completed, we are shortly going to return to user mode.
  78. * The freshly initialized register state can be seen and changed in @regs.
  79. * The name, file and other pointers in @bprm are still on hand to be
  80. * inspected, but will be freed as soon as this returns.
  81. *
  82. * Called with no locks, but with some kernel resources held live
  83. * and a reference on @fmt->module.
  84. */
  85. static inline void tracehook_report_exec(struct linux_binfmt *fmt,
  86. struct linux_binprm *bprm,
  87. struct pt_regs *regs)
  88. {
  89. if (!ptrace_event(PT_TRACE_EXEC, PTRACE_EVENT_EXEC, 0) &&
  90. unlikely(task_ptrace(current) & PT_PTRACED))
  91. send_sig(SIGTRAP, current, 0);
  92. }
  93. /**
  94. * tracehook_report_exit - task has begun to exit
  95. * @exit_code: pointer to value destined for @current->exit_code
  96. *
  97. * @exit_code points to the value passed to do_exit(), which tracing
  98. * might change here. This is almost the first thing in do_exit(),
  99. * before freeing any resources or setting the %PF_EXITING flag.
  100. *
  101. * Called with no locks held.
  102. */
  103. static inline void tracehook_report_exit(long *exit_code)
  104. {
  105. ptrace_event(PT_TRACE_EXIT, PTRACE_EVENT_EXIT, *exit_code);
  106. }
  107. /**
  108. * tracehook_prepare_clone - prepare for new child to be cloned
  109. * @clone_flags: %CLONE_* flags from clone/fork/vfork system call
  110. *
  111. * This is called before a new user task is to be cloned.
  112. * Its return value will be passed to tracehook_finish_clone().
  113. *
  114. * Called with no locks held.
  115. */
  116. static inline int tracehook_prepare_clone(unsigned clone_flags)
  117. {
  118. if (clone_flags & CLONE_UNTRACED)
  119. return 0;
  120. if (clone_flags & CLONE_VFORK) {
  121. if (current->ptrace & PT_TRACE_VFORK)
  122. return PTRACE_EVENT_VFORK;
  123. } else if ((clone_flags & CSIGNAL) != SIGCHLD) {
  124. if (current->ptrace & PT_TRACE_CLONE)
  125. return PTRACE_EVENT_CLONE;
  126. } else if (current->ptrace & PT_TRACE_FORK)
  127. return PTRACE_EVENT_FORK;
  128. return 0;
  129. }
  130. /**
  131. * tracehook_finish_clone - new child created and being attached
  132. * @child: new child task
  133. * @clone_flags: %CLONE_* flags from clone/fork/vfork system call
  134. * @trace: return value from tracehook_clone_prepare()
  135. *
  136. * This is called immediately after adding @child to its parent's children list.
  137. * The @trace value is that returned by tracehook_prepare_clone().
  138. *
  139. * Called with current's siglock and write_lock_irq(&tasklist_lock) held.
  140. */
  141. static inline void tracehook_finish_clone(struct task_struct *child,
  142. unsigned long clone_flags, int trace)
  143. {
  144. ptrace_init_task(child, (clone_flags & CLONE_PTRACE) || trace);
  145. }
  146. /**
  147. * tracehook_report_clone - in parent, new child is about to start running
  148. * @trace: return value from tracehook_clone_prepare()
  149. * @regs: parent's user register state
  150. * @clone_flags: flags from parent's system call
  151. * @pid: new child's PID in the parent's namespace
  152. * @child: new child task
  153. *
  154. * Called after a child is set up, but before it has been started running.
  155. * The @trace value is that returned by tracehook_clone_prepare().
  156. * This is not a good place to block, because the child has not started yet.
  157. * Suspend the child here if desired, and block in tracehook_clone_complete().
  158. * This must prevent the child from self-reaping if tracehook_clone_complete()
  159. * uses the @child pointer; otherwise it might have died and been released by
  160. * the time tracehook_report_clone_complete() is called.
  161. *
  162. * Called with no locks held, but the child cannot run until this returns.
  163. */
  164. static inline void tracehook_report_clone(int trace, struct pt_regs *regs,
  165. unsigned long clone_flags,
  166. pid_t pid, struct task_struct *child)
  167. {
  168. if (unlikely(trace)) {
  169. /*
  170. * The child starts up with an immediate SIGSTOP.
  171. */
  172. sigaddset(&child->pending.signal, SIGSTOP);
  173. set_tsk_thread_flag(child, TIF_SIGPENDING);
  174. }
  175. }
  176. /**
  177. * tracehook_report_clone_complete - new child is running
  178. * @trace: return value from tracehook_clone_prepare()
  179. * @regs: parent's user register state
  180. * @clone_flags: flags from parent's system call
  181. * @pid: new child's PID in the parent's namespace
  182. * @child: child task, already running
  183. *
  184. * This is called just after the child has started running. This is
  185. * just before the clone/fork syscall returns, or blocks for vfork
  186. * child completion if @clone_flags has the %CLONE_VFORK bit set.
  187. * The @child pointer may be invalid if a self-reaping child died and
  188. * tracehook_report_clone() took no action to prevent it from self-reaping.
  189. *
  190. * Called with no locks held.
  191. */
  192. static inline void tracehook_report_clone_complete(int trace,
  193. struct pt_regs *regs,
  194. unsigned long clone_flags,
  195. pid_t pid,
  196. struct task_struct *child)
  197. {
  198. if (unlikely(trace))
  199. ptrace_event(0, trace, pid);
  200. }
  201. /**
  202. * tracehook_report_vfork_done - vfork parent's child has exited or exec'd
  203. * @child: child task, already running
  204. * @pid: new child's PID in the parent's namespace
  205. *
  206. * Called after a %CLONE_VFORK parent has waited for the child to complete.
  207. * The clone/vfork system call will return immediately after this.
  208. * The @child pointer may be invalid if a self-reaping child died and
  209. * tracehook_report_clone() took no action to prevent it from self-reaping.
  210. *
  211. * Called with no locks held.
  212. */
  213. static inline void tracehook_report_vfork_done(struct task_struct *child,
  214. pid_t pid)
  215. {
  216. ptrace_event(PT_TRACE_VFORK_DONE, PTRACE_EVENT_VFORK_DONE, pid);
  217. }
  218. /**
  219. * tracehook_prepare_release_task - task is being reaped, clean up tracing
  220. * @task: task in %EXIT_DEAD state
  221. *
  222. * This is called in release_task() just before @task gets finally reaped
  223. * and freed. This would be the ideal place to remove and clean up any
  224. * tracing-related state for @task.
  225. *
  226. * Called with no locks held.
  227. */
  228. static inline void tracehook_prepare_release_task(struct task_struct *task)
  229. {
  230. }
  231. /**
  232. * tracehook_finish_release_task - task is being reaped, clean up tracing
  233. * @task: task in %EXIT_DEAD state
  234. *
  235. * This is called in release_task() when @task is being in the middle of
  236. * being reaped. After this, there must be no tracing entanglements.
  237. *
  238. * Called with write_lock_irq(&tasklist_lock) held.
  239. */
  240. static inline void tracehook_finish_release_task(struct task_struct *task)
  241. {
  242. ptrace_release_task(task);
  243. }
  244. #endif /* <linux/tracehook.h> */