From 9271a050b5af6594ab112a9c116854953b041d8f Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 22 Oct 1998 11:49:29 +0000 Subject: [PATCH] Update. 1998-10-22 H.J. Lu * sysdeps/unix/sysv/linux/i386/getgroups.c (__getgroups): Add sanity check for n. * sysdeps/unix/sysv/linux/i386/setgroups.c (setgroups): Likewise. * sysdeps/posix/fpathconf.c (__fpathconf): Set errno to EINVAL if errno == ENODEV. Tested by VSX-PCT. * sysdeps/posix/isatty.c (__isatty): Don't reset errno. Tested by VSX-PCT. * posix/execvp.c (execvp): Check "". Tested by VSX-PCT. --- ChangeLog | 14 ++++++++++++++ posix/execvp.c | 9 ++++++++- sysdeps/posix/fpathconf.c | 5 ++++- sysdeps/posix/isatty.c | 11 ++--------- sysdeps/unix/sysv/linux/i386/getgroups.c | 30 +++++++++++++++++++++--------- sysdeps/unix/sysv/linux/i386/setgroups.c | 28 ++++++++++++++++++---------- 6 files changed, 67 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index 114ab54..7e39cc0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +1998-10-22 H.J. Lu + + * sysdeps/unix/sysv/linux/i386/getgroups.c (__getgroups): Add + sanity check for n. + * sysdeps/unix/sysv/linux/i386/setgroups.c (setgroups): Likewise. + + * sysdeps/posix/fpathconf.c (__fpathconf): Set errno to + EINVAL if errno == ENODEV. Tested by VSX-PCT. + + * sysdeps/posix/isatty.c (__isatty): Don't reset errno. Tested + by VSX-PCT. + + * posix/execvp.c (execvp): Check "". Tested by VSX-PCT. + 1998-10-22 Philip Blundell * sysdeps/unix/arm/sysdep.h: Wrap assembler macros in #ifdef diff --git a/posix/execvp.c b/posix/execvp.c index 5b1e14b..7afb01d 100644 --- a/posix/execvp.c +++ b/posix/execvp.c @@ -54,7 +54,7 @@ execute (const char *file, char *const argv[]) /* Execute the shell. */ execv (new_argv[0], new_argv); } - } + } } @@ -67,6 +67,13 @@ execvp (file, argv) { int got_eacces = 0; + if (*file == '\0') + { + /* We check the simple case first. */ + __set_errno (ENOENT); + return -1; + } + if (strchr (file, '/') != NULL) /* Don't search when it contains a slash. */ execute (file, argv); diff --git a/sysdeps/posix/fpathconf.c b/sysdeps/posix/fpathconf.c index b73292b..94593bc 100644 --- a/sysdeps/posix/fpathconf.c +++ b/sysdeps/posix/fpathconf.c @@ -72,9 +72,12 @@ __fpathconf (fd, name) { if (errno == ENOSYS) { - errno = save_errno; + __set_errno (save_errno); return NAME_MAX; } + else if (errno == ENODEV) + __set_errno (EINVAL); + return -1; } else diff --git a/sysdeps/posix/isatty.c b/sysdeps/posix/isatty.c index 41d16e4..d7a1499 100644 --- a/sysdeps/posix/isatty.c +++ b/sysdeps/posix/isatty.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1995, 1996, 1997, 1998 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 @@ -16,7 +16,6 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include #include #include @@ -25,15 +24,9 @@ int __isatty (fd) int fd; { - int save; - int is_tty; struct termios term; - save = errno; - is_tty = __tcgetattr (fd, &term) == 0; - __set_errno (save); - - return is_tty; + return __tcgetattr (fd, &term) == 0; } weak_alias (__isatty, isatty) diff --git a/sysdeps/unix/sysv/linux/i386/getgroups.c b/sysdeps/unix/sysv/linux/i386/getgroups.c index c306dd1..5484f72 100644 --- a/sysdeps/unix/sysv/linux/i386/getgroups.c +++ b/sysdeps/unix/sysv/linux/i386/getgroups.c @@ -17,10 +17,13 @@ Boston, MA 02111-1307, USA. */ #include -#include #include +#include +#include #include +#include + #include extern int __syscall_getgroups __P ((int, __kernel_gid_t *)); @@ -32,14 +35,23 @@ __getgroups (n, groups) int n; gid_t *groups; { - int i, ngids; - __kernel_gid_t kernel_groups[n]; - - ngids = INLINE_SYSCALL (getgroups, 2, n, kernel_groups); - if (n != 0 && ngids > 0) - for (i = 0; i < ngids; i++) - groups[i] = kernel_groups[i]; - return ngids; + if (n < 0) + { + __set_errno (EINVAL); + return -1; + } + else + { + int i, ngids; + __kernel_gid_t kernel_groups[n = MIN (n, __sysconf (_SC_NGROUPS_MAX))]; + + ngids = INLINE_SYSCALL (getgroups, 2, n, kernel_groups); + if (n != 0 && ngids > 0) + for (i = 0; i < ngids; i++) + groups[i] = kernel_groups[i]; + + return ngids; + } } weak_alias (__getgroups, getgroups) diff --git a/sysdeps/unix/sysv/linux/i386/setgroups.c b/sysdeps/unix/sysv/linux/i386/setgroups.c index ad2a6b5..67197e6 100644 --- a/sysdeps/unix/sysv/linux/i386/setgroups.c +++ b/sysdeps/unix/sysv/linux/i386/setgroups.c @@ -36,18 +36,26 @@ setgroups (n, groups) size_t n; const gid_t *groups; { - size_t i; - __kernel_gid_t kernel_groups[n]; - - for (i = 0; i < n; i++) + if (n < 0 || n > __sysconf (_SC_NGROUPS_MAX)) + { + __set_errno (EINVAL); + return -1; + } + else if { - kernel_groups[i] = groups[i]; - if (groups[i] != (gid_t) ((__kernel_gid_t) groups[i])) + size_t i; + __kernel_gid_t kernel_groups[n]; + + for (i = 0; i < n; i++) { - __set_errno (EINVAL); - return -1; + kernel_groups[i] = groups[i]; + if (groups[i] != (gid_t) ((__kernel_gid_t) groups[i])) + { + __set_errno (EINVAL); + return -1; + } } - } - return INLINE_SYSCALL (setgroups, 2, n, kernel_groups); + return INLINE_SYSCALL (setgroups, 2, n, kernel_groups); + } } -- 2.7.4