From: Todd C. Miller Date: Sun, 4 Mar 2018 14:03:41 +0000 (-0700) Subject: Special case comment lines in lbufs. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=670d8e6d77ce327cfbf1f53cc8764652b4cc47d0;p=sudo Special case comment lines in lbufs. --- diff --git a/lib/util/lbuf.c b/lib/util/lbuf.c index b36b8060e..e2d92afb8 100644 --- a/lib/util/lbuf.c +++ b/lib/util/lbuf.c @@ -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++; diff --git a/plugins/sudoers/cvtsudoers.c b/plugins/sudoers/cvtsudoers.c index 2f44df15d..ecb2614d1 100644 --- a/plugins/sudoers/cvtsudoers.c +++ b/plugins/sudoers/cvtsudoers.c @@ -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); diff --git a/plugins/sudoers/fmtsudoers.c b/plugins/sudoers/fmtsudoers.c index edbcdc64a..39372199b 100644 --- a/plugins/sudoers/fmtsudoers.c +++ b/plugins/sudoers/fmtsudoers.c @@ -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); } diff --git a/plugins/sudoers/parse.h b/plugins/sudoers/parse.h index 6a459de26..d17886f77 100644 --- a/plugins/sudoers/parse.h +++ b/plugins/sudoers/parse.h @@ -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 */