X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=probes%2Flttng-events.h;h=d486994f3a0c2202741037c8ef68ffe5ebd16bc5;hb=edb5c2da83545004c5f556accb79d010a6b1e3a9;hp=1d2def4c8f161888dd9503cccfe0ca621f13ec2e;hpb=6d20e0ae80b64714a2e768d9ef110e13c0b43c4a;p=lttng-modules.git diff --git a/probes/lttng-events.h b/probes/lttng-events.h index 1d2def4c..d486994f 100644 --- a/probes/lttng-events.h +++ b/probes/lttng-events.h @@ -188,6 +188,10 @@ void trace_##_name(void *__data); }, \ }, +#undef __string_from_user +#define __string_from_user(_item, _src) \ + __string(_item, _src) + #undef TP_STRUCT__entry #define TP_STRUCT__entry(args...) args /* Only one used in this phase */ @@ -336,6 +340,15 @@ static __used struct lttng_probe_desc TP_ID(__probe_desc___, TRACE_SYSTEM) = { #define __string(_item, _src) \ __event_len += __dynamic_len[__dynamic_len_idx++] = strlen(_src) + 1; +/* + * strlen_user includes \0. If returns 0, it faulted, so we set size to + * 1 (\0 only). + */ +#undef __string_from_user +#define __string_from_user(_item, _src) \ + __event_len += __dynamic_len[__dynamic_len_idx++] = \ + max_t(size_t, strlen_user(_src), 1); + #undef TP_PROTO #define TP_PROTO(args...) args @@ -383,6 +396,9 @@ static inline size_t __event_get_size__##_name(size_t *__dynamic_len, _proto) \ #undef __string #define __string(_item, _src) +#undef __string_from_user +#define __string_from_user(_item, _src) + #undef TP_PROTO #define TP_PROTO(args...) args @@ -424,7 +440,11 @@ static inline size_t __event_get_align__##_name(_proto) \ _type _item; #undef __string -#define __string(_item, _src) char _item; +#define __string(_item, _src) char _item; + +#undef __string_from_user +#define __string_from_user(_item, _src) \ + __string(_item, _src) #undef TP_STRUCT__entry #define TP_STRUCT__entry(args...) args @@ -473,6 +493,10 @@ __end_field_##_item##_2: goto __assign_##_item; \ __end_field_##_item: +#undef __string_from_user +#define __string_from_user(_item, _src) \ + __string(_item, _src) + /* * Macros mapping tp_assign() to "=", tp_memcpy() to memcpy() and tp_strcpy() to * strcpy(). @@ -511,6 +535,35 @@ __assign_##dest##_2: \ sizeof(__typemap.dest) * __get_dynamic_array_len(dest));\ goto __end_field_##dest##_2; +#undef tp_memcpy_from_user +#define tp_memcpy_from_user(dest, src, len) \ + __assign_##dest: \ + if (0) \ + (void) __typemap.dest; \ + lib_ring_buffer_align_ctx(&__ctx, ltt_alignof(__typemap.dest)); \ + __chan->ops->event_write_from_user(&__ctx, src, len); \ + goto __end_field_##dest; + +/* + * The string length including the final \0. + */ +#undef tp_copy_string_from_user +#define tp_copy_string_from_user(dest, src) \ + __assign_##dest: \ + { \ + size_t __ustrlen; \ + \ + if (0) \ + (void) __typemap.dest; \ + lib_ring_buffer_align_ctx(&__ctx, ltt_alignof(__typemap.dest));\ + __ustrlen = __get_dynamic_array_len(dest); \ + if (likely(__ustrlen > 1)) { \ + __chan->ops->event_write_from_user(&__ctx, src, \ + __ustrlen - 1); \ + } \ + __chan->ops->event_memset(&__ctx, 0, 1); \ + } \ + goto __end_field_##dest; #undef tp_strcpy #define tp_strcpy(dest, src) \ tp_memcpy(dest, src, __get_dynamic_array_len(dest))