From 3bbceb1287e3df7eb75e7a9852278d4eb9d33a00 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 31 Oct 1995 06:54:40 +0000 Subject: Tue Oct 31 00:07:29 1995 Roland McGrath * sysdeps/mach/hurd/group_member.c: New file. * sysdeps/generic/group_member.c: New file. * Makerules (lib-noranlib): Don't depend on $(install-lib). (others): Do. * extra-lib.mk: Fix test of $(lib)-no-lib-dep. Mon Oct 30 12:33:10 1995 Roland McGrath * Rules (others): Depend on $(extra-objs). * posix/unistd.h [__USE_GNU]: Declare group_member, __group_member. * posix/Makefile (routines): Add group_member. * sysdeps/posix/euidaccess.c: New file, adapted from fileutils. * sysdeps/unix/sysv/linux/i386/sigaction.c: Tighten constraint for SIG operand in asm so it must be a register. Add dead return to quiet gcc warning. * Makerules (sysd-rules): Write a defn for sysd-rules-done. [! sysd-rules-done]: Inhibit deps. --- ChangeLog | 25 ++++ Makerules | 23 ++-- Rules | 4 +- configure | 6 +- extra-lib.mk | 4 +- posix/Makefile | 2 +- posix/regex.c | 8 +- posix/unistd.h | 6 + sysdeps/generic/group_member.c | 50 ++++++++ sysdeps/mach/hurd/group_member.c | 56 +++++++++ sysdeps/posix/euidaccess.c | 201 +++++++++++++++++++++++++++++++ sysdeps/unix/sysv/linux/i386/sigaction.c | 5 +- 12 files changed, 369 insertions(+), 21 deletions(-) create mode 100644 sysdeps/generic/group_member.c create mode 100644 sysdeps/mach/hurd/group_member.c create mode 100644 sysdeps/posix/euidaccess.c diff --git a/ChangeLog b/ChangeLog index 29a86e6d80..f7798649f8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +Tue Oct 31 00:07:29 1995 Roland McGrath + + * sysdeps/mach/hurd/group_member.c: New file. + * sysdeps/generic/group_member.c: New file. + + * Makerules (lib-noranlib): Don't depend on $(install-lib). + (others): Do. + * extra-lib.mk: Fix test of $(lib)-no-lib-dep. + +Mon Oct 30 12:33:10 1995 Roland McGrath + + * Rules (others): Depend on $(extra-objs). + + * posix/unistd.h [__USE_GNU]: Declare group_member, __group_member. + * posix/Makefile (routines): Add group_member. + + * sysdeps/posix/euidaccess.c: New file, adapted from fileutils. + + * sysdeps/unix/sysv/linux/i386/sigaction.c: Tighten constraint for + SIG operand in asm so it must be a register. + Add dead return to quiet gcc warning. + + * Makerules (sysd-rules): Write a defn for sysd-rules-done. + [! sysd-rules-done]: Inhibit deps. + Thu Oct 26 23:11:11 1995 Ulrich Drepper * sysdeps/unix/sysv/linux/poll.c: Don't define as stub. Use diff --git a/Makerules b/Makerules index ce05017e4d..ac07369998 100644 --- a/Makerules +++ b/Makerules @@ -75,11 +75,6 @@ vpath %.h $(subst $(empty) ,:,$(strip $(common-objpfx) \ $(addprefix $(sysdep_dir)/,$(sysdirs)) \ $(..))) -ifeq ($(wildcard $(+sysdir_pfx)sysd-Makefile),) -# Don't do deps until this exists, because it might change the sources list. -no_deps=t -endif - # Some sysdep makefiles use this to distinguish being included here from # being included individually by a subdir makefile (hurd/Makefile needs this). in-Makerules := yes @@ -104,6 +99,12 @@ $(+sysdir_pfx)sysd-Makefile: $(+sysdir_pfx)config.make $(..)Makerules \ mv -f $@T $@ endif +ifndef sysd-Makefile-done +# Don't do deps until this exists, because it might change the sources list. +no_deps=t +endif + + # Reorder before-compile so that mach things come first, and hurd things # second, before all else. The mach and hurd subdirectories have many # generated header files which the much of rest of the library depends on, @@ -231,9 +232,16 @@ $(+sysdir_pfx)sysd-rules: $(+sysdir_pfx)config.make $(..)Makerules \ $(close-check-inhibit-asm) \ echo "\$$(objpfx)%.d: $$dir/%.c \$$(before-compile); \ \$$(+make-deps)"; \ - done) > $@T + done; \ + echo 'sysd-rules-done = t') > $@T mv -f $@T $@ +ifndef sysd-rules-done +# Don't do deps until this exists, because it provides rules to make the deps. +no_deps=t +endif + + ifndef compile-command.S compile-command.S = $(compile.S) $(OUTPUT_OPTION) endif @@ -344,7 +352,8 @@ lib%.a: lib%.a(__.SYMDEF) ; libobjs: $(foreach o,$(object-suffixes),\ $(common-objpfx)$(patsubst %,$(libtype$o),c)(\ $(notdir $(objects:.o=$o)))) -lib-noranlib: libobjs $(addprefix $(objpfx),$(install-lib)) +lib-noranlib: libobjs +others: $(addprefix $(objpfx),$(install-lib)) ifdef objects diff --git a/Rules b/Rules index b0187d9d5e..05148ec70d 100644 --- a/Rules +++ b/Rules @@ -55,7 +55,7 @@ endif include ../Makerules .PHONY: subdir_lib -subdir_lib: objs lib-noranlib +subdir_lib: lib-noranlib # Some subdirs need to install a dummy library. # They can use "$(objpfx)libfnord.a: $(dep-dummy-lib); $(make-dummy-lib)". @@ -72,7 +72,7 @@ generated := $(generated) dummy.o dummy.c # This makes all the auxilliary and test programs. .PHONY: others tests -others: $(addprefix $(objpfx),$(others)) +others: $(addprefix $(objpfx),$(others) $(extra-objs)) ifeq ($(cross-compiling),yes) tests: $(addprefix $(objpfx),$(tests)) else diff --git a/configure b/configure index be1f7b2047..0476b00499 100755 --- a/configure +++ b/configure @@ -1005,7 +1005,7 @@ else ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in gcc; do + for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="${ac_tool_prefix}gcc" @@ -1035,7 +1035,7 @@ else ac_cv_prog_AR="$AR" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in ar; do + for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_AR="${ac_tool_prefix}ar" @@ -1095,7 +1095,7 @@ else ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in :; do + for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_RANLIB="ranlib" diff --git a/extra-lib.mk b/extra-lib.mk index 44db007421..aa92fd1664 100644 --- a/extra-lib.mk +++ b/extra-lib.mk @@ -25,13 +25,11 @@ ifneq (,$(filter .so,$(object-suffixes-$(lib)))) alltypes-$(lib) += $(objpfx)$(lib).so endif -ifneq (0,$(MAKELEVEL)) -ifndef $(lib)-no-lib-dep +ifeq (,$($(lib)-no-lib-dep)) lib-noranlib: $(alltypes-$(lib)) else others: $(alltypes-$(lib)) endif -endif # Use o-iterator.mk to generate a rule for each flavor of library. define o-iterator-doit diff --git a/posix/Makefile b/posix/Makefile index 5c3d9a0fb2..937dc04880 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -36,7 +36,7 @@ routines := \ fork vfork _exit \ execve fexecve execv execle execl execvp execlp \ getpid getppid \ - getuid geteuid getgid getegid getgroups setuid setgid \ + getuid geteuid getgid getegid getgroups setuid setgid group_member \ getpgid setpgid getpgrp setsid \ getlogin setlogin \ pathconf sysconf fpathconf \ diff --git a/posix/regex.c b/posix/regex.c index 13c70faa4c..f1db89adf6 100644 --- a/posix/regex.c +++ b/posix/regex.c @@ -1159,7 +1159,7 @@ typedef struct /* Push the info, starting with the registers. */ \ DEBUG_PRINT1 ("\n"); \ \ - if (!(RE_NO_POSIX_BACKTRACKING & bufp->syntax)) \ + if (1) \ for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \ this_reg++) \ { \ @@ -1220,7 +1220,7 @@ typedef struct /* We actually push this many items. */ #define NUM_FAILURE_ITEMS \ - (((RE_NO_POSIX_BACKTRACKING & bufp->syntax \ + (((0 \ ? 0 : highest_active_reg - lowest_active_reg + 1) \ * NUM_REG_ITEMS) \ + NUM_NONREG_ITEMS) @@ -1281,7 +1281,7 @@ typedef struct low_reg = (unsigned) POP_FAILURE_INT (); \ DEBUG_PRINT2 (" Popping low active reg: %d\n", low_reg); \ \ - if (!(RE_NO_POSIX_BACKTRACKING & bufp->syntax)) \ + if (1) \ for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \ { \ DEBUG_PRINT2 (" Popping reg: %d\n", this_reg); \ @@ -1299,7 +1299,7 @@ typedef struct { \ for (this_reg = highest_active_reg; this_reg > high_reg; this_reg--) \ { \ - reg_info[this_reg].word = 0; \ + reg_info[this_reg].word.integer = 0; \ regend[this_reg] = 0; \ regstart[this_reg] = 0; \ } \ diff --git a/posix/unistd.h b/posix/unistd.h index ffd83b2b1e..62c25fc09b 100644 --- a/posix/unistd.h +++ b/posix/unistd.h @@ -366,6 +366,12 @@ extern __gid_t getegid __P ((void)); extern int __getgroups __P ((int __size, __gid_t __list[])); extern int getgroups __P ((int __size, __gid_t __list[])); +#ifdef __USE_GNU +/* Return nonzero iff the calling process is in group GID. */ +extern int __group_member __P ((__gid_t __gid)); +extern int group_member __P ((__gid_t __gid)); +#endif + /* Set the user ID of the calling process to UID. If the calling process is the super-user, set the real and effective user IDs, and the saved set-user-ID to UID; diff --git a/sysdeps/generic/group_member.c b/sysdeps/generic/group_member.c new file mode 100644 index 0000000000..31d2e87f53 --- /dev/null +++ b/sysdeps/generic/group_member.c @@ -0,0 +1,50 @@ +/* `group_member' -- test if process is in a given group. +Copyright (C) 1995 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include +#include +#include +#include + +#ifndef NGROUPS_MAX +#define NGROUPS_MAX 16 /* First guess. */ +#endif + +int +__group_member (gid) + gid_t gid; +{ + int n, size; + gid_t *groups; + + size = NGROUPS_MAX; + do + { + groups = __alloca (size * sizeof *groups); + n = __getgroups (size, groups); + size *= 2; + } while (n == size / 2); + + while (n > 0) + if (groups[n--] == gid) + return 1; + + return 0; +} +weak_alias (__group_member, group_member) diff --git a/sysdeps/mach/hurd/group_member.c b/sysdeps/mach/hurd/group_member.c new file mode 100644 index 0000000000..09da4479cd --- /dev/null +++ b/sysdeps/mach/hurd/group_member.c @@ -0,0 +1,56 @@ +/* `group_member' -- test if process is in a given group. Hurd version. +Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include +#include +#include +#include + +int +__group_member (gid) + gid_t gid; +{ + int member = 0; + error_t err; + void *crit; + + crit = _hurd_critical_section_lock (); + __mutex_lock (&_hurd_id.lock); + + err = _hurd_check_ids (); + if (! err) + { + size_t i; + for (i = 0; i < _hurd_id.gen.ngids; ++i) + if (_hurd_id.gen.gids[i] == gid) + { + member = 1; + break; + } + } + + __mutex_unlock (&_hurd_id.lock); + _hurd_critical_section_unlock (crit); + + if (err) + __hurd_fail (err); + return member; +} + +weak_alias (__group_member, group_member) diff --git a/sysdeps/posix/euidaccess.c b/sysdeps/posix/euidaccess.c new file mode 100644 index 0000000000..feaa9a2ed3 --- /dev/null +++ b/sysdeps/posix/euidaccess.c @@ -0,0 +1,201 @@ +/* euidaccess -- check if effective user id can access file + Copyright (C) 1990, 1991, 1995 Free Software Foundation, Inc. + +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +/* Written by David MacKenzie and Torbjorn Granlund. + Adapted for GNU C library by Roland McGrath. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#ifdef S_IEXEC +#ifndef S_IXUSR +#define S_IXUSR S_IEXEC +#endif +#ifndef S_IXGRP +#define S_IXGRP (S_IEXEC >> 3) +#endif +#ifndef S_IXOTH +#define S_IXOTH (S_IEXEC >> 6) +#endif +#endif /* S_IEXEC */ + +#if defined (HAVE_UNISTD_H) || defined (_LIBC) +#include +#endif + +#ifdef _POSIX_VERSION +#include +#if !defined(NGROUPS_MAX) || NGROUPS_MAX < 1 +#undef NGROUPS_MAX +#define NGROUPS_MAX sysconf (_SC_NGROUPS_MAX) +#endif /* NGROUPS_MAX */ + +#else /* not _POSIX_VERSION */ +uid_t getuid (); +gid_t getgid (); +uid_t geteuid (); +gid_t getegid (); +#include +#if !defined(NGROUPS_MAX) && defined(NGROUPS) +#define NGROUPS_MAX NGROUPS +#endif /* not NGROUPS_MAX and NGROUPS */ +#endif /* not POSIX_VERSION */ + +#include +#ifndef errno +extern int errno; +#endif + +#if defined(EACCES) && !defined(EACCESS) +#define EACCESS EACCES +#endif + +#ifndef F_OK +#define F_OK 0 +#define X_OK 1 +#define W_OK 2 +#define R_OK 4 +#endif + + +#ifdef _LIBC + +#define group_member __group_member + +#else + +/* The user's real user id. */ +static uid_t uid; + +/* The user's real group id. */ +static gid_t gid; + +/* The user's effective user id. */ +static uid_t euid; + +/* The user's effective group id. */ +static gid_t egid; + +/* Nonzero if UID, GID, EUID, and EGID have valid values. */ +static int have_ids = 0; + +#ifdef HAVE_GETGROUPS +int group_member (); +#else +#define group_member(gid) 0 +#endif + +#endif + + +/* Return 0 if the user has permission of type MODE on file PATH; + otherwise, return -1 and set `errno' to EACCESS. + Like access, except that it uses the effective user and group + id's instead of the real ones, and it does not check for read-only + filesystem, text busy, etc. */ + +int +euidaccess (path, mode) + const char *path; + int mode; +{ + struct stat stats; + int granted; + +#ifdef _LIBC + uid_t uid = getuid (), euid = geteuid (); + gid_t gid = getgid (), egid = getegid (); +#else + if (have_ids == 0) + { + have_ids = 1; + uid = getuid (); + gid = getgid (); + euid = geteuid (); + egid = getegid (); + } +#endif + + if (uid == euid && gid == egid) + /* If we are not set-uid or set-gid, access does the same. */ + return access (path, mode); + + if (stat (path, &stats)) + return -1; + + mode &= (X_OK | W_OK | R_OK); /* Clear any bogus bits. */ +#if R_OK != S_IROTH || W_OK != S_IWOTH || X_OK != S_IXOTH + ?error Oops, portability assumptions incorrect. +#endif + + if (mode == F_OK) + return 0; /* The file exists. */ + + /* The super-user can read and write any file, and execute any file + that anyone can execute. */ + if (euid == 0 && ((mode & X_OK) == 0 + || (stats.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))) + return 0; + + if (euid == stats.st_uid) + granted = (unsigned) (stats.st_mode & (mode << 6)) >> 6; + else if (egid == stats.st_gid || group_member (stats.st_gid)) + granted = (unsigned) (stats.st_mode & (mode << 3)) >> 3; + else + granted = (stats.st_mode & mode); + if (granted == mode) + return 0; + errno = EACCESS; + return -1; +} + +#ifdef TEST +#include +#include +#include "error.h" + +char *program_name; + +int +main (argc, argv) + int argc; + char **argv; +{ + char *file; + int mode; + int err; + + program_name = argv[0]; + if (argc < 3) + abort (); + file = argv[1]; + mode = atoi (argv[2]); + + err = euidaccess (file, mode); + printf ("%d\n", err); + if (err != 0) + error (0, errno, "%s", file); + exit (0); +} +#endif diff --git a/sysdeps/unix/sysv/linux/i386/sigaction.c b/sysdeps/unix/sysv/linux/i386/sigaction.c index 64c8f9a404..58e637eed5 100644 --- a/sysdeps/unix/sysv/linux/i386/sigaction.c +++ b/sysdeps/unix/sysv/linux/i386/sigaction.c @@ -44,7 +44,7 @@ __sigaction (int sig, const struct sigaction *act, struct sigaction *oact) "int $0x80\n" "popl %%ebx" : "=a" (result) - : "0" (SYS_ify (sigaction)), "g" (sig), "c" (act), "d" (oact)); + : "0" (SYS_ify (sigaction)), "r" (sig), "c" (act), "d" (oact)); if (result < 0) { @@ -75,6 +75,7 @@ __sigaction (int sig, const struct sigaction *act, struct sigaction *oact) " popf\n" " ret" : : ); + restore_nomask: asm (" addl $4, %%esp\n" " popl %%eax\n" @@ -83,7 +84,9 @@ __sigaction (int sig, const struct sigaction *act, struct sigaction *oact) " popf\n" " ret" : : ); + /* NOTREACHED */ + return -1; } weak_alias (__sigaction, sigaction) -- cgit v1.2.3