diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-08-17 10:15:55 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-08-17 10:15:55 +0000 |
commit | 79b82a874964b343179a5e7d6d947a828b5dcb0c (patch) | |
tree | d504c8b338a763a30de47003df0f586de4814d50 /file.c | |
parent | 5d863ccbac17982907a1867bb6b0afa05be3ccaa (diff) | |
download | ruby-79b82a874964b343179a5e7d6d947a828b5dcb0c.tar.gz |
* file.c (rb_stat_[rRwWxX]): check for super user.
fixed: [ruby-core:08616]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'file.c')
-rw-r--r-- | file.c | 28 |
1 files changed, 27 insertions, 1 deletions
@@ -818,11 +818,15 @@ group_member(GETGROUPS_T gid) # define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH) #endif +#if defined(S_IXGRP) && !defined(_WIN32) && !defined(__CYGWIN__) +#define USE_GETEUID 1 +#endif + #ifndef HAVE_EACCESS int eaccess(const char *path, int mode) { -#if defined(S_IXGRP) && !defined(_WIN32) && !defined(__CYGWIN__) +#ifdef USE_GETEUID struct stat st; int euid; @@ -3655,6 +3659,9 @@ rb_stat_r(VALUE obj) { struct stat *st = get_stat(obj); +#ifdef USE_GETEUID + if (geteuid() == 0) return Qtrue; +#endif #ifdef S_IRUSR if (rb_stat_owned(obj)) return st->st_mode & S_IRUSR ? Qtrue : Qfalse; @@ -3687,6 +3694,9 @@ rb_stat_R(VALUE obj) { struct stat *st = get_stat(obj); +#ifdef USE_GETEUID + if (getuid() == 0) return Qtrue; +#endif #ifdef S_IRUSR if (rb_stat_rowned(obj)) return st->st_mode & S_IRUSR ? Qtrue : Qfalse; @@ -3743,6 +3753,9 @@ rb_stat_w(VALUE obj) { struct stat *st = get_stat(obj); +#ifdef USE_GETEUID + if (geteuid() == 0) return Qtrue; +#endif #ifdef S_IWUSR if (rb_stat_owned(obj)) return st->st_mode & S_IWUSR ? Qtrue : Qfalse; @@ -3773,6 +3786,9 @@ rb_stat_W(VALUE obj) { struct stat *st = get_stat(obj); +#ifdef USE_GETEUID + if (getuid() == 0) return Qtrue; +#endif #ifdef S_IWUSR if (rb_stat_rowned(obj)) return st->st_mode & S_IWUSR ? Qtrue : Qfalse; @@ -3831,6 +3847,11 @@ rb_stat_x(VALUE obj) { struct stat *st = get_stat(obj); +#ifdef USE_GETEUID + if (geteuid() == 0) { + return st->st_mode & S_IXUGO ? Qtrue : Qfalse; + } +#endif #ifdef S_IXUSR if (rb_stat_owned(obj)) return st->st_mode & S_IXUSR ? Qtrue : Qfalse; @@ -3859,6 +3880,11 @@ rb_stat_X(VALUE obj) { struct stat *st = get_stat(obj); +#ifdef USE_GETEUID + if (getuid() == 0) { + return st->st_mode & S_IXUGO ? Qtrue : Qfalse; + } +#endif #ifdef S_IXUSR if (rb_stat_rowned(obj)) return st->st_mode & S_IXUSR ? Qtrue : Qfalse; |