diff options
-rw-r--r-- | src/mknod.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/mknod.c b/src/mknod.c index c17b9fdda..19167fa41 100644 --- a/src/mknod.c +++ b/src/mknod.c @@ -117,10 +117,10 @@ main (int argc, char **argv) } } - newmode = ((S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) - & ~ umask (0)); + newmode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (symbolic_mode) { + newmode &= ~ umask (0); change = mode_compile (symbolic_mode, 0); if (change == MODE_INVALID) error (1, 0, _("invalid mode")); @@ -223,5 +223,16 @@ major and minor device numbers may not be specified for fifo files")); usage (1); } + /* Perform an explicit chmod to ensure the file mode permission bits + are set as specified. This extra step is necessary in some cases + when the containing directory has a default ACL. */ + + if (symbolic_mode) + { + if (chmod (argv[optind], newmode)) + error (0, errno, _("cannot set permissions of `%s'"), + quote (argv[optind])); + } + exit (0); } |