From 38ada4845415f64e3447e7da043c91376d48fd5d Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Tue, 3 Sep 2019 11:35:31 -0600 Subject: [PATCH] libc/libc/unistd/: Add stubs for setreuid(), and setregid(). NuttX does not currently support effective user/group IDs, but these stubs will support linkage of applications that expect these POSIX standard interfaces. --- include/unistd.h | 3 ++ libs/libc/unistd/Make.defs | 1 + libs/libc/unistd/lib_setregid.c | 90 +++++++++++++++++++++++++++++++++ libs/libc/unistd/lib_setreuid.c | 90 +++++++++++++++++++++++++++++++++ 4 files changed, 184 insertions(+) create mode 100644 libs/libc/unistd/lib_setregid.c create mode 100644 libs/libc/unistd/lib_setreuid.c diff --git a/include/unistd.h b/include/unistd.h index 41f163eaf2..bf0361baa7 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -380,6 +380,9 @@ uid_t geteuid(void); int setegid(gid_t gid); gid_t getegid(void); +int setreuid(uid_t ruid, uid_t euid); +int setregid(gid_t rgid, gid_t egid); + #undef EXTERN #if defined(__cplusplus) } diff --git a/libs/libc/unistd/Make.defs b/libs/libc/unistd/Make.defs index 5ed63e0761..95528aa0af 100644 --- a/libs/libc/unistd/Make.defs +++ b/libs/libc/unistd/Make.defs @@ -39,6 +39,7 @@ CSRCS += lib_access.c lib_daemon.c lib_swab.c lib_sysconf.c CSRCS += lib_getopt.c lib_getoptargp.c lib_getoptindp.c lib_getoptoptp.c CSRCS += lib_sleep.c lib_usleep.c CSRCS += lib_seteuid.c lib_setegid.c lib_geteuid.c lib_getegid.c +CSRCS += lib_setreuid.c lib_setregid.c ifneq ($(CONFIG_SCHED_USER_IDENTITY),y) CSRCS += lib_setuid.c lib_setgid.c lib_getuid.c lib_getgid.c diff --git a/libs/libc/unistd/lib_setregid.c b/libs/libc/unistd/lib_setregid.c new file mode 100644 index 0000000000..5beee654a2 --- /dev/null +++ b/libs/libc/unistd/lib_setregid.c @@ -0,0 +1,90 @@ +/**************************************************************************** + * libs/libc/unistd/lib_setregid.c + * + * Copyright (C) 2019 Gregory Nutt. All rights reserved. + * Author: Michael Jung + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: setregid + * + * Description: + * The setregid() function sets the real group ID and/or the effective group + * ID of the calling task group to rgid and/or egid. + * + * Input Parameters: + * rgid - Real group identity to set. The special value (gid_t)-1 + * indicates that the real group ID should not be changed. + * rgid - Effective group identity to set. The special value (gid_t)-1 + * indicates that the effective group ID should not be changed. + * + * Returned Value: + * Zero if successful and -1 in case of failure, in which case errno is set + * appropriately. + * + ****************************************************************************/ + +int setregid(gid_t rgid, gid_t egid) +{ + int ret = OK; + + if (rgid != (gid_t)-1) + { + /* Set the real group ID. CAREFUL: This exploits non-standard behavior + * of setgid(): setgid() should set the real, effective, and saved + * group ID. Here we depend on it setting only the real group ID. + */ + + ret = setgid(rgid); + } + + if (ret >= 0 && egid != (gid_t)-1) + { + /* Set the effective group ID */ + + ret = setegid(egid); + } + + return ret; +} diff --git a/libs/libc/unistd/lib_setreuid.c b/libs/libc/unistd/lib_setreuid.c new file mode 100644 index 0000000000..46569577b5 --- /dev/null +++ b/libs/libc/unistd/lib_setreuid.c @@ -0,0 +1,90 @@ +/**************************************************************************** + * libs/libc/unistd/lib_setreuid.c + * + * Copyright (C) 2019 Gregory Nutt. All rights reserved. + * Author: Michael Jung + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: setreuid + * + * Description: + * The setreuid() function sets the real user ID and/or the effective user + * ID of the calling task group to ruid and/or euid. + * + * Input Parameters: + * ruid - Real user identity to set. The special value (uid_t)-1 + * indicates that the real user ID should not be changed. + * ruid - Effective user identity to set. The special value (uid_t)-1 + * indicates that the effective user ID should not be changed. + * + * Returned Value: + * Zero if successful and -1 in case of failure, in which case errno is set + * appropriately. + * + ****************************************************************************/ + +int setreuid(uid_t ruid, uid_t euid) +{ + int ret = OK; + + if (ruid != (uid_t)-1) + { + /* Set the real user ID. CAREFUL: This exploits non-standard behavior + * of setuid(): setuid() should set the real, effective, and saved + * user ID. Here we depend on it setting only the real user ID. + */ + + ret = setuid(ruid); + } + + if (ret >= 0 && euid != (uid_t)-1) + { + /* Set the effective user ID */ + + ret = seteuid(euid); + } + + return ret; +}