From: Jarkko Hietaniemi Date: Tue, 26 Oct 1999 13:40:18 +0000 (+0000) Subject: Revert #4457 for more investigation. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=e688b2318033d7cc179bac591999729a37bf7138;p=p5sagit%2Fp5-mst-13.2.git Revert #4457 for more investigation. p4raw-id: //depot/cfgperl@4460 --- diff --git a/Configure b/Configure index 9f5ee16..659daef 100755 --- a/Configure +++ b/Configure @@ -20,7 +20,7 @@ # $Id: Head.U,v 3.0.1.9 1997/02/28 15:02:09 ram Exp $ # -# Generated on Tue Oct 26 13:10:37 EET DST 1999 [metaconfig 3.0 PL70] +# Generated on Tue Oct 26 16:44:39 EET DST 1999 [metaconfig 3.0 PL70] # (with additional metaconfig patches by perlbug@perl.com) cat >/tmp/c1$$ <config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un- */ #$d_ftello HAS_FTELLO /**/ -/* HAS_GETMNT: - * This symbol, if defined, indicates that the getmnt routine is - * available to get filesystem mount info by filename. - */ -#$d_getmnt HAS_GETMNT /**/ - /* HAS_GETMNTENT: * This symbol, if defined, indicates that the getmntent routine is * available to iterate through mounted file systems to get their info. diff --git a/embed.h b/embed.h index 4dac84c..bf2a0e8 100644 --- a/embed.h +++ b/embed.h @@ -841,7 +841,7 @@ #define usage S_usage #define validate_suid S_validate_suid # if defined(IAMSUID) -#define file_on_nosuid_fs S_file_on_nosuid_fs +#define fd_on_nosuid_fs S_fd_on_nosuid_fs # endif #define parse_body S_parse_body #define run_body S_run_body @@ -2193,7 +2193,7 @@ #define usage(a) S_usage(aTHX_ a) #define validate_suid(a,b,c) S_validate_suid(aTHX_ a,b,c) # if defined(IAMSUID) -#define file_on_nosuid_fs(a,b) S_file_on_nosuid_fs(aTHX_ a,b) +#define fd_on_nosuid_fs(a) S_fd_on_nosuid_fs(aTHX_ a) # endif #define parse_body(a) S_parse_body(aTHX_ a) #define run_body(a) S_run_body(aTHX_ a) @@ -4307,8 +4307,8 @@ #define S_validate_suid CPerlObj::S_validate_suid #define validate_suid S_validate_suid # if defined(IAMSUID) -#define S_file_on_nosuid_fs CPerlObj::S_file_on_nosuid_fs -#define file_on_nosuid_fs S_file_on_nosuid_fs +#define S_fd_on_nosuid_fs CPerlObj::S_fd_on_nosuid_fs +#define fd_on_nosuid_fs S_fd_on_nosuid_fs # endif #define S_parse_body CPerlObj::S_parse_body #define parse_body S_parse_body diff --git a/embed.pl b/embed.pl index 280de29..d2b0bb2 100755 --- a/embed.pl +++ b/embed.pl @@ -1860,7 +1860,7 @@ s |void |open_script |char *|bool|SV *|int *fd s |void |usage |char * s |void |validate_suid |char *|char*|int # if defined(IAMSUID) -s |int |file_on_nosuid_fs|int fd|char *path +s |int |fd_on_nosuid_fs|int fd # endif s |void* |parse_body |va_list args s |void* |run_body |va_list args diff --git a/perl.c b/perl.c index 67c2ccc..4fb1771 100644 --- a/perl.c +++ b/perl.c @@ -2178,17 +2178,15 @@ sed %s -e \"/^[^#]/b\" \ #ifdef IAMSUID STATIC int -S_file_on_nosuid_fs(pTHX_ int fd, char *path) +S_fd_on_nosuid_fs(pTHX_ int fd) { int on_nosuid = 0; int check_okay = 0; /* - * Preferred order: fstatvfs(), fstatfs(), getmnt(), getmntent(). - * fstatvfs() is UNIX98 and uses the fd. - * fstatfs() is BSD 4.3+ and uses the fd. - * getmnt() is BSD 4.2 (4.1?) and uses the path. - * getmntent() is O(number-of-mounted-filesystems) and - * uses neither fd nor path and can hang. + * Preferred order: fstatvfs(), fstatfs(), getmntent(). + * fstatvfs() is UNIX98. + * fstatfs() is BSD. + * getmntent() is O(number-of-mounted-filesystems) and can hang. */ # ifdef HAS_FSTATVFS @@ -2196,18 +2194,22 @@ S_file_on_nosuid_fs(pTHX_ int fd, char *path) check_okay = fstatvfs(fd, &stfs) == 0; on_nosuid = check_okay && (stfs.f_flag & ST_NOSUID); # else -# ifdef PERL_MOUNT_NOSUID -# if defined(HAS_FSTATFS) && defined(HAS_STRUCT_STATFS_FLAGS) - struct statfs stfs; +# if defined(HAS_FSTATFS) && defined(HAS_STRUCT_STATFS_FLAGS) + struct statfs stfs; check_okay = fstatfs(fd, &stfs) == 0; +# undef PERL_MOUNT_NOSUID +# if !defined(PERL_MOUNT_NOSUID) && defined(MNT_NOSUID) +# define PERL_MOUNT_NOSUID MNT_NOSUID +# endif +# if !defined(PERL_MOUNT_NOSUID) && defined(MS_NOSUID) +# define PERL_MOUNT_NOSUID MS_NOSUID +# endif +# if !defined(PERL_MOUNT_NOSUID) && defined(M_NOSUID) +# define PERL_MOUNT_NOSUID M_NOSUID +# endif +# ifdef PERL_MOUNT_NOSUID on_nosuid = check_okay && (stfs.f_flags & PERL_MOUNT_NOSUID); -# else -# ifdef HAS_GETMNT - struct fs_data fsd; - check_okay = getmnt(0, &fsd, 0, NOSTAT_ONE, path) == 1; - on_nosuid = check_okay && (fsd.fd_req.flags & PERL_MOUNT_NOSUID); -# endif /* getmnt */ -# endif /* fstatfs */ +# endif # else # if defined(HAS_GETMNTENT) && defined(HAS_HASMNTOPT) && defined(MNTOPT_NOSUID) FILE *mtab = fopen("/etc/mtab", "r"); @@ -2215,24 +2217,25 @@ S_file_on_nosuid_fs(pTHX_ int fd, char *path) struct stat stb, fsb; if (mtab && (fstat(fd, &stb) == 0)) { - while ((entry = getmntent(mtab))) { - if (stat(entry->mnt_dir, &fsb) == 0 && fsb.st_dev == stb.st_dev) + while (entry = getmntent(mtab)) { + if (stat(entry->mnt_dir, &fsb) == 0 + && fsb.st_dev == stb.st_dev) { /* found the filesystem */ check_okay = 1; if (hasmntopt(entry, MNTOPT_NOSUID)) on_nosuid = 1; break; - } /* A single fs may well fail its stat(). Or hang :-( */ + } /* A single fs may well fail its stat(). */ } } if (mtab) fclose(mtab); -# endif /* getmntent */ -# endif /* PERL_MOUNT_NOSUID: fstatfs() or getmnt() */ -# endif /* fstatvfs */ +# endif /* mntent */ +# endif /* statfs */ +# endif /* statvfs */ if (!check_okay) - Perl_croak(aTHX_ "Can't check filesystem of script \"%s\" for nosuid", PL_origfilename); + Perl_croak(aTHX_ "Can't check filesystem of script \"%s\"", PL_origfilename); return on_nosuid; } #endif /* IAMSUID */ @@ -2306,7 +2309,7 @@ S_validate_suid(pTHX_ char *validarg, char *scriptname, int fdscript) if (PerlLIO_stat(SvPVX(GvSV(PL_curcop->cop_filegv)),&tmpstatbuf) < 0) Perl_croak(aTHX_ "Permission denied"); /* testing full pathname here */ #if defined(IAMSUID) && !defined(NO_NOSUID_CHECK) - if (file_on_nosuid_fs(PerlIO_fileno(PL_rsfp), scriptname)) + if (fd_on_nosuid_fs(PerlIO_fileno(PL_rsfp))) Perl_croak(aTHX_ "Permission denied"); #endif if (tmpstatbuf.st_dev != PL_statbuf.st_dev || diff --git a/perl.h b/perl.h index e8d0cc9..501c635 100644 --- a/perl.h +++ b/perl.h @@ -3202,23 +3202,12 @@ typedef struct am_table_short AMTS; # include /* for f?statvfs() */ #endif #ifdef I_SYS_MOUNT -# include /* for *BSD f?statfs() or getmnt() */ +# include /* for *BSD f?statfs() */ #endif #ifdef I_MNTENT # include /* for getmntent() */ #endif -#undef PERL_MOUNT_NOSUID -#if !defined(PERL_MOUNT_NOSUID) && defined(MNT_NOSUID) -# define PERL_MOUNT_NOSUID MNT_NOSUID -#endif -#if !defined(PERL_MOUNT_NOSUID) && defined(MS_NOSUID) -# define PERL_MOUNT_NOSUID MS_NOSUID -#endif -#if !defined(PERL_MOUNT_NOSUID) && defined(M_NOSUID) -# define PERL_MOUNT_NOSUID M_NOSUID -#endif - #endif /* IAMSUID */ /* and finally... */ diff --git a/pod/perldiag.pod b/pod/perldiag.pod index 3c0a212..5b1c324 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -636,11 +636,9 @@ Something like this will reproduce the error: (F) You called C, but C is not a directory that you can chdir to, possibly because it doesn't exist. -=item Can't check filesystem of script "%s" for nosuid +=item Can't check filesystem of script "%s" -(P) For some reason you can't check the filesystem of the script for nosuid -(whether the filesystem has been mounted to disallow the execution of suid -(and sgid) programs) +(P) For some reason you can't check the filesystem of the script for nosuid. =item Can't coerce %s to integer in %s diff --git a/proto.h b/proto.h index 1cd7980..627dfd4 100644 --- a/proto.h +++ b/proto.h @@ -817,7 +817,7 @@ STATIC void S_open_script(pTHX_ char *, bool, SV *, int *fd); STATIC void S_usage(pTHX_ char *); STATIC void S_validate_suid(pTHX_ char *, char*, int); # if defined(IAMSUID) -STATIC int S_file_on_nosuid_fs(pTHX_ int fd, char *path); +STATIC int S_fd_on_nosuid_fs(pTHX_ int fd); # endif STATIC void* S_parse_body(pTHX_ va_list args); STATIC void* S_run_body(pTHX_ va_list args);