]> granicus.if.org Git - sudo/commitdiff
Special case comment lines in lbufs.
authorTodd C. Miller <Todd.Miller@sudo.ws>
Sun, 4 Mar 2018 14:03:41 +0000 (07:03 -0700)
committerTodd C. Miller <Todd.Miller@sudo.ws>
Sun, 4 Mar 2018 14:03:41 +0000 (07:03 -0700)
lib/util/lbuf.c
plugins/sudoers/cvtsudoers.c
plugins/sudoers/fmtsudoers.c
plugins/sudoers/parse.h

index b36b8060eccac862ea0b4a9982eca23b5471fb2e..e2d92afb8f55bce0af4d44a53f493829bd2dbca1 100644 (file)
@@ -195,10 +195,18 @@ static void
 sudo_lbuf_println(struct sudo_lbuf *lbuf, char *line, int len)
 {
     char *cp, save;
-    int i, have, contlen;
+    int i, have, contlen = 0;
+    int indent = lbuf->indent;
+    bool is_comment = false;
     debug_decl(sudo_lbuf_println, SUDO_DEBUG_UTIL)
 
-    contlen = lbuf->continuation ? strlen(lbuf->continuation) : 0;
+    /* Comment lines don't use continuation and only indent is for "# " */
+    if (line[0] == '#' && isblank((unsigned char)line[1])) {
+       is_comment = true;
+       indent = 2;
+    }
+    if (lbuf->continuation != NULL && !is_comment)
+       contlen = strlen(lbuf->continuation);
 
     /*
      * Print the buffer, splitting the line as needed on a word
@@ -218,10 +226,14 @@ sudo_lbuf_println(struct sudo_lbuf *lbuf, char *line, int len)
                need = (int)(ep - cp);
        }
        if (cp != line) {
-           /* indent continued lines */
-           /* XXX - build up string instead? */
-           for (i = 0; i < lbuf->indent; i++)
-               lbuf->output(" ");
+           if (is_comment) {
+               lbuf->output("# ");
+           } else {
+               /* indent continued lines */
+               /* XXX - build up string instead? */
+               for (i = 0; i < indent; i++)
+                   lbuf->output(" ");
+           }
        }
        /* NUL-terminate cp for the output function and restore afterwards */
        save = cp[need];
@@ -235,7 +247,7 @@ sudo_lbuf_println(struct sudo_lbuf *lbuf, char *line, int len)
         * the whitespace, and print a line continuaton char if needed.
         */
        if (cp != NULL) {
-           have = lbuf->cols - lbuf->indent;
+           have = lbuf->cols - indent;
            ep = line + len;
            while (cp < ep && isblank((unsigned char)*cp)) {
                cp++;
index 2f44df15da25602e411f6474567505bffef85d2d..ecb2614d114fd80691d76aa7c5b058a922d388db 100644 (file)
@@ -582,8 +582,8 @@ convert_sudoers_sudoers(const char *output_file, struct cvtsudoers_config *conf)
        }
     }
 
-    /* Print User_Specs */
-    if (!sudoers_format_userspecs(&lbuf, &userspecs, conf->expand_aliases, true))
+    /* Print User_Specs, separated by blank lines. */
+    if (!sudoers_format_userspecs(&lbuf, &userspecs, "\n", conf->expand_aliases, true))
        goto done;
     if (lbuf.len > 1) {
        sudo_lbuf_print(&lbuf);
index edbcdc64ae4ba6b59b9270957fe3937eb557770f..39372199bfbecbec960bee8d5b3e839f5526fb72 100644 (file)
@@ -285,7 +285,7 @@ sudoers_format_userspec(struct sudo_lbuf *lbuf, struct userspec *us,
  */
 bool
 sudoers_format_userspecs(struct sudo_lbuf *lbuf, struct userspec_list *usl,
-    bool expand_aliases, bool flush)
+    const char *sep, bool expand_aliases, bool flush)
 {
     struct userspec *us;
     debug_decl(sudoers_format_userspecs, SUDOERS_DEBUG_UTIL)
@@ -293,6 +293,7 @@ sudoers_format_userspecs(struct sudo_lbuf *lbuf, struct userspec_list *usl,
     TAILQ_FOREACH(us, usl, entries) {
        if (!sudoers_format_userspec(lbuf, us, expand_aliases))
            break;
+       sudo_lbuf_append(lbuf, sep);
        sudo_lbuf_print(lbuf);
     }
 
index 6a459de2641c04c3734ab4c1844584c8eed794ea..d17886f77e551341dacee5cf4b21ca61933c2c46 100644 (file)
@@ -315,6 +315,6 @@ bool sudoers_format_default(struct sudo_lbuf *lbuf, struct defaults *d);
 bool sudoers_format_member(struct sudo_lbuf *lbuf, struct member *m, const char *separator, int alias_type);
 bool sudoers_format_privilege(struct sudo_lbuf *lbuf, struct privilege *priv, bool expand_aliases);
 bool sudoers_format_userspec(struct sudo_lbuf *lbuf, struct userspec *us, bool expand_aliases);
-bool sudoers_format_userspecs(struct sudo_lbuf *lbuf, struct userspec_list *usl, bool expand_aliases, bool flush);
+bool sudoers_format_userspecs(struct sudo_lbuf *lbuf, struct userspec_list *usl, const char *sep, bool expand_aliases, bool flush);
 
 #endif /* SUDOERS_PARSE_H */