X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust-fork%2Fustfork.c;h=b10f24d23f4e9a7f42b891cdaa44366e0e444ce9;hb=b62f8205216d20d7ef16b536efd81389dc6fdd2f;hp=25f9d4cc04c31d2589e36d148684bf61d846c5aa;hpb=735bef4705cc42f25d26f25be09ba98f1efb8511;p=lttng-ust.git diff --git a/liblttng-ust-fork/ustfork.c b/liblttng-ust-fork/ustfork.c index 25f9d4cc..b10f24d2 100644 --- a/liblttng-ust-fork/ustfork.c +++ b/liblttng-ust-fork/ustfork.c @@ -1,24 +1,11 @@ /* + * SPDX-License-Identifier: LGPL-2.1-only + * * Copyright (C) 2009 Pierre-Marc Fournier * Copyright (C) 2011-2012 Mathieu Desnoyers - * - * 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; 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 */ -#define _GNU_SOURCE -#include +#include #include #include #include @@ -26,7 +13,7 @@ #include #include -#include +#include pid_t fork(void) { @@ -44,15 +31,15 @@ pid_t fork(void) } } - ust_before_fork(&sigset); + lttng_ust_before_fork(&sigset); /* Do the real fork */ retval = plibc_func(); saved_errno = errno; if (retval == 0) { /* child */ - ust_after_fork_child(&sigset); + lttng_ust_after_fork_child(&sigset); } else { - ust_after_fork_parent(&sigset); + lttng_ust_after_fork_parent(&sigset); } errno = saved_errno; return retval; @@ -74,17 +61,167 @@ int daemon(int nochdir, int noclose) } } - ust_before_fork(&sigset); + lttng_ust_before_fork(&sigset); /* Do the real daemon call */ retval = plibc_func(nochdir, noclose); saved_errno = errno; if (retval == 0) { /* child, parent called _exit() directly */ - ust_after_fork_child(&sigset); + lttng_ust_after_fork_child(&sigset); } else { /* on error in the parent */ - ust_after_fork_parent(&sigset); + lttng_ust_after_fork_parent(&sigset); + } + errno = saved_errno; + return retval; +} + +int setuid(uid_t uid) +{ + static int (*plibc_func)(uid_t uid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setuid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setuid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setuid */ + retval = plibc_func(uid); + saved_errno = errno; + + lttng_ust_after_setuid(); + + errno = saved_errno; + return retval; +} + +int setgid(gid_t gid) +{ + static int (*plibc_func)(gid_t gid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setgid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setgid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setgid */ + retval = plibc_func(gid); + saved_errno = errno; + + lttng_ust_after_setgid(); + + errno = saved_errno; + return retval; +} + +int seteuid(uid_t euid) +{ + static int (*plibc_func)(uid_t euid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "seteuid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"seteuid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real seteuid */ + retval = plibc_func(euid); + saved_errno = errno; + + lttng_ust_after_seteuid(); + + errno = saved_errno; + return retval; +} + +int setegid(gid_t egid) +{ + static int (*plibc_func)(gid_t egid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setegid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setegid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setegid */ + retval = plibc_func(egid); + saved_errno = errno; + + lttng_ust_after_setegid(); + + errno = saved_errno; + return retval; +} + +int setreuid(uid_t ruid, uid_t euid) +{ + static int (*plibc_func)(uid_t ruid, uid_t euid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setreuid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setreuid\" symbol\n"); + errno = ENOSYS; + return -1; + } } + + /* Do the real setreuid */ + retval = plibc_func(ruid, euid); + saved_errno = errno; + + lttng_ust_after_setreuid(); + + errno = saved_errno; + return retval; +} + +int setregid(gid_t rgid, gid_t egid) +{ + static int (*plibc_func)(gid_t rgid, gid_t egid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setregid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setregid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setregid */ + retval = plibc_func(rgid, egid); + saved_errno = errno; + + lttng_ust_after_setregid(); + errno = saved_errno; return retval; } @@ -104,7 +241,7 @@ static int clone_fn(void *arg) struct ustfork_clone_info *info = (struct ustfork_clone_info *) arg; /* clone is now done and we are in child */ - ust_after_fork_child(&info->sigset); + lttng_ust_after_fork_child(&info->sigset); return info->fn(info->arg); } @@ -149,12 +286,12 @@ int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ...) /* Creating a real process, we need to intervene. */ struct ustfork_clone_info info = { .fn = fn, .arg = arg }; - ust_before_fork(&info.sigset); + lttng_ust_before_fork(&info.sigset); retval = plibc_func(clone_fn, child_stack, flags, &info, ptid, tls, ctid); saved_errno = errno; /* The child doesn't get here. */ - ust_after_fork_parent(&info.sigset); + lttng_ust_after_fork_parent(&info.sigset); } errno = saved_errno; return retval; @@ -179,7 +316,7 @@ int setns(int fd, int nstype) retval = plibc_func(fd, nstype); saved_errno = errno; - ust_after_setns(); + lttng_ust_after_setns(); errno = saved_errno; return retval; @@ -204,7 +341,57 @@ int unshare(int flags) retval = plibc_func(flags); saved_errno = errno; - ust_after_unshare(); + lttng_ust_after_unshare(); + + errno = saved_errno; + return retval; +} + +int setresuid(uid_t ruid, uid_t euid, uid_t suid) +{ + static int (*plibc_func)(uid_t ruid, uid_t euid, uid_t suid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setresuid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setresuid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setresuid */ + retval = plibc_func(ruid, euid, suid); + saved_errno = errno; + + lttng_ust_after_setresuid(); + + errno = saved_errno; + return retval; +} + +int setresgid(gid_t rgid, gid_t egid, gid_t sgid) +{ + static int (*plibc_func)(gid_t rgid, gid_t egid, gid_t sgid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setresgid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setresgid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setresgid */ + retval = plibc_func(rgid, egid, sgid); + saved_errno = errno; + + lttng_ust_after_setresgid(); errno = saved_errno; return retval; @@ -228,15 +415,15 @@ pid_t rfork(int flags) } } - ust_before_fork(&sigset); + lttng_ust_before_fork(&sigset); /* Do the real rfork */ retval = plibc_func(); saved_errno = errno; if (retval == 0) { /* child */ - ust_after_fork_child(&sigset); + lttng_ust_after_fork_child(&sigset); } else { - ust_after_fork_parent(&sigset); + lttng_ust_after_fork_parent(&sigset); } errno = saved_errno; return retval;