diff options
Diffstat (limited to 'meta/recipes-kernel/lttng/lttng-modules/0003-Fix-Sleeping-function-called-from-invalid-context.patch')
| -rw-r--r-- | meta/recipes-kernel/lttng/lttng-modules/0003-Fix-Sleeping-function-called-from-invalid-context.patch | 133 |
1 files changed, 0 insertions, 133 deletions
diff --git a/meta/recipes-kernel/lttng/lttng-modules/0003-Fix-Sleeping-function-called-from-invalid-context.patch b/meta/recipes-kernel/lttng/lttng-modules/0003-Fix-Sleeping-function-called-from-invalid-context.patch deleted file mode 100644 index d444a0728a..0000000000 --- a/meta/recipes-kernel/lttng/lttng-modules/0003-Fix-Sleeping-function-called-from-invalid-context.patch +++ /dev/null | |||
| @@ -1,133 +0,0 @@ | |||
| 1 | From c1af5643e0df56b92481f7a7bc4110a58e4e5abb Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | ||
| 3 | Date: Fri, 21 Jul 2017 08:22:04 -0400 | ||
| 4 | Subject: [PATCH 3/8] Fix: Sleeping function called from invalid context | ||
| 5 | Organization: O.S. Systems Software LTDA. | ||
| 6 | |||
| 7 | It affects system call instrumentation for accept, accept4 and connect, | ||
| 8 | only on the x86-64 architecture. | ||
| 9 | |||
| 10 | We need to use the LTTng accessing functions to touch user-space memory, | ||
| 11 | which take care of disabling the page fault handler, so we don't preempt | ||
| 12 | while in preempt-off context (tracepoints disable preemption). | ||
| 13 | |||
| 14 | Fixes #1111 | ||
| 15 | |||
| 16 | Upstream-Status: Backport [2.9.4] | ||
| 17 | |||
| 18 | Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | ||
| 19 | --- | ||
| 20 | .../x86-64-syscalls-3.10.0-rc7_pointers_override.h | 47 ++++++++++++++-------- | ||
| 21 | 1 file changed, 31 insertions(+), 16 deletions(-) | ||
| 22 | |||
| 23 | diff --git a/instrumentation/syscalls/headers/x86-64-syscalls-3.10.0-rc7_pointers_override.h b/instrumentation/syscalls/headers/x86-64-syscalls-3.10.0-rc7_pointers_override.h | ||
| 24 | index 5e91004..6bf5291 100644 | ||
| 25 | --- a/instrumentation/syscalls/headers/x86-64-syscalls-3.10.0-rc7_pointers_override.h | ||
| 26 | +++ b/instrumentation/syscalls/headers/x86-64-syscalls-3.10.0-rc7_pointers_override.h | ||
| 27 | @@ -2,7 +2,7 @@ | ||
| 28 | |||
| 29 | #define OVERRIDE_64_connect | ||
| 30 | SC_LTTNG_TRACEPOINT_EVENT_CODE(connect, | ||
| 31 | - TP_PROTO(sc_exit(long ret,) int fd, struct sockaddr * uservaddr, int addrlen), | ||
| 32 | + TP_PROTO(sc_exit(long ret,) int fd, struct sockaddr __user * uservaddr, int addrlen), | ||
| 33 | TP_ARGS(sc_exit(ret,) fd, uservaddr, addrlen), | ||
| 34 | TP_locvar( | ||
| 35 | __typeof__(uservaddr->sa_family) sa_family; | ||
| 36 | @@ -16,21 +16,28 @@ SC_LTTNG_TRACEPOINT_EVENT_CODE(connect, | ||
| 37 | memset(tp_locvar, 0, sizeof(*tp_locvar)); | ||
| 38 | if (addrlen < sizeof(tp_locvar->sa_family)) | ||
| 39 | goto skip_code; | ||
| 40 | - (void) get_user(tp_locvar->sa_family, &uservaddr->sa_family); | ||
| 41 | + (void) lib_ring_buffer_copy_from_user_check_nofault(&tp_locvar->sa_family, | ||
| 42 | + &uservaddr->sa_family, sizeof(tp_locvar->sa_family)); | ||
| 43 | switch (tp_locvar->sa_family) { | ||
| 44 | case AF_INET: | ||
| 45 | if (addrlen < sizeof(struct sockaddr_in)) | ||
| 46 | goto skip_code; | ||
| 47 | - (void) get_user(tp_locvar->dport, &((struct sockaddr_in *) uservaddr)->sin_port); | ||
| 48 | - (void) get_user(tp_locvar->v4addr, &((struct sockaddr_in *) uservaddr)->sin_addr.s_addr); | ||
| 49 | + (void) lib_ring_buffer_copy_from_user_check_nofault(&tp_locvar->dport, | ||
| 50 | + &((struct sockaddr_in __user *) uservaddr)->sin_port, | ||
| 51 | + sizeof(tp_locvar->dport)); | ||
| 52 | + (void) lib_ring_buffer_copy_from_user_check_nofault(&tp_locvar->v4addr, | ||
| 53 | + &((struct sockaddr_in __user *) uservaddr)->sin_addr.s_addr, | ||
| 54 | + sizeof(tp_locvar->v4addr)); | ||
| 55 | tp_locvar->v4addr_len = 4; | ||
| 56 | break; | ||
| 57 | case AF_INET6: | ||
| 58 | if (addrlen < sizeof(struct sockaddr_in6)) | ||
| 59 | goto skip_code; | ||
| 60 | - (void) get_user(tp_locvar->dport, &((struct sockaddr_in6 *) uservaddr)->sin6_port); | ||
| 61 | - if (copy_from_user(tp_locvar->v6addr, | ||
| 62 | - &((struct sockaddr_in6 *) uservaddr)->sin6_addr.in6_u.u6_addr8, | ||
| 63 | + (void) lib_ring_buffer_copy_from_user_check_nofault(&tp_locvar->dport, | ||
| 64 | + &((struct sockaddr_in6 __user *) uservaddr)->sin6_port, | ||
| 65 | + sizeof(tp_locvar->dport)); | ||
| 66 | + if (lib_ring_buffer_copy_from_user_check_nofault(tp_locvar->v6addr, | ||
| 67 | + &((struct sockaddr_in6 __user *) uservaddr)->sin6_addr.in6_u.u6_addr8, | ||
| 68 | sizeof(tp_locvar->v6addr))) | ||
| 69 | memset(tp_locvar->v6addr, 0, sizeof(tp_locvar->v6addr)); | ||
| 70 | tp_locvar->v6addr_len = 8; | ||
| 71 | @@ -63,26 +70,34 @@ SC_LTTNG_TRACEPOINT_EVENT_CODE(connect, | ||
| 72 | #define LTTNG_SYSCALL_ACCEPT_code_pre \ | ||
| 73 | sc_inout( \ | ||
| 74 | memset(tp_locvar, 0, sizeof(*tp_locvar)); \ | ||
| 75 | - (void) get_user(tp_locvar->uaddr_len, upeer_addrlen); \ | ||
| 76 | + (void) lib_ring_buffer_copy_from_user_check_nofault(&tp_locvar->uaddr_len, \ | ||
| 77 | + upeer_addrlen, sizeof(tp_locvar->uaddr_len)); \ | ||
| 78 | ) \ | ||
| 79 | sc_out( \ | ||
| 80 | if (tp_locvar->uaddr_len < sizeof(tp_locvar->sa_family)) \ | ||
| 81 | goto skip_code; \ | ||
| 82 | - (void) get_user(tp_locvar->sa_family, &upeer_sockaddr->sa_family); \ | ||
| 83 | + (void) lib_ring_buffer_copy_from_user_check_nofault(&tp_locvar->sa_family, \ | ||
| 84 | + &upeer_sockaddr->sa_family, sizeof(tp_locvar->sa_family)); \ | ||
| 85 | switch (tp_locvar->sa_family) { \ | ||
| 86 | case AF_INET: \ | ||
| 87 | if (tp_locvar->uaddr_len < sizeof(struct sockaddr_in)) \ | ||
| 88 | goto skip_code; \ | ||
| 89 | - (void) get_user(tp_locvar->sport, &((struct sockaddr_in *) upeer_sockaddr)->sin_port); \ | ||
| 90 | - (void) get_user(tp_locvar->v4addr, &((struct sockaddr_in *) upeer_sockaddr)->sin_addr.s_addr); \ | ||
| 91 | + (void) lib_ring_buffer_copy_from_user_check_nofault(&tp_locvar->sport, \ | ||
| 92 | + &((struct sockaddr_in __user *) upeer_sockaddr)->sin_port, \ | ||
| 93 | + sizeof(tp_locvar->sport)); \ | ||
| 94 | + (void) lib_ring_buffer_copy_from_user_check_nofault(&tp_locvar->v4addr, \ | ||
| 95 | + &((struct sockaddr_in __user *) upeer_sockaddr)->sin_addr.s_addr, \ | ||
| 96 | + sizeof(tp_locvar->v4addr)); \ | ||
| 97 | tp_locvar->v4addr_len = 4; \ | ||
| 98 | break; \ | ||
| 99 | case AF_INET6: \ | ||
| 100 | if (tp_locvar->uaddr_len < sizeof(struct sockaddr_in6)) \ | ||
| 101 | goto skip_code; \ | ||
| 102 | - (void) get_user(tp_locvar->sport, &((struct sockaddr_in6 *) upeer_sockaddr)->sin6_port); \ | ||
| 103 | - if (copy_from_user(tp_locvar->v6addr, \ | ||
| 104 | - &((struct sockaddr_in6 *) upeer_sockaddr)->sin6_addr.in6_u.u6_addr8, \ | ||
| 105 | + (void) lib_ring_buffer_copy_from_user_check_nofault(&tp_locvar->sport, \ | ||
| 106 | + &((struct sockaddr_in6 __user *) upeer_sockaddr)->sin6_port, \ | ||
| 107 | + sizeof(tp_locvar->sport)); \ | ||
| 108 | + if (lib_ring_buffer_copy_from_user_check_nofault(tp_locvar->v6addr, \ | ||
| 109 | + &((struct sockaddr_in6 __user *) upeer_sockaddr)->sin6_addr.in6_u.u6_addr8, \ | ||
| 110 | sizeof(tp_locvar->v6addr))) \ | ||
| 111 | memset(tp_locvar->v6addr, 0, sizeof(tp_locvar->v6addr)); \ | ||
| 112 | tp_locvar->v6addr_len = 8; \ | ||
| 113 | @@ -93,7 +108,7 @@ SC_LTTNG_TRACEPOINT_EVENT_CODE(connect, | ||
| 114 | |||
| 115 | #define OVERRIDE_64_accept | ||
| 116 | SC_LTTNG_TRACEPOINT_EVENT_CODE(accept, | ||
| 117 | - TP_PROTO(sc_exit(long ret,) int fd, struct sockaddr * upeer_sockaddr, int * upeer_addrlen), | ||
| 118 | + TP_PROTO(sc_exit(long ret,) int fd, struct sockaddr __user * upeer_sockaddr, int __user * upeer_addrlen), | ||
| 119 | TP_ARGS(sc_exit(ret,) fd, upeer_sockaddr, upeer_addrlen), | ||
| 120 | TP_locvar( | ||
| 121 | LTTNG_SYSCALL_ACCEPT_locvar | ||
| 122 | @@ -116,7 +131,7 @@ SC_LTTNG_TRACEPOINT_EVENT_CODE(accept, | ||
| 123 | |||
| 124 | #define OVERRIDE_64_accept4 | ||
| 125 | SC_LTTNG_TRACEPOINT_EVENT_CODE(accept4, | ||
| 126 | - TP_PROTO(sc_exit(long ret,) int fd, struct sockaddr * upeer_sockaddr, int * upeer_addrlen, int flags), | ||
| 127 | + TP_PROTO(sc_exit(long ret,) int fd, struct sockaddr __user * upeer_sockaddr, int __user * upeer_addrlen, int flags), | ||
| 128 | TP_ARGS(sc_exit(ret,) fd, upeer_sockaddr, upeer_addrlen, flags), | ||
| 129 | TP_locvar( | ||
| 130 | LTTNG_SYSCALL_ACCEPT_locvar | ||
| 131 | -- | ||
| 132 | 2.14.1 | ||
| 133 | |||
