summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2006-07-28 07:25:44 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2006-07-28 07:25:44 +0000
commitfa78395b2a80c96a5cc2459e4ec4da17cd2b8352 (patch)
tree8ccede55a9dea608e41bca84b7cff068cc458dc4 /lib
parentb8bbece57a6759e8206015a22c0438e035d57556 (diff)
downloadcoreutils-fa78395b2a80c96a5cc2459e4ec4da17cd2b8352.tar.xz
(mode_compile): Numeric modes now affect setuid and
setgid on directories only if they set these bits.
Diffstat (limited to 'lib')
-rw-r--r--lib/modechange.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/lib/modechange.c b/lib/modechange.c
index 51684a4eb..80e06710a 100644
--- a/lib/modechange.c
+++ b/lib/modechange.c
@@ -143,12 +143,12 @@ mode_compile (char const *mode_string)
if ('0' <= *mode_string && *mode_string < '8')
{
unsigned int octal_mode = 0;
- unsigned int octal_mentioned = 0;
+ mode_t mode;
+ mode_t mentioned;
do
{
octal_mode = 8 * octal_mode + *mode_string++ - '0';
- octal_mentioned = 8 * octal_mentioned + 7;
if (ALLM < octal_mode)
return NULL;
}
@@ -157,8 +157,9 @@ mode_compile (char const *mode_string)
if (*mode_string)
return NULL;
- return make_node_op_equals (octal_to_mode (octal_mode),
- octal_to_mode (octal_mentioned & ALLM));
+ mode = octal_to_mode (octal_mode);
+ mentioned = (mode & (S_ISUID | S_ISGID)) | S_ISVTX | S_IRWXUGO;
+ return make_node_op_equals (mode, mentioned);
}
/* Allocate enough space to hold the result. */
@@ -299,7 +300,8 @@ mode_create_from_ref (const char *ref_file)
directory if DIR), assuming the umask is UMASK_VALUE, adjusted as
indicated by the list of change operations CHANGES. If DIR, the
type 'X' change affects the returned value even if no execute bits
- were set in OLDMODE. If PMODE_BITS is not null, store into
+ were set in OLDMODE, and set user and group ID bits are preserved
+ unless CHANGES mentioned them. If PMODE_BITS is not null, store into
*PMODE_BITS a mask denoting file mode bits that are affected by
CHANGES.