[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bug#690839: run-parts: By default the umask is set to 022



Hi,

the attached patch against the 4.3.2 source [1] implements the solution
I've sketched earlier.

On 2012-Nov-11 23:19 (+0000), Clint Adams wrote with possible deletions:
> >   * For the next release, make run-parts issue a warning that it changes
> >     the umask, and that this behavior is going to change in the future.
> >     Suppress the warning if the user sets the umask with -u.
> > 
> >   * For the following release, change run-parts to not tamper with the
> >     umask anymore, and warn about the new situation, unless -u is given.
> > 
> >   * Finally remove the warning.

For the trasition, I introduced the macro RUNPARTS_FIX_UMASK, which can
be set to

    0 - no change
    1 - warn about changing umask to 022         <- start here
    2 - warn about not changing umask anymore
    3 - fixed, please remove unused code

0 is the current version, and when 3 is reached, the macro and the old
code snippets can be removed.

Kind regards,
Stefan

____________________
[1] http://ftp.de.debian.org/debian/pool/main/d/debianutils/debianutils_4.3.2.tar.gz


-- 
Stefan Klinger                                      o/klettern
                                                    /\/  bis zum
send plaintext only - max size 32kB - no spam         \   Abfallen
http://stefan-klinger.de
--- run-parts.old.c	2012-11-12 13:47:22.000000000 +0100
+++ run-parts.new.c	2012-11-12 14:33:05.000000000 +0100
@@ -35,6 +35,22 @@
 #define RUNPARTS_ERE 1
 #define RUNPARTS_LSBSYSINIT 100
 
+/* Transition to fix Bug#690839.  Valid values:
+ *   0 - no change
+ *   1 - warn about changing umask
+ *   2 - warn about not changing umask
+ *   3 - fixed, please remove unused code
+ */
+#define RUNPARTS_FIX_UMASK 1
+
+#if RUNPARTS_FIX_UMASK == 1
+char const * warn_umask =
+     "Changing umask to 022.  Try `run-parts --help' for more information.";
+#elif RUNPARTS_FIX_UMASK == 2
+char const * warn_umask =
+     "Leaving umask unchanged.  Try `run-parts --help' for more information.";
+#endif
+
 int test_mode = 0;
 int list_mode = 0;
 int verbose_mode = 0;
@@ -98,7 +114,21 @@ void usage()
 	  "      --lsbsysinit    validate filenames based on LSB sysinit specs.\n"
 	  "      --new-session   run each script in a separate process session\n"
 	  "      --regex=PATTERN validate filenames based on POSIX ERE pattern PATTERN.\n"
+#if RUNPARTS_FIX_UMASK == 0
 	  "  -u, --umask=UMASK   sets umask to UMASK (octal), default is 022.\n"
+#elif RUNPARTS_FIX_UMASK == 1
+	  "  -u, --umask=UMASK   sets umask to UMASK (octal), default is 022.  Future\n"
+          "                      versions of run-parts will not change the umask\n"
+          "                      implicitly anymore.  Use -u022 to retain the current\n"
+          "                      behavior.\n"
+#elif RUNPARTS_FIX_UMASK == 2
+	  "  -u, --umask=UMASK   sets umask to UMASK (octal).  By default, and diverging\n"
+          "                      from historical behavior, the umask is not changed\n"
+          "                      implicitly to 022 anymore.\n"
+#elif RUNPARTS_FIX_UMASK == 3
+	  "  -u, --umask=UMASK   sets umask to UMASK (octal).  If omitted, the umask is\n"
+          "                      left unchanged.\n"
+#endif
 	  "  -a, --arg=ARGUMENT  pass ARGUMENT to scripts, use once for each argument.\n"
 	  "  -V, --version       output version information and exit.\n"
 	  "  -h, --help          display this help and exit.\n");
@@ -468,7 +498,9 @@ void run_parts(char *dirname)
 int main(int argc, char *argv[])
 {
   custom_ere = NULL;
+#if RUNPARTS_FIX_UMASK < 2
   umask(022);
+#endif
   add_argument(0);
 
   for (;;) {
@@ -503,6 +535,9 @@ int main(int argc, char *argv[])
       break;
     case 'u':
       set_umask();
+#if RUNPARTS_FIX_UMASK > 0  && RUNPARTS_FIX_UMASK < 3
+      warn_umask = 0;
+#endif
       break;
     case 'a':
       add_argument(optarg);
@@ -522,6 +557,10 @@ int main(int argc, char *argv[])
     }
   }
 
+#if RUNPARTS_FIX_UMASK > 0  && RUNPARTS_FIX_UMASK < 3
+  if (warn_umask) fprintf(stderr, "%s\n", warn_umask);
+#endif
+      
   /* We require exactly one argument: the directory name */
   if (optind != (argc - 1)) {
     error("missing operand");

Reply to: