From 932a40e86b8472fb8881a71ef8f139a6ba9d0e42 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 10 Sep 2003 19:13:05 +0000 Subject: [PATCH] * Makefile.in (DLL_OFILES): Add getopt.o and iruserok.o. * cygwin.din: Export __check_rhosts_file, __rcmd_errstr, optarg, opterr, optind, optopt, optreset, getopt, getopt_long, iruserok and ruserok. * getopt.c: Moved from lib to here. Define opt* variables as dllexport. * iruserok.c: Moved from lib to here. Rearrange function order. Prefer using 64/32 bit functions. * syscalls.cc (shell_fp): Define as struct __sFILE64. (getusershell): Use fopen64 instead of fopen. * winsup.h: Add declarations for seteuid32, fopen64, cygwin_gethostbyname and cygwin_inet_addr. * include/getopt.h: Declare opt* variables dllimport. * include/cygwin/version.h: Bump API minor number. --- winsup/cygwin/ChangeLog | 17 ++ winsup/cygwin/Makefile.in | 20 +- winsup/cygwin/cygwin.din | 11 + winsup/cygwin/include/cygwin/version.h | 4 +- winsup/cygwin/include/getopt.h | 12 +- winsup/cygwin/{lib => libc}/getopt.c | 13 +- winsup/cygwin/{lib => libc}/iruserok.c | 301 +++++++++++-------------- winsup/cygwin/syscalls.cc | 4 +- winsup/cygwin/winsup.h | 8 +- 9 files changed, 190 insertions(+), 200 deletions(-) rename winsup/cygwin/{lib => libc}/getopt.c (97%) rename winsup/cygwin/{lib => libc}/iruserok.c (80%) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index c3419cd1a..023e63883 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,20 @@ +2003-09-10 Corinna Vinschen + + * Makefile.in (DLL_OFILES): Add getopt.o and iruserok.o. + * cygwin.din: Export __check_rhosts_file, __rcmd_errstr, optarg, + opterr, optind, optopt, optreset, getopt, getopt_long, iruserok + and ruserok. + * getopt.c: Moved from lib to here. Define opt* variables as + dllexport. + * iruserok.c: Moved from lib to here. Rearrange function order. + Prefer using 64/32 bit functions. + * syscalls.cc (shell_fp): Define as struct __sFILE64. + (getusershell): Use fopen64 instead of fopen. + * winsup.h: Add declarations for seteuid32, fopen64, + cygwin_gethostbyname and cygwin_inet_addr. + * include/getopt.h: Declare opt* variables dllimport. + * include/cygwin/version.h: Bump API minor number. + 2003-09-10 Christopher Faylor * exceptions.cc (sig_handle_tty_stop): Check parent PID_NOCLDSTOP diff --git a/winsup/cygwin/Makefile.in b/winsup/cygwin/Makefile.in index 5045b1f51..785b20744 100644 --- a/winsup/cygwin/Makefile.in +++ b/winsup/cygwin/Makefile.in @@ -146,7 +146,7 @@ MALLOC_OFILES=@MALLOC_OFILES@ DLL_IMPORTS:=$(w32api_lib)/libkernel32.a # Please maintain this list in sorted order, with maximum files per 80 col line -DLL_OFILES:=assert.o autoload.o cxx.o bsdlib.o cygheap.o cygthread.o dcrt0.o \ +DLL_OFILES:=assert.o autoload.o bsdlib.o cxx.o cygheap.o cygthread.o dcrt0.o \ debug.o delqueue.o dir.o dlfcn.o dll_init.o dtable.o environ.o \ errno.o exceptions.o exec.o external.o fcntl.o fhandler.o \ fhandler_clipboard.o fhandler_console.o fhandler_disk_file.o \ @@ -155,15 +155,15 @@ DLL_OFILES:=assert.o autoload.o cxx.o bsdlib.o cygheap.o cygthread.o dcrt0.o \ fhandler_raw.o fhandler_registry.o fhandler_serial.o \ fhandler_socket.o fhandler_tape.o fhandler_termios.o \ fhandler_tty.o fhandler_virtual.o fhandler_windows.o \ - fhandler_zero.o fnmatch.o fork.o glob.o grp.o heap.o init.o ioctl.o \ - ipc.o localtime.o malloc_wrapper.o miscfuncs.o mmap.o msg.o \ - net.o netdb.o ntea.o passwd.o path.o pinfo.o pipe.o poll.o pthread.o \ - regcomp.o regerror.o regexec.o regfree.o registry.o resource.o \ - scandir.o sched.o sec_acl.o sec_helper.o security.o select.o sem.o \ - shared.o shm.o signal.o sigproc.o smallprint.o spawn.o strace.o \ - strsep.o sync.o syscalls.o sysconf.o syslog.o termios.o thread.o \ - times.o tty.o uinfo.o uname.o v8_regexp.o v8_regerror.o v8_regsub.o \ - wait.o wincap.o window.o \ + fhandler_zero.o fnmatch.o fork.o getopt.o glob.o grp.o heap.o init.o \ + ioctl.o ipc.o iruserok.o localtime.o malloc_wrapper.o miscfuncs.o \ + mmap.o msg.o net.o netdb.o ntea.o passwd.o path.o pinfo.o pipe.o \ + poll.o pthread.o regcomp.o regerror.o regexec.o regfree.o registry.o \ + resource.o scandir.o sched.o sec_acl.o sec_helper.o security.o \ + select.o sem.o shared.o shm.o signal.o sigproc.o smallprint.o spawn.o \ + strace.o strsep.o sync.o syscalls.o sysconf.o syslog.o termios.o \ + thread.o times.o tty.o uinfo.o uname.o v8_regexp.o v8_regerror.o \ + v8_regsub.o wait.o wincap.o window.o \ $(EXTRA_DLL_OFILES) $(EXTRA_OFILES) $(MALLOC_OFILES) $(MT_SAFE_OBJECTS) GMON_OFILES:=gmon.o mcount.o profil.o diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din index 9df575b37..1f3575dc6 100644 --- a/winsup/cygwin/cygwin.din +++ b/winsup/cygwin/cygwin.din @@ -3,10 +3,12 @@ LIBRARY "cygwin1.dll" BASE=0x61000000 EXPORTS __argc DATA __argv DATA +__check_rhosts_file DATA __cygwin_environ DATA __cygwin_user_data DATA __mb_cur_max DATA __progname DATA +__rcmd_errstr DATA _check_for_executable DATA _ctype_ DATA _daylight DATA @@ -17,6 +19,11 @@ sys_nerr = _sys_nerr DATA _timezone DATA _tzname DATA h_errno DATA +optarg DATA +opterr DATA +optind DATA +optopt DATA +optreset DATA reent_data DATA @ALLOCA@ @DEF_DLL_ENTRY@ @@ -617,6 +624,8 @@ getmntent _getmntent = getmntent getmode _getmode = getmode +getopt +getopt_long getpagesize _getpagesize = getpagesize getpass @@ -704,6 +713,8 @@ ioctl _ioctl = ioctl iprintf _iprintf = iprintf +iruserok +ruserok isalnum _isalnum = isalnum isalpha diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index c37f52910..1c92343d9 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -217,13 +217,15 @@ details. */ 92: Export getusershell, setusershell, endusershell 93: Export daemon, forkpty, openpty, iruserok, ruserok, login_tty, openpty, forkpty, revoke, logwtmp, updwtmp + 94: Export getopt, getopt_long, optarg, opterr, optind, optopt, + optreset, __check_rhosts_file, __rcmd_errstr. */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ #define CYGWIN_VERSION_API_MAJOR 0 -#define CYGWIN_VERSION_API_MINOR 93 +#define CYGWIN_VERSION_API_MINOR 94 /* There is also a compatibity version number associated with the shared memory regions. It is incremented when incompatible diff --git a/winsup/cygwin/include/getopt.h b/winsup/cygwin/include/getopt.h index 6b6f643b7..ba095ba2f 100644 --- a/winsup/cygwin/include/getopt.h +++ b/winsup/cygwin/include/getopt.h @@ -38,11 +38,13 @@ extern "C" { #endif -extern int opterr; /* if error message should be printed */ -extern int optind; /* index into parent argv vector */ -extern int optopt; /* character checked for validity */ -extern int optreset; /* reset getopt */ -extern char *optarg; /* argument associated with option */ +#ifndef __INSIDE_CYGWIN__ +extern int __declspec(dllimport) opterr; /* if error message should be printed */ +extern int __declspec(dllimport) optind; /* index into parent argv vector */ +extern int __declspec(dllimport) optopt; /* character checked for validity */ +extern int __declspec(dllimport) optreset; /* reset getopt */ +extern char __declspec(dllimport) *optarg; /* argument associated with option */ +#endif int getopt (int, char * const *, const char *); diff --git a/winsup/cygwin/lib/getopt.c b/winsup/cygwin/libc/getopt.c similarity index 97% rename from winsup/cygwin/lib/getopt.c rename to winsup/cygwin/libc/getopt.c index b5d5a23b9..5d97945fa 100644 --- a/winsup/cygwin/lib/getopt.c +++ b/winsup/cygwin/libc/getopt.c @@ -36,6 +36,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include "winsup.h" #include #include #include @@ -52,11 +53,11 @@ #ifdef __weak_alias __weak_alias(getopt,_getopt) #endif -int opterr = 1; /* if error message should be printed */ -int optind = 1; /* index into parent argv vector */ -int optopt = '?'; /* character checked for validity */ -int optreset; /* reset getopt */ -char *optarg; /* argument associated with option */ +int __declspec(dllexport) opterr; /* if error message should be printed */ +int __declspec(dllexport) optind; /* index into parent argv vector */ +int __declspec(dllexport) optopt; /* character checked for validity */ +int __declspec(dllexport) optreset; /* reset getopt */ +char __declspec(dllexport) *optarg; /* argument associated with option */ #endif #ifdef __weak_alias @@ -66,7 +67,7 @@ __weak_alias(getopt_long,_getopt_long) #ifndef __CYGWIN__ #define __progname __argv[0] #else -extern char __declspec(dllimport) *__progname; +extern char *__progname; #endif #define IGNORE_FIRST (*options == '-' || *options == '+') diff --git a/winsup/cygwin/lib/iruserok.c b/winsup/cygwin/libc/iruserok.c similarity index 80% rename from winsup/cygwin/lib/iruserok.c rename to winsup/cygwin/libc/iruserok.c index 5e957184e..8326dd0a5 100644 --- a/winsup/cygwin/lib/iruserok.c +++ b/winsup/cygwin/libc/iruserok.c @@ -36,174 +36,52 @@ * SUCH DAMAGE. */ -#ifdef __CYGWIN__ -#define HAVE_MALLOC_H -#define HAVE_STDLIB_H -#define HAVE_STRING_H -#define TIME_WITH_SYS_TIME -#define PATH_HEQUIV "/etc/hosts.equiv" - -static int __ivaliduser(); -static int __icheckhost(); - -struct hostent *cygwin_gethostbyname (const char *name); -unsigned long cygwin_inet_addr (const char *cp); - -#define gethostbyname cygwin_gethostbyname -#define inet_addr cygwin_inet_addr -#endif - -#ifdef HAVE_CONFIG_H -# include -#endif +#include "winsup.h" #include -#include -#include #include -#include -#include -#include -#include -#ifdef HAVE_MALLOC_H #include -#endif -#if defined(STDC_HEADERS) || defined(HAVE_STDLIB_H) -#include -#endif -#ifdef HAVE_STRING_H -# include -#endif -#include -#ifdef HAVE_ARPA_NAMESER_H -# include -#endif +#include #include -#include #include #include #include -#ifdef TIME_WITH_SYS_TIME -# include -# include -#else -# ifdef HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif -#ifndef __CYGWIN__ -#include +#include +#include + +#ifndef PATH_HEQUIV +# define PATH_HEQUIV "/etc/hosts.equiv" #endif -int __check_rhosts_file = 1; +int __check_rhosts_file = 1; const char *__rcmd_errstr; -int -ruserok(rhost, superuser, ruser, luser) - const char *rhost; - int superuser; - const char *ruser; - const char *luser; -{ - struct hostent *hp; - u_long addr; - char **ap; - - if ((hp = gethostbyname(rhost)) == NULL) - return (-1); - for (ap = hp->h_addr_list; *ap; ++ap) { - bcopy(*ap, &addr, sizeof(addr)); - if (iruserok(addr, superuser, ruser, luser) == 0) - return (0); - } - return (-1); -} - /* - * New .rhosts strategy: We are passed an ip address. We spin through - * hosts.equiv and .rhosts looking for a match. When the .rhosts only - * has ip addresses, we don't have to trust a nameserver. When it - * contains hostnames, we spin through the list of addresses the nameserver - * gives us and look for a match. - * - * Returns 0 if ok, -1 if not ok. + * Returns "true" if match, 0 if no match. */ -int -iruserok(raddr, superuser, ruser, luser) +static int +__icheckhost(raddr, lhost) u_long raddr; - int superuser; - const char *ruser; - const char *luser; + register char *lhost; { - register const char *cp; - struct stat sbuf; - struct passwd *pwd; - FILE *hostf; - uid_t uid; - int first = 1; - char *pbuf; + register struct hostent *hp; + register u_long laddr; + register char **pp; - first = 1; - hostf = superuser ? NULL : fopen(PATH_HEQUIV, "r"); -again: - if (hostf) { - if (__ivaliduser(hostf, raddr, luser, ruser) == 0) { - (void) fclose(hostf); - return(0); - } - (void) fclose(hostf); - } - if (first == 1 && (__check_rhosts_file || superuser)) { - first = 0; - if ((pwd = getpwnam(luser)) == NULL) - return(-1); + /* Try for raw ip address first. */ + if (isdigit(*lhost) && (long)(laddr = cygwin_inet_addr(lhost)) != -1) + return (raddr == laddr); - pbuf = malloc (strlen (pwd->pw_dir) + sizeof "/.rhosts"); - if (! pbuf) - { - errno = ENOMEM; - return -1; - } - strcpy (pbuf, pwd->pw_dir); - strcat (pbuf, "/.rhosts"); + /* Better be a hostname. */ + if ((hp = cygwin_gethostbyname(lhost)) == NULL) + return (0); - /* - * Change effective uid while opening .rhosts. If root and - * reading an NFS mounted file system, can't read files that - * are protected read/write owner only. - */ - uid = geteuid(); - (void)seteuid(pwd->pw_uid); - hostf = fopen(pbuf, "r"); - (void)seteuid(uid); + /* Spin through ip addresses. */ + for (pp = hp->h_addr_list; *pp; ++pp) + if (!bcmp(&raddr, *pp, sizeof(u_long))) + return (1); - if (hostf == NULL) - return(-1); - /* - * If not a regular file, or is owned by someone other than - * user or root or if writeable by anyone but the owner, quit. - */ - cp = NULL; - if (lstat(pbuf, &sbuf) < 0) - cp = ".rhosts not regular file"; - else if (!S_ISREG(sbuf.st_mode)) - cp = ".rhosts not regular file"; - else if (fstat(fileno(hostf), &sbuf) < 0) - cp = ".rhosts fstat failed"; - else if (sbuf.st_uid && sbuf.st_uid != pwd->pw_uid) - cp = "bad .rhosts owner"; - else if (sbuf.st_mode & (S_IWGRP|S_IWOTH)) - cp = ".rhosts writeable by other than owner"; - /* If there were any problems, quit. */ - if (cp) { - __rcmd_errstr = (char *) cp; - fclose(hostf); - return(-1); - } - goto again; - } - return (-1); + /* No match. */ + return (0); } /* @@ -212,12 +90,9 @@ again: * * Returns 0 if ok, -1 if not ok. */ -#ifdef __CYGWIN__ -static -#endif -int +static int __ivaliduser(hostf, raddr, luser, ruser) - FILE *hostf; + struct __sFILE64 *hostf; u_long raddr; const char *luser; const char *ruser; @@ -287,33 +162,109 @@ __ivaliduser(hostf, raddr, luser, ruser) } /* - * Returns "true" if match, 0 if no match. + * New .rhosts strategy: We are passed an ip address. We spin through + * hosts.equiv and .rhosts looking for a match. When the .rhosts only + * has ip addresses, we don't have to trust a nameserver. When it + * contains hostnames, we spin through the list of addresses the nameserver + * gives us and look for a match. + * + * Returns 0 if ok, -1 if not ok. */ -#ifdef __CYGWIN__ -static -#endif int -__icheckhost(raddr, lhost) +iruserok(raddr, superuser, ruser, luser) u_long raddr; - register char *lhost; + int superuser; + const char *ruser; + const char *luser; { - register struct hostent *hp; - register u_long laddr; - register char **pp; + register const char *cp; + struct __stat64 sbuf; + struct passwd *pwd; + struct __sFILE64 *hostf; - /* Try for raw ip address first. */ - if (isdigit(*lhost) && (long)(laddr = inet_addr(lhost)) != -1) - return (raddr == laddr); + uid_t uid; + int first = 1; + char *pbuf; - /* Better be a hostname. */ - if ((hp = gethostbyname(lhost)) == NULL) - return (0); + first = 1; + hostf = superuser ? NULL : fopen64(PATH_HEQUIV, "rt"); +again: + if (hostf) { + if (__ivaliduser(hostf, raddr, luser, ruser) == 0) { + (void) fclose(hostf); + return(0); + } + (void) fclose(hostf); + } + if (first == 1 && (__check_rhosts_file || superuser)) { + first = 0; + if ((pwd = getpwnam(luser)) == NULL) + return(-1); - /* Spin through ip addresses. */ - for (pp = hp->h_addr_list; *pp; ++pp) - if (!bcmp(&raddr, *pp, sizeof(u_long))) - return (1); + pbuf = malloc (strlen (pwd->pw_dir) + sizeof "/.rhosts"); + if (! pbuf) + { + errno = ENOMEM; + return -1; + } + strcpy (pbuf, pwd->pw_dir); + strcat (pbuf, "/.rhosts"); - /* No match. */ - return (0); + /* + * Change effective uid while opening .rhosts. If root and + * reading an NFS mounted file system, can't read files that + * are protected read/write owner only. + */ + uid = geteuid32(); + (void)seteuid32(pwd->pw_uid); + hostf = fopen64(pbuf, "rt"); + (void)seteuid32(uid); + + if (hostf == NULL) + return(-1); + /* + * If not a regular file, or is owned by someone other than + * user or root or if writeable by anyone but the owner, quit. + */ + cp = NULL; + if (lstat64(pbuf, &sbuf) < 0) + cp = ".rhosts not regular file"; + else if (!S_ISREG(sbuf.st_mode)) + cp = ".rhosts not regular file"; + else if (fstat64(fileno(hostf), &sbuf) < 0) + cp = ".rhosts fstat failed"; + else if (sbuf.st_uid && sbuf.st_uid != pwd->pw_uid) + cp = "bad .rhosts owner"; + else if (sbuf.st_mode & (S_IWGRP|S_IWOTH)) + cp = ".rhosts writeable by other than owner"; + /* If there were any problems, quit. */ + if (cp) { + __rcmd_errstr = (char *) cp; + fclose(hostf); + return(-1); + } + goto again; + } + return (-1); +} + +int +ruserok(rhost, superuser, ruser, luser) + const char *rhost; + int superuser; + const char *ruser; + const char *luser; +{ + struct hostent *hp; + u_long addr; + char **ap; + + if ((hp = cygwin_gethostbyname(rhost)) == NULL) + return (-1); + for (ap = hp->h_addr_list; *ap; ++ap) { + bcopy(*ap, &addr, sizeof(addr)); + if (iruserok(addr, superuser, ruser, luser) == 0) + return (0); + } + return (-1); } diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 0880c3f72..a6a2b1bc7 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -2919,7 +2919,7 @@ long gethostid(void) #define ETC_SHELLS "/etc/shells" static int shell_index; -static FILE *shell_fp; +static struct __sFILE64 *shell_fp; extern "C" char * getusershell () @@ -2938,7 +2938,7 @@ getusershell () static char buf[MAX_PATH]; int ch, buf_idx; - if (!shell_fp && !(shell_fp = fopen (ETC_SHELLS, "rt"))) + if (!shell_fp && !(shell_fp = fopen64 (ETC_SHELLS, "rt"))) { if (def_shells[shell_index]) return strcpy (buf, def_shells[shell_index++]); diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h index 68a386c7c..83db260ab 100644 --- a/winsup/cygwin/winsup.h +++ b/winsup/cygwin/winsup.h @@ -37,14 +37,20 @@ details. */ #include #include +/* Declarations for functions used in C and C++ code. */ #ifdef __cplusplus extern "C" { #endif extern __uid32_t getuid32 (void); extern __uid32_t geteuid32 (void); +extern int seteuid32 (__uid32_t); extern __gid32_t getegid32 (void); extern struct passwd *getpwuid32 (__uid32_t); -struct passwd *getpwnam (const char *); +extern struct passwd *getpwnam (const char *); +extern struct __sFILE64 *fopen64 (const char *, const char *); +extern struct hostent *cygwin_gethostbyname (const char *name); +extern unsigned long cygwin_inet_addr (const char *cp); + #ifdef __cplusplus } #endif -- 2.43.5