Add a context for each available kernel user and group IDs * uid : real user ID * euid : effective user ID * suid : saved set-user ID * fsuid : filesystem ID
These are the IDs as seen in the initial user namespace, see credentials(7) for details on each type. Also add a "virtual" version of each type with the "v" prefix that are the IDs as seen in the current user namespace. Signed-off-by: Michael Jeanson <mjean...@efficios.com> --- Makefile | 16 +++++++++ lttng-abi.c | 32 +++++++++++++++++ lttng-abi.h | 16 +++++++++ lttng-context-egid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-euid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-fsgid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-fsuid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-gid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-sgid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-suid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-uid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-vegid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-veuid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-vfsgid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-vfsuid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-vgid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-vsgid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-vsuid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-context-vuid.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ lttng-events.h | 17 +++++++++ wrapper/user_namespace.h | 73 ++++++++++++++++++++++++++++++++++++++ 21 files changed, 1610 insertions(+) create mode 100644 lttng-context-egid.c create mode 100644 lttng-context-euid.c create mode 100644 lttng-context-fsgid.c create mode 100644 lttng-context-fsuid.c create mode 100644 lttng-context-gid.c create mode 100644 lttng-context-sgid.c create mode 100644 lttng-context-suid.c create mode 100644 lttng-context-uid.c create mode 100644 lttng-context-vegid.c create mode 100644 lttng-context-veuid.c create mode 100644 lttng-context-vfsgid.c create mode 100644 lttng-context-vfsuid.c create mode 100644 lttng-context-vgid.c create mode 100644 lttng-context-vsgid.c create mode 100644 lttng-context-vsuid.c create mode 100644 lttng-context-vuid.c create mode 100644 wrapper/user_namespace.h diff --git a/Makefile b/Makefile index 15f18c4..c4c2216 100644 --- a/Makefile +++ b/Makefile @@ -50,6 +50,22 @@ ifneq ($(KERNELRELEASE),) lttng-context-vpid.o lttng-context-tid.o \ lttng-context-vtid.o lttng-context-ppid.o \ lttng-context-vppid.o lttng-context-cpu-id.o \ + lttng-context-uid.o \ + lttng-context-euid.o \ + lttng-context-suid.o \ + lttng-context-fsuid.o \ + lttng-context-gid.o \ + lttng-context-egid.o \ + lttng-context-sgid.o \ + lttng-context-fsgid.o \ + lttng-context-vuid.o \ + lttng-context-veuid.o \ + lttng-context-vsuid.o \ + lttng-context-vfsuid.o \ + lttng-context-vgid.o \ + lttng-context-vegid.o \ + lttng-context-vsgid.o \ + lttng-context-vfsgid.o \ lttng-context-interruptible.o \ lttng-context-need-reschedule.o lttng-calibrate.o \ lttng-context-hostname.o wrapper/random.o \ diff --git a/lttng-abi.c b/lttng-abi.c index 1345e93..5c547f3 100644 --- a/lttng-abi.c +++ b/lttng-abi.c @@ -261,6 +261,38 @@ long lttng_abi_add_context(struct file *file, return lttng_add_user_ns_to_ctx(ctx); case LTTNG_KERNEL_CONTEXT_UTS_NS: return lttng_add_uts_ns_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_UID: + return lttng_add_uid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_EUID: + return lttng_add_euid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_SUID: + return lttng_add_suid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_FSUID: + return lttng_add_fsuid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_GID: + return lttng_add_gid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_EGID: + return lttng_add_egid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_SGID: + return lttng_add_sgid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_FSGID: + return lttng_add_fsgid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_VUID: + return lttng_add_vuid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_VEUID: + return lttng_add_veuid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_VSUID: + return lttng_add_vsuid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_VFSUID: + return lttng_add_vfsuid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_VGID: + return lttng_add_vgid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_VEGID: + return lttng_add_vegid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_VSGID: + return lttng_add_vsgid_to_ctx(ctx); + case LTTNG_KERNEL_CONTEXT_VFSGID: + return lttng_add_vfsgid_to_ctx(ctx); default: return -EINVAL; } diff --git a/lttng-abi.h b/lttng-abi.h index 47cacec..1f0877d 100644 --- a/lttng-abi.h +++ b/lttng-abi.h @@ -153,6 +153,22 @@ enum lttng_kernel_context_type { LTTNG_KERNEL_CONTEXT_PID_NS = 20, LTTNG_KERNEL_CONTEXT_USER_NS = 21, LTTNG_KERNEL_CONTEXT_UTS_NS = 22, + LTTNG_KERNEL_CONTEXT_UID = 23, + LTTNG_KERNEL_CONTEXT_EUID = 24, + LTTNG_KERNEL_CONTEXT_SUID = 25, + LTTNG_KERNEL_CONTEXT_FSUID = 26, + LTTNG_KERNEL_CONTEXT_GID = 27, + LTTNG_KERNEL_CONTEXT_EGID = 28, + LTTNG_KERNEL_CONTEXT_SGID = 29, + LTTNG_KERNEL_CONTEXT_FSGID = 30, + LTTNG_KERNEL_CONTEXT_VUID = 31, + LTTNG_KERNEL_CONTEXT_VEUID = 32, + LTTNG_KERNEL_CONTEXT_VSUID = 33, + LTTNG_KERNEL_CONTEXT_VFSUID = 34, + LTTNG_KERNEL_CONTEXT_VGID = 35, + LTTNG_KERNEL_CONTEXT_VEGID = 36, + LTTNG_KERNEL_CONTEXT_VSGID = 37, + LTTNG_KERNEL_CONTEXT_VFSGID = 38, }; struct lttng_kernel_perf_counter_ctx { diff --git a/lttng-context-egid.c b/lttng-context-egid.c new file mode 100644 index 0000000..ace7475 --- /dev/null +++ b/lttng-context-egid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-egid.c + * + * LTTng effective group ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t egid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(gid_t)); + size += sizeof(gid_t); + return size; +} + +static +void egid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + gid_t egid; + + egid = lttng_current_egid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(egid)); + chan->ops->event_write(ctx, &egid, sizeof(egid)); +} + +static +void egid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + gid_t egid; + + egid = lttng_current_egid(); + value->s64 = egid; +} + +int lttng_add_egid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "egid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "egid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(gid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = egid_get_size; + field->record = egid_record; + field->get_value = egid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_egid_to_ctx); diff --git a/lttng-context-euid.c b/lttng-context-euid.c new file mode 100644 index 0000000..f12e96d --- /dev/null +++ b/lttng-context-euid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-euid.c + * + * LTTng effective user ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t euid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(uid_t)); + size += sizeof(uid_t); + return size; +} + +static +void euid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + uid_t euid; + + euid = lttng_current_euid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(euid)); + chan->ops->event_write(ctx, &euid, sizeof(euid)); +} + +static +void euid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + uid_t euid; + + euid = lttng_current_euid(); + value->s64 = euid; +} + +int lttng_add_euid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "euid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "euid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(uid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = euid_get_size; + field->record = euid_record; + field->get_value = euid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_euid_to_ctx); diff --git a/lttng-context-fsgid.c b/lttng-context-fsgid.c new file mode 100644 index 0000000..2713cdb --- /dev/null +++ b/lttng-context-fsgid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-fsgid.c + * + * LTTng filesystem group ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t fsgid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(gid_t)); + size += sizeof(gid_t); + return size; +} + +static +void fsgid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + gid_t fsgid; + + fsgid = lttng_current_fsgid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(fsgid)); + chan->ops->event_write(ctx, &fsgid, sizeof(fsgid)); +} + +static +void fsgid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + gid_t fsgid; + + fsgid = lttng_current_fsgid(); + value->s64 = fsgid; +} + +int lttng_add_fsgid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "fsgid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "fsgid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(gid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = fsgid_get_size; + field->record = fsgid_record; + field->get_value = fsgid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_fsgid_to_ctx); diff --git a/lttng-context-fsuid.c b/lttng-context-fsuid.c new file mode 100644 index 0000000..77bed3a --- /dev/null +++ b/lttng-context-fsuid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-fsuid.c + * + * LTTng filesystem user ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t fsuid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(uid_t)); + size += sizeof(uid_t); + return size; +} + +static +void fsuid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + uid_t fsuid; + + fsuid = lttng_current_fsuid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(fsuid)); + chan->ops->event_write(ctx, &fsuid, sizeof(fsuid)); +} + +static +void fsuid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + uid_t fsuid; + + fsuid = lttng_current_fsuid(); + value->s64 = fsuid; +} + +int lttng_add_fsuid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "fsuid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "fsuid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(uid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = fsuid_get_size; + field->record = fsuid_record; + field->get_value = fsuid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_fsuid_to_ctx); diff --git a/lttng-context-gid.c b/lttng-context-gid.c new file mode 100644 index 0000000..c31c00f --- /dev/null +++ b/lttng-context-gid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-gid.c + * + * LTTng real group ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t gid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(gid_t)); + size += sizeof(gid_t); + return size; +} + +static +void gid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + gid_t gid; + + gid = lttng_current_gid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(gid)); + chan->ops->event_write(ctx, &gid, sizeof(gid)); +} + +static +void gid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + gid_t gid; + + gid = lttng_current_gid(); + value->s64 = gid; +} + +int lttng_add_gid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "gid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "gid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(gid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = gid_get_size; + field->record = gid_record; + field->get_value = gid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_gid_to_ctx); diff --git a/lttng-context-sgid.c b/lttng-context-sgid.c new file mode 100644 index 0000000..7d3ce2f --- /dev/null +++ b/lttng-context-sgid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-sgid.c + * + * LTTng saved set-group-ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t sgid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(gid_t)); + size += sizeof(gid_t); + return size; +} + +static +void sgid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + gid_t sgid; + + sgid = lttng_current_sgid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(sgid)); + chan->ops->event_write(ctx, &sgid, sizeof(sgid)); +} + +static +void sgid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + gid_t sgid; + + sgid = lttng_current_sgid(); + value->s64 = sgid; +} + +int lttng_add_sgid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "sgid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "sgid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(gid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = sgid_get_size; + field->record = sgid_record; + field->get_value = sgid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_sgid_to_ctx); diff --git a/lttng-context-suid.c b/lttng-context-suid.c new file mode 100644 index 0000000..2f13dd5 --- /dev/null +++ b/lttng-context-suid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-suid.c + * + * LTTng saved set-user-ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t suid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(uid_t)); + size += sizeof(uid_t); + return size; +} + +static +void suid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + uid_t suid; + + suid = lttng_current_suid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(suid)); + chan->ops->event_write(ctx, &suid, sizeof(suid)); +} + +static +void suid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + uid_t suid; + + suid = lttng_current_suid(); + value->s64 = suid; +} + +int lttng_add_suid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "suid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "suid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(uid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = suid_get_size; + field->record = suid_record; + field->get_value = suid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_suid_to_ctx); diff --git a/lttng-context-uid.c b/lttng-context-uid.c new file mode 100644 index 0000000..089bfd0 --- /dev/null +++ b/lttng-context-uid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-uid.c + * + * LTTng real user ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t uid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(uid_t)); + size += sizeof(uid_t); + return size; +} + +static +void uid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + uid_t uid; + + uid = lttng_current_uid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(uid)); + chan->ops->event_write(ctx, &uid, sizeof(uid)); +} + +static +void uid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + uid_t uid; + + uid = lttng_current_uid(); + value->s64 = uid; +} + +int lttng_add_uid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "uid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "uid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(uid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = uid_get_size; + field->record = uid_record; + field->get_value = uid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_uid_to_ctx); diff --git a/lttng-context-vegid.c b/lttng-context-vegid.c new file mode 100644 index 0000000..ec33bb0 --- /dev/null +++ b/lttng-context-vegid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-vegid.c + * + * LTTng namespaced effective group ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t vegid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(gid_t)); + size += sizeof(gid_t); + return size; +} + +static +void vegid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + gid_t vegid; + + vegid = lttng_current_vegid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(vegid)); + chan->ops->event_write(ctx, &vegid, sizeof(vegid)); +} + +static +void vegid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + gid_t vegid; + + vegid = lttng_current_vegid(); + value->s64 = vegid; +} + +int lttng_add_vegid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "vegid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "vegid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(gid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = vegid_get_size; + field->record = vegid_record; + field->get_value = vegid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_vegid_to_ctx); diff --git a/lttng-context-veuid.c b/lttng-context-veuid.c new file mode 100644 index 0000000..4a620c6 --- /dev/null +++ b/lttng-context-veuid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-veuid.c + * + * LTTng namespaced effective user ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t veuid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(uid_t)); + size += sizeof(uid_t); + return size; +} + +static +void veuid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + uid_t veuid; + + veuid = lttng_current_veuid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(veuid)); + chan->ops->event_write(ctx, &veuid, sizeof(veuid)); +} + +static +void veuid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + uid_t veuid; + + veuid = lttng_current_veuid(); + value->s64 = veuid; +} + +int lttng_add_veuid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "veuid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "veuid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(uid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = veuid_get_size; + field->record = veuid_record; + field->get_value = veuid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_veuid_to_ctx); diff --git a/lttng-context-vfsgid.c b/lttng-context-vfsgid.c new file mode 100644 index 0000000..56e54f7 --- /dev/null +++ b/lttng-context-vfsgid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-vfsgid.c + * + * LTTng namespaced filesystem group ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t vfsgid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(gid_t)); + size += sizeof(gid_t); + return size; +} + +static +void vfsgid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + gid_t vfsgid; + + vfsgid = lttng_current_vfsgid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(vfsgid)); + chan->ops->event_write(ctx, &vfsgid, sizeof(vfsgid)); +} + +static +void vfsgid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + gid_t vfsgid; + + vfsgid = lttng_current_vfsgid(); + value->s64 = vfsgid; +} + +int lttng_add_vfsgid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "vfsgid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "vfsgid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(gid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = vfsgid_get_size; + field->record = vfsgid_record; + field->get_value = vfsgid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_vfsgid_to_ctx); diff --git a/lttng-context-vfsuid.c b/lttng-context-vfsuid.c new file mode 100644 index 0000000..ce1a9fa --- /dev/null +++ b/lttng-context-vfsuid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-vfsuid.c + * + * LTTng namespaced filesystem user ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t vfsuid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(uid_t)); + size += sizeof(uid_t); + return size; +} + +static +void vfsuid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + uid_t vfsuid; + + vfsuid = lttng_current_vfsuid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(vfsuid)); + chan->ops->event_write(ctx, &vfsuid, sizeof(vfsuid)); +} + +static +void vfsuid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + uid_t vfsuid; + + vfsuid = lttng_current_vfsuid(); + value->s64 = vfsuid; +} + +int lttng_add_vfsuid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "vfsuid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "vfsuid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(uid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = vfsuid_get_size; + field->record = vfsuid_record; + field->get_value = vfsuid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_vfsuid_to_ctx); diff --git a/lttng-context-vgid.c b/lttng-context-vgid.c new file mode 100644 index 0000000..b26eebb --- /dev/null +++ b/lttng-context-vgid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-vgid.c + * + * LTTng namespaced real group ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t vgid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(gid_t)); + size += sizeof(gid_t); + return size; +} + +static +void vgid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + gid_t vgid; + + vgid = lttng_current_vgid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(vgid)); + chan->ops->event_write(ctx, &vgid, sizeof(vgid)); +} + +static +void vgid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + gid_t vgid; + + vgid = lttng_current_vgid(); + value->s64 = vgid; +} + +int lttng_add_vgid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "vgid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "vgid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(gid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = vgid_get_size; + field->record = vgid_record; + field->get_value = vgid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_vgid_to_ctx); diff --git a/lttng-context-vsgid.c b/lttng-context-vsgid.c new file mode 100644 index 0000000..1b65918 --- /dev/null +++ b/lttng-context-vsgid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-vsgid.c + * + * LTTng namespaced saved set-group-ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t vsgid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(gid_t)); + size += sizeof(gid_t); + return size; +} + +static +void vsgid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + gid_t vsgid; + + vsgid = lttng_current_vsgid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(vsgid)); + chan->ops->event_write(ctx, &vsgid, sizeof(vsgid)); +} + +static +void vsgid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + gid_t vsgid; + + vsgid = lttng_current_vsgid(); + value->s64 = vsgid; +} + +int lttng_add_vsgid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "vsgid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "vsgid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(gid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(gid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = vsgid_get_size; + field->record = vsgid_record; + field->get_value = vsgid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_vsgid_to_ctx); diff --git a/lttng-context-vsuid.c b/lttng-context-vsuid.c new file mode 100644 index 0000000..ac0721e --- /dev/null +++ b/lttng-context-vsuid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-vsuid.c + * + * LTTng namespaced saved set-user-ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t vsuid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(uid_t)); + size += sizeof(uid_t); + return size; +} + +static +void vsuid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + uid_t vsuid; + + vsuid = lttng_current_vsuid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(vsuid)); + chan->ops->event_write(ctx, &vsuid, sizeof(vsuid)); +} + +static +void vsuid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + uid_t vsuid; + + vsuid = lttng_current_vsuid(); + value->s64 = vsuid; +} + +int lttng_add_vsuid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "vsuid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "vsuid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(uid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = vsuid_get_size; + field->record = vsuid_record; + field->get_value = vsuid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_vsuid_to_ctx); diff --git a/lttng-context-vuid.c b/lttng-context-vuid.c new file mode 100644 index 0000000..4852ea7 --- /dev/null +++ b/lttng-context-vuid.c @@ -0,0 +1,91 @@ +/* + * lttng-context-vuid.c + * + * LTTng namespaced real user ID context. + * + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoy...@efficios.com> + * 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/module.h> +#include <linux/sched.h> +#include <lttng-events.h> +#include <lttng-tracer.h> +#include <wrapper/ringbuffer/frontend_types.h> +#include <wrapper/vmalloc.h> +#include <wrapper/user_namespace.h> + +static +size_t vuid_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(uid_t)); + size += sizeof(uid_t); + return size; +} + +static +void vuid_record(struct lttng_ctx_field *field, + struct lib_ring_buffer_ctx *ctx, + struct lttng_channel *chan) +{ + uid_t vuid; + + vuid = lttng_current_vuid(); + lib_ring_buffer_align_ctx(ctx, lttng_alignof(vuid)); + chan->ops->event_write(ctx, &vuid, sizeof(vuid)); +} + +static +void vuid_get_value(struct lttng_ctx_field *field, + struct lttng_probe_ctx *lttng_probe_ctx, + union lttng_ctx_value *value) +{ + uid_t vuid; + + vuid = lttng_current_vuid(); + value->s64 = vuid; +} + +int lttng_add_vuid_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "vuid")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "vuid"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(uid_t) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(uid_t); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 10; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = vuid_get_size; + field->record = vuid_record; + field->get_value = vuid_get_value; + lttng_context_update(*ctx); + wrapper_vmalloc_sync_all(); + return 0; +} +EXPORT_SYMBOL_GPL(lttng_add_vuid_to_ctx); diff --git a/lttng-events.h b/lttng-events.h index f3b2b91..b7e357d 100644 --- a/lttng-events.h +++ b/lttng-events.h @@ -781,6 +781,23 @@ int lttng_add_uts_ns_to_ctx(struct lttng_ctx **ctx) } #endif +int lttng_add_uid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_euid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_suid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_fsuid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_gid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_egid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_sgid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_fsgid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_vuid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_veuid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_vsuid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_vfsuid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_vgid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_vegid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_vsgid_to_ctx(struct lttng_ctx **ctx); +int lttng_add_vfsgid_to_ctx(struct lttng_ctx **ctx); + #if defined(CONFIG_PERF_EVENTS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33)) int lttng_add_perf_counter_to_ctx(uint32_t type, uint64_t config, diff --git a/wrapper/user_namespace.h b/wrapper/user_namespace.h new file mode 100644 index 0000000..f1f4181 --- /dev/null +++ b/wrapper/user_namespace.h @@ -0,0 +1,73 @@ +#ifndef _LTTNG_WRAPPER_USER_NAMESPACE_H +#define _LTTNG_WRAPPER_USER_NAMESPACE_H + +/* + * wrapper/user_namespace.h + * + * Copyright (C) 2018 Michael Jeanson <mjean...@efficios.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <linux/version.h> +#include <linux/user_namespace.h> + + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0) + +#define lttng_current_xxuid(xxx) \ + (from_kuid_munged(&init_user_ns, current_##xxx())) + +#define lttng_current_vxxuid(xxx) \ + (from_kuid_munged(current_user_ns(), current_##xxx())) + +#define lttng_current_xxgid(xxx) \ + (from_kgid_munged(&init_user_ns, current_##xxx())) + +#define lttng_current_vxxgid(xxx) \ + (from_kgid_munged(current_user_ns(), current_##xxx())) + +#else + +#define lttng_current_xxuid(xxx) (current_##xxx()) + +#define lttng_current_vxxuid(xxx) \ + (user_ns_map_uid(current_user_ns(), current_cred(), current_##xxx())) + +#define lttng_current_xxgid(xxx) (current_##xxx()) + +#define lttng_current_vxxgid(xxx) \ + (user_ns_map_gid(current_user_ns(), current_cred(), current_##xxx())) +#endif + +#define lttng_current_uid() (lttng_current_xxuid(uid)) +#define lttng_current_euid() (lttng_current_xxuid(euid)) +#define lttng_current_suid() (lttng_current_xxuid(suid)) +#define lttng_current_fsuid() (lttng_current_xxuid(fsuid)) +#define lttng_current_gid() (lttng_current_xxgid(gid)) +#define lttng_current_egid() (lttng_current_xxgid(egid)) +#define lttng_current_sgid() (lttng_current_xxgid(sgid)) +#define lttng_current_fsgid() (lttng_current_xxgid(fsgid)) + +#define lttng_current_vuid() (lttng_current_vxxuid(uid)) +#define lttng_current_veuid() (lttng_current_vxxuid(euid)) +#define lttng_current_vsuid() (lttng_current_vxxuid(suid)) +#define lttng_current_vfsuid() (lttng_current_vxxuid(fsuid)) +#define lttng_current_vgid() (lttng_current_vxxgid(gid)) +#define lttng_current_vegid() (lttng_current_vxxgid(egid)) +#define lttng_current_vsgid() (lttng_current_vxxgid(sgid)) +#define lttng_current_vfsgid() (lttng_current_vxxgid(fsgid)) + +#endif /* _LTTNG_WRAPPER_USER_NAMESPACE_H */ -- 2.7.4 _______________________________________________ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev