2
0
mirror of https://github.com/sudo-project/sudo.git synced 2025-08-22 09:57:41 +00:00

Move reference-counted string code from sudoers to libsudo_util.

It will be used by sudo_logsrvd too.
This commit is contained in:
Todd C. Miller 2021-04-06 14:44:19 -06:00
parent b1c4de2088
commit 2db9e64214
18 changed files with 106 additions and 112 deletions

View File

@ -227,6 +227,7 @@ lib/util/pread.c
lib/util/progname.c lib/util/progname.c
lib/util/pw_dup.c lib/util/pw_dup.c
lib/util/pwrite.c lib/util/pwrite.c
lib/util/rcstr.c
lib/util/reallocarray.c lib/util/reallocarray.c
lib/util/regress/corpus/seed/sudo_conf/sudo.conf.1 lib/util/regress/corpus/seed/sudo_conf/sudo.conf.1
lib/util/regress/corpus/seed/sudo_conf/sudo.conf.2 lib/util/regress/corpus/seed/sudo_conf/sudo.conf.2
@ -657,7 +658,6 @@ plugins/sudoers/prompt.c
plugins/sudoers/pwutil.c plugins/sudoers/pwutil.c
plugins/sudoers/pwutil.h plugins/sudoers/pwutil.h
plugins/sudoers/pwutil_impl.c plugins/sudoers/pwutil_impl.c
plugins/sudoers/rcstr.c
plugins/sudoers/redblack.c plugins/sudoers/redblack.c
plugins/sudoers/redblack.h plugins/sudoers/redblack.h
plugins/sudoers/regress/check_symbols/check_symbols.c plugins/sudoers/regress/check_symbols/check_symbols.c

View File

@ -250,6 +250,12 @@ sudo_dso_public ssize_t sudo_parseln_v2(char **buf, size_t *bufsize, unsigned in
sudo_dso_public void initprogname(const char *); sudo_dso_public void initprogname(const char *);
sudo_dso_public void initprogname2(const char *, const char * const *); sudo_dso_public void initprogname2(const char *, const char * const *);
/* rcstr.c */
sudo_dso_public char *sudo_rcstr_dup(const char *src);
sudo_dso_public char *sudo_rcstr_alloc(size_t len);
sudo_dso_public char *sudo_rcstr_addref(const char *s);
sudo_dso_public void sudo_rcstr_delref(const char *s);
/* roundup.c */ /* roundup.c */
sudo_dso_public unsigned int sudo_pow2_roundup_v1(unsigned int len); sudo_dso_public unsigned int sudo_pow2_roundup_v1(unsigned int len);
#define sudo_pow2_roundup(_a) sudo_pow2_roundup_v1((_a)) #define sudo_pow2_roundup(_a) sudo_pow2_roundup_v1((_a))

View File

@ -132,7 +132,7 @@ SHELL = @SHELL@
LTOBJS = basename.lo @DIGEST@ event.lo fatal.lo key_val.lo gethostname.lo \ LTOBJS = basename.lo @DIGEST@ event.lo fatal.lo key_val.lo gethostname.lo \
gettime.lo getgrouplist.lo gidlist.lo json.lo lbuf.lo locking.lo \ gettime.lo getgrouplist.lo gidlist.lo json.lo lbuf.lo locking.lo \
logfac.lo logpri.lo mkdir_parents.lo parseln.lo progname.lo \ logfac.lo logpri.lo mkdir_parents.lo parseln.lo progname.lo rcstr.lo \
roundup.lo secure_path.lo setgroups.lo strsplit.lo strtobool.lo \ roundup.lo secure_path.lo setgroups.lo strsplit.lo strtobool.lo \
strtoid.lo strtomode.lo strtonum.lo sudo_conf.lo \ strtoid.lo strtomode.lo strtonum.lo sudo_conf.lo \
sudo_debug.lo sudo_dso.lo term.lo ttyname_dev.lo \ sudo_debug.lo sudo_dso.lo term.lo ttyname_dev.lo \
@ -1125,6 +1125,14 @@ pwrite.i: $(srcdir)/pwrite.c $(incdir)/sudo_compat.h $(top_builddir)/config.h
$(CC) -E -o $@ $(CPPFLAGS) $< $(CC) -E -o $@ $(CPPFLAGS) $<
pwrite.plog: pwrite.i pwrite.plog: pwrite.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/pwrite.c --i-file $< --output-file $@ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/pwrite.c --i-file $< --output-file $@
rcstr.lo: $(srcdir)/rcstr.c $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
$(incdir)/sudo_util.h $(top_builddir)/config.h
$(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/rcstr.c
rcstr.i: $(srcdir)/rcstr.c $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
$(incdir)/sudo_util.h $(top_builddir)/config.h
$(CC) -E -o $@ $(CPPFLAGS) $<
rcstr.plog: rcstr.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/rcstr.c --i-file $< --output-file $@
reallocarray.lo: $(srcdir)/reallocarray.c $(incdir)/sudo_compat.h \ reallocarray.lo: $(srcdir)/reallocarray.c $(incdir)/sudo_compat.h \
$(top_builddir)/config.h $(top_builddir)/config.h
$(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/reallocarray.c $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/reallocarray.c

View File

@ -27,7 +27,9 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "sudoers.h" #include "sudo_compat.h"
#include "sudo_debug.h"
#include "sudo_util.h"
/* Trivial reference-counted strings. */ /* Trivial reference-counted strings. */
struct rcstr { struct rcstr {
@ -40,23 +42,23 @@ struct rcstr {
* Returns the newly-created string with a refcnt of 1. * Returns the newly-created string with a refcnt of 1.
*/ */
char * char *
rcstr_dup(const char *src) sudo_rcstr_dup(const char *src)
{ {
size_t len = strlen(src); size_t len = strlen(src);
char *dst; char *dst;
debug_decl(rcstr_dup, SUDOERS_DEBUG_UTIL); debug_decl(sudo_rcstr_dup, SUDO_DEBUG_UTIL);
dst = rcstr_alloc(len); dst = sudo_rcstr_alloc(len);
memcpy(dst, src, len); memcpy(dst, src, len);
dst[len] = '\0'; dst[len] = '\0';
debug_return_ptr(dst); debug_return_ptr(dst);
} }
char * char *
rcstr_alloc(size_t len) sudo_rcstr_alloc(size_t len)
{ {
struct rcstr *rcs; struct rcstr *rcs;
debug_decl(rcstr_dup, SUDOERS_DEBUG_UTIL); debug_decl(sudo_rcstr_dup, SUDO_DEBUG_UTIL);
/* Note: sizeof(struct rcstr) includes space for the NUL */ /* Note: sizeof(struct rcstr) includes space for the NUL */
rcs = malloc(sizeof(struct rcstr) + len); rcs = malloc(sizeof(struct rcstr) + len);
@ -70,10 +72,10 @@ rcstr_alloc(size_t len)
} }
char * char *
rcstr_addref(const char *s) sudo_rcstr_addref(const char *s)
{ {
struct rcstr *rcs; struct rcstr *rcs;
debug_decl(rcstr_dup, SUDOERS_DEBUG_UTIL); debug_decl(sudo_rcstr_dup, SUDO_DEBUG_UTIL);
if (s == NULL) if (s == NULL)
debug_return_ptr(NULL); debug_return_ptr(NULL);
@ -84,10 +86,10 @@ rcstr_addref(const char *s)
} }
void void
rcstr_delref(const char *s) sudo_rcstr_delref(const char *s)
{ {
struct rcstr *rcs; struct rcstr *rcs;
debug_decl(rcstr_dup, SUDOERS_DEBUG_UTIL); debug_decl(sudo_rcstr_dup, SUDO_DEBUG_UTIL);
if (s != NULL) { if (s != NULL) {
rcs = __containerof((const void *)s, struct rcstr, str); rcs = __containerof((const void *)s, struct rcstr, str);

View File

@ -113,6 +113,10 @@ sudo_parse_gids_v1
sudo_parseln_v1 sudo_parseln_v1
sudo_parseln_v2 sudo_parseln_v2
sudo_pow2_roundup_v1 sudo_pow2_roundup_v1
sudo_rcstr_addref
sudo_rcstr_alloc
sudo_rcstr_delref
sudo_rcstr_dup
sudo_secure_dir_v1 sudo_secure_dir_v1
sudo_secure_file_v1 sudo_secure_file_v1
sudo_setgroups_v1 sudo_setgroups_v1

View File

@ -173,7 +173,7 @@ AUTH_OBJS = sudo_auth.lo @AUTH_OBJS@
LIBPARSESUDOERS_OBJS = alias.lo b64_decode.lo defaults.lo digestname.lo \ LIBPARSESUDOERS_OBJS = alias.lo b64_decode.lo defaults.lo digestname.lo \
exptilde.lo filedigest.lo gentime.lo gmtoff.lo gram.lo \ exptilde.lo filedigest.lo gentime.lo gmtoff.lo gram.lo \
hexchar.lo match.lo match_addr.lo match_command.lo \ hexchar.lo match.lo match_addr.lo match_command.lo \
match_digest.lo pwutil.lo pwutil_impl.lo rcstr.lo \ match_digest.lo pwutil.lo pwutil_impl.lo \
redblack.lo strlist.lo sudoers_debug.lo timeout.lo \ redblack.lo strlist.lo sudoers_debug.lo timeout.lo \
timestr.lo toke.lo toke_util.lo timestr.lo toke.lo toke_util.lo
@ -2512,26 +2512,6 @@ pwutil_impl.i: $(srcdir)/pwutil_impl.c $(devdir)/def_data.h \
$(CC) -E -o $@ $(CPPFLAGS) $< $(CC) -E -o $@ $(CPPFLAGS) $<
pwutil_impl.plog: pwutil_impl.i pwutil_impl.plog: pwutil_impl.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/pwutil_impl.c --i-file $< --output-file $@ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/pwutil_impl.c --i-file $< --output-file $@
rcstr.lo: $(srcdir)/rcstr.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \
$(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \
$(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
$(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \
$(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \
$(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \
$(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \
$(top_builddir)/config.h $(top_builddir)/pathnames.h
$(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/rcstr.c
rcstr.i: $(srcdir)/rcstr.c $(devdir)/def_data.h $(incdir)/compat/stdbool.h \
$(incdir)/sudo_compat.h $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \
$(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
$(incdir)/sudo_gettext.h $(incdir)/sudo_plugin.h \
$(incdir)/sudo_queue.h $(incdir)/sudo_util.h $(srcdir)/defaults.h \
$(srcdir)/logging.h $(srcdir)/parse.h $(srcdir)/sudo_nss.h \
$(srcdir)/sudoers.h $(srcdir)/sudoers_debug.h \
$(top_builddir)/config.h $(top_builddir)/pathnames.h
$(CC) -E -o $@ $(CPPFLAGS) $<
rcstr.plog: rcstr.i
rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/rcstr.c --i-file $< --output-file $@
redblack.lo: $(srcdir)/redblack.c $(devdir)/def_data.h \ redblack.lo: $(srcdir)/redblack.c $(devdir)/def_data.h \
$(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
$(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \ $(incdir)/sudo_conf.h $(incdir)/sudo_debug.h \

View File

@ -146,7 +146,7 @@ alias_add(struct sudoers_parse_tree *parse_tree, char *name, int type,
* since it modifies "file" (adds a ref) and "members" (tailq conversion). * since it modifies "file" (adds a ref) and "members" (tailq conversion).
*/ */
/* a->used = false; */ /* a->used = false; */
a->file = rcstr_addref(file); a->file = sudo_rcstr_addref(file);
a->line = line; a->line = line;
a->column = column; a->column = column;
HLTQ_TO_TAILQ(&a->members, members, entries); HLTQ_TO_TAILQ(&a->members, members, entries);
@ -215,7 +215,7 @@ alias_free(void *v)
if (a != NULL) { if (a != NULL) {
free(a->name); free(a->name);
rcstr_delref(a->file); sudo_rcstr_delref(a->file);
free_members(&a->members); free_members(&a->members);
free(a); free(a);
} }

View File

@ -64,7 +64,7 @@ check_alias(struct sudoers_parse_tree *parse_tree, char *name, int type,
} }
fputc('\n', stderr); fputc('\n', stderr);
if (strict && errorfile == NULL) { if (strict && errorfile == NULL) {
errorfile = rcstr_addref(file); errorfile = sudo_rcstr_addref(file);
errorlineno = line; errorlineno = line;
} }
} }

View File

@ -641,8 +641,8 @@ parse_sudoers(const char *input_file, struct cvtsudoers_config *conf)
if (sudoersparse() && !parse_error) { if (sudoersparse() && !parse_error) {
sudo_warnx(U_("failed to parse %s file, unknown error"), input_file); sudo_warnx(U_("failed to parse %s file, unknown error"), input_file);
parse_error = true; parse_error = true;
rcstr_delref(errorfile); sudo_rcstr_delref(errorfile);
if ((errorfile = rcstr_dup(input_file)) == NULL) if ((errorfile = sudo_rcstr_dup(input_file)) == NULL)
sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
} }
if (parse_error) { if (parse_error) {

View File

@ -3306,8 +3306,8 @@ sudoerserrorf(const char *fmt, ...)
/* Save the line the first error occurred on. */ /* Save the line the first error occurred on. */
if (errorlineno == -1) { if (errorlineno == -1) {
errorlineno = this_lineno; errorlineno = this_lineno;
rcstr_delref(errorfile); sudo_rcstr_delref(errorfile);
errorfile = rcstr_addref(sudoers); errorfile = sudo_rcstr_addref(sudoers);
} }
if (sudoers_warnings && fmt != NULL) { if (sudoers_warnings && fmt != NULL) {
LEXTRACE("<*> "); LEXTRACE("<*> ");
@ -3401,7 +3401,7 @@ new_default(char *var, char *val, short op)
/* d->binding = NULL */ /* d->binding = NULL */
d->line = this_lineno; d->line = this_lineno;
d->column = sudolinebuf.toke_start + 1; d->column = sudolinebuf.toke_start + 1;
d->file = rcstr_addref(sudoers); d->file = sudo_rcstr_addref(sudoers);
HLTQ_INIT(d, entries); HLTQ_INIT(d, entries);
debug_return_ptr(d); debug_return_ptr(d);
@ -3533,7 +3533,7 @@ add_userspec(struct member *members, struct privilege *privs)
} }
u->line = this_lineno; u->line = this_lineno;
u->column = sudolinebuf.toke_start + 1; u->column = sudolinebuf.toke_start + 1;
u->file = rcstr_addref(sudoers); u->file = sudo_rcstr_addref(sudoers);
parser_leak_remove(LEAK_MEMBER, members); parser_leak_remove(LEAK_MEMBER, members);
HLTQ_TO_TAILQ(&u->users, members, entries); HLTQ_TO_TAILQ(&u->users, members, entries);
parser_leak_remove(LEAK_PRIVILEGE, privs); parser_leak_remove(LEAK_PRIVILEGE, privs);
@ -3613,7 +3613,7 @@ free_default(struct defaults *def, struct member_list **binding)
free(def->binding); free(def->binding);
} }
} }
rcstr_delref(def->file); sudo_rcstr_delref(def->file);
free(def->var); free(def->var);
free(def->val); free(def->val);
free(def); free(def);
@ -3737,7 +3737,7 @@ free_userspec(struct userspec *us)
free(comment->str); free(comment->str);
free(comment); free(comment);
} }
rcstr_delref(us->file); sudo_rcstr_delref(us->file);
free(us); free(us);
debug_return; debug_return;
@ -3795,9 +3795,9 @@ init_parser(const char *path, bool quiet, bool strict)
parser_leak_init(); parser_leak_init();
init_lexer(); init_lexer();
rcstr_delref(sudoers); sudo_rcstr_delref(sudoers);
if (path != NULL) { if (path != NULL) {
if ((sudoers = rcstr_dup(path)) == NULL) { if ((sudoers = sudo_rcstr_dup(path)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
ret = false; ret = false;
} }
@ -3807,7 +3807,7 @@ init_parser(const char *path, bool quiet, bool strict)
parse_error = false; parse_error = false;
errorlineno = -1; errorlineno = -1;
rcstr_delref(errorfile); sudo_rcstr_delref(errorfile);
errorfile = NULL; errorfile = NULL;
sudoers_warnings = !quiet; sudoers_warnings = !quiet;
sudoers_strict = strict; sudoers_strict = strict;

View File

@ -1155,8 +1155,8 @@ sudoerserrorf(const char *fmt, ...)
/* Save the line the first error occurred on. */ /* Save the line the first error occurred on. */
if (errorlineno == -1) { if (errorlineno == -1) {
errorlineno = this_lineno; errorlineno = this_lineno;
rcstr_delref(errorfile); sudo_rcstr_delref(errorfile);
errorfile = rcstr_addref(sudoers); errorfile = sudo_rcstr_addref(sudoers);
} }
if (sudoers_warnings && fmt != NULL) { if (sudoers_warnings && fmt != NULL) {
LEXTRACE("<*> "); LEXTRACE("<*> ");
@ -1250,7 +1250,7 @@ new_default(char *var, char *val, short op)
/* d->binding = NULL */ /* d->binding = NULL */
d->line = this_lineno; d->line = this_lineno;
d->column = sudolinebuf.toke_start + 1; d->column = sudolinebuf.toke_start + 1;
d->file = rcstr_addref(sudoers); d->file = sudo_rcstr_addref(sudoers);
HLTQ_INIT(d, entries); HLTQ_INIT(d, entries);
debug_return_ptr(d); debug_return_ptr(d);
@ -1382,7 +1382,7 @@ add_userspec(struct member *members, struct privilege *privs)
} }
u->line = this_lineno; u->line = this_lineno;
u->column = sudolinebuf.toke_start + 1; u->column = sudolinebuf.toke_start + 1;
u->file = rcstr_addref(sudoers); u->file = sudo_rcstr_addref(sudoers);
parser_leak_remove(LEAK_MEMBER, members); parser_leak_remove(LEAK_MEMBER, members);
HLTQ_TO_TAILQ(&u->users, members, entries); HLTQ_TO_TAILQ(&u->users, members, entries);
parser_leak_remove(LEAK_PRIVILEGE, privs); parser_leak_remove(LEAK_PRIVILEGE, privs);
@ -1462,7 +1462,7 @@ free_default(struct defaults *def, struct member_list **binding)
free(def->binding); free(def->binding);
} }
} }
rcstr_delref(def->file); sudo_rcstr_delref(def->file);
free(def->var); free(def->var);
free(def->val); free(def->val);
free(def); free(def);
@ -1586,7 +1586,7 @@ free_userspec(struct userspec *us)
free(comment->str); free(comment->str);
free(comment); free(comment);
} }
rcstr_delref(us->file); sudo_rcstr_delref(us->file);
free(us); free(us);
debug_return; debug_return;
@ -1644,9 +1644,9 @@ init_parser(const char *path, bool quiet, bool strict)
parser_leak_init(); parser_leak_init();
init_lexer(); init_lexer();
rcstr_delref(sudoers); sudo_rcstr_delref(sudoers);
if (path != NULL) { if (path != NULL) {
if ((sudoers = rcstr_dup(path)) == NULL) { if ((sudoers = sudo_rcstr_dup(path)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
ret = false; ret = false;
} }
@ -1656,7 +1656,7 @@ init_parser(const char *path, bool quiet, bool strict)
parse_error = false; parse_error = false;
errorlineno = -1; errorlineno = -1;
rcstr_delref(errorfile); sudo_rcstr_delref(errorfile);
errorfile = NULL; errorfile = NULL;
sudoers_warnings = !quiet; sudoers_warnings = !quiet;
sudoers_strict = strict; sudoers_strict = strict;

View File

@ -437,7 +437,7 @@ sudo_ldap_parse_options(LDAP *ld, LDAPMessage *entry, struct defaults_list *defs
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
goto done; goto done;
} }
if ((source = rcstr_dup(cp)) == NULL) { if ((source = sudo_rcstr_dup(cp)) == NULL) {
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
free(cp); free(cp);
goto done; goto done;
@ -458,7 +458,7 @@ sudo_ldap_parse_options(LDAP *ld, LDAPMessage *entry, struct defaults_list *defs
ret = true; ret = true;
done: done:
rcstr_delref(source); sudo_rcstr_delref(source);
if (cn) if (cn)
ldap_memfree(cn); ldap_memfree(cn);
ldap_value_free_len(bv); ldap_value_free_len(bv);
@ -1251,7 +1251,7 @@ ldap_to_sudoers(LDAP *ld, struct ldap_result *lres,
/* We only have a single userspec */ /* We only have a single userspec */
if ((us = calloc(1, sizeof(*us))) == NULL) if ((us = calloc(1, sizeof(*us))) == NULL)
goto oom; goto oom;
us->file = rcstr_dup("LDAP"); us->file = sudo_rcstr_dup("LDAP");
TAILQ_INIT(&us->users); TAILQ_INIT(&us->users);
TAILQ_INIT(&us->privileges); TAILQ_INIT(&us->privileges);
STAILQ_INIT(&us->comments); STAILQ_INIT(&us->comments);

View File

@ -262,7 +262,7 @@ sudo_ldap_add_default(const char *var, const char *val, int op,
goto oom; goto oom;
} }
def->file = source; def->file = source;
rcstr_addref(source); sudo_rcstr_addref(source);
TAILQ_INSERT_TAIL(defs, def, entries); TAILQ_INSERT_TAIL(defs, def, entries);
debug_return_bool(true); debug_return_bool(true);
@ -514,7 +514,7 @@ sudo_ldap_role_to_priv(const char *cn, void *hosts, void *runasusers,
if (store_options) { if (store_options) {
/* Use sudoRole in place of file name in defaults. */ /* Use sudoRole in place of file name in defaults. */
size_t slen = sizeof("sudoRole") + strlen(priv->ldap_role); size_t slen = sizeof("sudoRole") + strlen(priv->ldap_role);
if ((source = rcstr_alloc(slen)) == NULL) if ((source = sudo_rcstr_alloc(slen)) == NULL)
goto oom; goto oom;
(void)snprintf(source, slen, "sudoRole %s", priv->ldap_role); (void)snprintf(source, slen, "sudoRole %s", priv->ldap_role);
} }
@ -604,7 +604,7 @@ sudo_ldap_role_to_priv(const char *cn, void *hosts, void *runasusers,
} }
} }
} }
rcstr_delref(source); sudo_rcstr_delref(source);
if (opt != NULL) { if (opt != NULL) {
/* Defer oom until we drop the ref on source. */ /* Defer oom until we drop the ref on source. */
goto oom; goto oom;

View File

@ -363,7 +363,7 @@ sss_to_sudoers(struct sudo_sss_handle *handle,
/* We only have a single userspec */ /* We only have a single userspec */
if ((us = calloc(1, sizeof(*us))) == NULL) if ((us = calloc(1, sizeof(*us))) == NULL)
goto oom; goto oom;
us->file = rcstr_dup("SSSD"); us->file = sudo_rcstr_dup("SSSD");
TAILQ_INIT(&us->users); TAILQ_INIT(&us->users);
TAILQ_INIT(&us->privileges); TAILQ_INIT(&us->privileges);
STAILQ_INIT(&us->comments); STAILQ_INIT(&us->comments);
@ -441,7 +441,7 @@ sudo_sss_parse_options(struct sudo_sss_handle *handle, struct sss_sudo_rule *rul
char *cp; char *cp;
if (asprintf(&cp, "sudoRole %s", cn_array[0]) == -1) if (asprintf(&cp, "sudoRole %s", cn_array[0]) == -1)
goto oom; goto oom;
source = rcstr_dup(cp); source = sudo_rcstr_dup(cp);
free(cp); free(cp);
if (source == NULL) if (source == NULL)
goto oom; goto oom;
@ -450,7 +450,7 @@ sudo_sss_parse_options(struct sudo_sss_handle *handle, struct sss_sudo_rule *rul
cn_array = NULL; cn_array = NULL;
} }
if (source == NULL) { if (source == NULL) {
if ((source = rcstr_dup("sudoRole UNKNOWN")) == NULL) if ((source = sudo_rcstr_dup("sudoRole UNKNOWN")) == NULL)
goto oom; goto oom;
} }
@ -470,7 +470,7 @@ oom:
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
done: done:
rcstr_delref(source); sudo_rcstr_delref(source);
handle->fn_free_values(val_array); handle->fn_free_values(val_array);
debug_return_bool(ret); debug_return_bool(ret);
} }

View File

@ -457,12 +457,6 @@ bool sudoers_gc_remove(enum sudoers_gc_types type, void *ptr);
void sudoers_gc_init(void); void sudoers_gc_init(void);
void sudoers_gc_run(void); void sudoers_gc_run(void);
/* rcstr.c */
char *rcstr_dup(const char *src);
char *rcstr_alloc(size_t len);
char *rcstr_addref(const char *s);
void rcstr_delref(const char *s);
/* strlcpy_unesc.c */ /* strlcpy_unesc.c */
size_t strlcpy_unescape(char *dst, const char *src, size_t size); size_t strlcpy_unescape(char *dst, const char *src, size_t size);

View File

@ -5084,16 +5084,16 @@ read_dir_files(const char *dirpath, struct path_list ***pathsp)
continue; continue;
} }
len = strlen(dirpath) + 1 + NAMLEN(dent); len = strlen(dirpath) + 1 + NAMLEN(dent);
if ((path = rcstr_alloc(len)) == NULL) if ((path = sudo_rcstr_alloc(len)) == NULL)
goto oom; goto oom;
(void)snprintf(path, len + 1, "%s/%s", dirpath, dent->d_name); (void)snprintf(path, len + 1, "%s/%s", dirpath, dent->d_name);
if (stat(path, &sb) != 0 || !S_ISREG(sb.st_mode)) { if (stat(path, &sb) != 0 || !S_ISREG(sb.st_mode)) {
rcstr_delref(path); sudo_rcstr_delref(path);
continue; continue;
} }
pl = malloc(sizeof(*pl)); pl = malloc(sizeof(*pl));
if (pl == NULL) { if (pl == NULL) {
rcstr_delref(path); sudo_rcstr_delref(path);
goto oom; goto oom;
} }
pl->path = path; pl->path = path;
@ -5102,7 +5102,7 @@ read_dir_files(const char *dirpath, struct path_list ***pathsp)
max_paths <<= 1; max_paths <<= 1;
tmp = reallocarray(paths, max_paths, sizeof(*paths)); tmp = reallocarray(paths, max_paths, sizeof(*paths));
if (tmp == NULL) { if (tmp == NULL) {
rcstr_delref(path); sudo_rcstr_delref(path);
free(pl); free(pl);
goto oom; goto oom;
} }
@ -5125,7 +5125,7 @@ bad:
if (dir != NULL) if (dir != NULL)
closedir(dir); closedir(dir);
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
rcstr_delref(paths[i]->path); sudo_rcstr_delref(paths[i]->path);
free(paths[i]); free(paths[i]);
} }
free(paths); free(paths);
@ -5180,10 +5180,10 @@ init_lexer(void)
idepth--; idepth--;
while ((pl = SLIST_FIRST(&istack[idepth].more)) != NULL) { while ((pl = SLIST_FIRST(&istack[idepth].more)) != NULL) {
SLIST_REMOVE_HEAD(&istack[idepth].more, entries); SLIST_REMOVE_HEAD(&istack[idepth].more, entries);
rcstr_delref(pl->path); sudo_rcstr_delref(pl->path);
free(pl); free(pl);
} }
rcstr_delref(istack[idepth].path); sudo_rcstr_delref(istack[idepth].path);
if (idepth && !istack[idepth].keepopen) if (idepth && !istack[idepth].keepopen)
fclose(istack[idepth].bs->yy_input_file); fclose(istack[idepth].bs->yy_input_file);
sudoers_delete_buffer(istack[idepth].bs); sudoers_delete_buffer(istack[idepth].bs);
@ -5246,7 +5246,7 @@ expand_include(const char *opath)
} }
/* Make a copy of the fully-qualified path and return it. */ /* Make a copy of the fully-qualified path and return it. */
path = pp = rcstr_alloc(len + dirlen); path = pp = sudo_rcstr_alloc(len + dirlen);
if (path == NULL) { if (path == NULL) {
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
sudoerserror(NULL); sudoerserror(NULL);
@ -5302,7 +5302,7 @@ push_include(const char *opath, bool isdir)
if (sudoers_warnings) if (sudoers_warnings)
sudo_warnx(U_("%s: %s"), path, U_("too many levels of includes")); sudo_warnx(U_("%s: %s"), path, U_("too many levels of includes"));
sudoerserror(NULL); sudoerserror(NULL);
rcstr_delref(path); sudo_rcstr_delref(path);
debug_return_bool(false); debug_return_bool(false);
} }
istacksize += SUDOERS_STACK_INCREMENT; istacksize += SUDOERS_STACK_INCREMENT;
@ -5310,7 +5310,7 @@ push_include(const char *opath, bool isdir)
if (new_istack == NULL) { if (new_istack == NULL) {
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
sudoerserror(NULL); sudoerserror(NULL);
rcstr_delref(path); sudo_rcstr_delref(path);
debug_return_bool(false); debug_return_bool(false);
} }
istack = new_istack; istack = new_istack;
@ -5346,19 +5346,19 @@ push_include(const char *opath, bool isdir)
} }
} }
/* A missing or insecure include dir is not a fatal error. */ /* A missing or insecure include dir is not a fatal error. */
rcstr_delref(path); sudo_rcstr_delref(path);
debug_return_bool(true); debug_return_bool(true);
} }
count = switch_dir(&istack[idepth], path); count = switch_dir(&istack[idepth], path);
if (count <= 0) { if (count <= 0) {
/* switch_dir() called sudoerserror() for us */ /* switch_dir() called sudoerserror() for us */
rcstr_delref(path); sudo_rcstr_delref(path);
debug_return_bool(count ? false : true); debug_return_bool(count ? false : true);
} }
/* Parse the first dir entry we can open, leave the rest for later. */ /* Parse the first dir entry we can open, leave the rest for later. */
do { do {
rcstr_delref(path); sudo_rcstr_delref(path);
if ((pl = SLIST_FIRST(&istack[idepth].more)) == NULL) { if ((pl = SLIST_FIRST(&istack[idepth].more)) == NULL) {
/* Unable to open any files in include dir, not an error. */ /* Unable to open any files in include dir, not an error. */
debug_return_bool(true); debug_return_bool(true);
@ -5371,7 +5371,7 @@ push_include(const char *opath, bool isdir)
if ((fp = open_sudoers(path, true, &keepopen)) == NULL) { if ((fp = open_sudoers(path, true, &keepopen)) == NULL) {
/* The error was already printed by open_sudoers() */ /* The error was already printed by open_sudoers() */
sudoerserror(NULL); sudoerserror(NULL);
rcstr_delref(path); sudo_rcstr_delref(path);
debug_return_bool(false); debug_return_bool(false);
} }
} }
@ -5415,7 +5415,7 @@ pop_include(void)
if (fp != NULL) { if (fp != NULL) {
sudolinebuf.len = sudolinebuf.off = 0; sudolinebuf.len = sudolinebuf.off = 0;
sudolinebuf.toke_start = sudolinebuf.toke_end = 0; sudolinebuf.toke_start = sudolinebuf.toke_end = 0;
rcstr_delref(sudoers); sudo_rcstr_delref(sudoers);
sudoers = pl->path; sudoers = pl->path;
sudolineno = 1; sudolineno = 1;
sudoers_switch_to_buffer(sudoers_create_buffer(fp, YY_BUF_SIZE)); sudoers_switch_to_buffer(sudoers_create_buffer(fp, YY_BUF_SIZE));
@ -5423,7 +5423,7 @@ pop_include(void)
break; break;
} }
/* Unable to open path in include dir, go to next one. */ /* Unable to open path in include dir, go to next one. */
rcstr_delref(pl->path); sudo_rcstr_delref(pl->path);
free(pl); free(pl);
} }
/* If no path list, just pop the last dir on the stack. */ /* If no path list, just pop the last dir on the stack. */
@ -5432,7 +5432,7 @@ pop_include(void)
sudoers_switch_to_buffer(istack[idepth].bs); sudoers_switch_to_buffer(istack[idepth].bs);
free(sudolinebuf.buf); free(sudolinebuf.buf);
sudolinebuf = istack[idepth].line; sudolinebuf = istack[idepth].line;
rcstr_delref(sudoers); sudo_rcstr_delref(sudoers);
sudoers = istack[idepth].path; sudoers = istack[idepth].path;
sudolineno = istack[idepth].lineno; sudolineno = istack[idepth].lineno;
keepopen = istack[idepth].keepopen; keepopen = istack[idepth].keepopen;

View File

@ -889,16 +889,16 @@ read_dir_files(const char *dirpath, struct path_list ***pathsp)
continue; continue;
} }
len = strlen(dirpath) + 1 + NAMLEN(dent); len = strlen(dirpath) + 1 + NAMLEN(dent);
if ((path = rcstr_alloc(len)) == NULL) if ((path = sudo_rcstr_alloc(len)) == NULL)
goto oom; goto oom;
(void)snprintf(path, len + 1, "%s/%s", dirpath, dent->d_name); (void)snprintf(path, len + 1, "%s/%s", dirpath, dent->d_name);
if (stat(path, &sb) != 0 || !S_ISREG(sb.st_mode)) { if (stat(path, &sb) != 0 || !S_ISREG(sb.st_mode)) {
rcstr_delref(path); sudo_rcstr_delref(path);
continue; continue;
} }
pl = malloc(sizeof(*pl)); pl = malloc(sizeof(*pl));
if (pl == NULL) { if (pl == NULL) {
rcstr_delref(path); sudo_rcstr_delref(path);
goto oom; goto oom;
} }
pl->path = path; pl->path = path;
@ -907,7 +907,7 @@ read_dir_files(const char *dirpath, struct path_list ***pathsp)
max_paths <<= 1; max_paths <<= 1;
tmp = reallocarray(paths, max_paths, sizeof(*paths)); tmp = reallocarray(paths, max_paths, sizeof(*paths));
if (tmp == NULL) { if (tmp == NULL) {
rcstr_delref(path); sudo_rcstr_delref(path);
free(pl); free(pl);
goto oom; goto oom;
} }
@ -930,7 +930,7 @@ bad:
if (dir != NULL) if (dir != NULL)
closedir(dir); closedir(dir);
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
rcstr_delref(paths[i]->path); sudo_rcstr_delref(paths[i]->path);
free(paths[i]); free(paths[i]);
} }
free(paths); free(paths);
@ -985,10 +985,10 @@ init_lexer(void)
idepth--; idepth--;
while ((pl = SLIST_FIRST(&istack[idepth].more)) != NULL) { while ((pl = SLIST_FIRST(&istack[idepth].more)) != NULL) {
SLIST_REMOVE_HEAD(&istack[idepth].more, entries); SLIST_REMOVE_HEAD(&istack[idepth].more, entries);
rcstr_delref(pl->path); sudo_rcstr_delref(pl->path);
free(pl); free(pl);
} }
rcstr_delref(istack[idepth].path); sudo_rcstr_delref(istack[idepth].path);
if (idepth && !istack[idepth].keepopen) if (idepth && !istack[idepth].keepopen)
fclose(istack[idepth].bs->yy_input_file); fclose(istack[idepth].bs->yy_input_file);
sudoers_delete_buffer(istack[idepth].bs); sudoers_delete_buffer(istack[idepth].bs);
@ -1051,7 +1051,7 @@ expand_include(const char *opath)
} }
/* Make a copy of the fully-qualified path and return it. */ /* Make a copy of the fully-qualified path and return it. */
path = pp = rcstr_alloc(len + dirlen); path = pp = sudo_rcstr_alloc(len + dirlen);
if (path == NULL) { if (path == NULL) {
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
sudoerserror(NULL); sudoerserror(NULL);
@ -1107,7 +1107,7 @@ push_include(const char *opath, bool isdir)
if (sudoers_warnings) if (sudoers_warnings)
sudo_warnx(U_("%s: %s"), path, U_("too many levels of includes")); sudo_warnx(U_("%s: %s"), path, U_("too many levels of includes"));
sudoerserror(NULL); sudoerserror(NULL);
rcstr_delref(path); sudo_rcstr_delref(path);
debug_return_bool(false); debug_return_bool(false);
} }
istacksize += SUDOERS_STACK_INCREMENT; istacksize += SUDOERS_STACK_INCREMENT;
@ -1115,7 +1115,7 @@ push_include(const char *opath, bool isdir)
if (new_istack == NULL) { if (new_istack == NULL) {
sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
sudoerserror(NULL); sudoerserror(NULL);
rcstr_delref(path); sudo_rcstr_delref(path);
debug_return_bool(false); debug_return_bool(false);
} }
istack = new_istack; istack = new_istack;
@ -1151,19 +1151,19 @@ push_include(const char *opath, bool isdir)
} }
} }
/* A missing or insecure include dir is not a fatal error. */ /* A missing or insecure include dir is not a fatal error. */
rcstr_delref(path); sudo_rcstr_delref(path);
debug_return_bool(true); debug_return_bool(true);
} }
count = switch_dir(&istack[idepth], path); count = switch_dir(&istack[idepth], path);
if (count <= 0) { if (count <= 0) {
/* switch_dir() called sudoerserror() for us */ /* switch_dir() called sudoerserror() for us */
rcstr_delref(path); sudo_rcstr_delref(path);
debug_return_bool(count ? false : true); debug_return_bool(count ? false : true);
} }
/* Parse the first dir entry we can open, leave the rest for later. */ /* Parse the first dir entry we can open, leave the rest for later. */
do { do {
rcstr_delref(path); sudo_rcstr_delref(path);
if ((pl = SLIST_FIRST(&istack[idepth].more)) == NULL) { if ((pl = SLIST_FIRST(&istack[idepth].more)) == NULL) {
/* Unable to open any files in include dir, not an error. */ /* Unable to open any files in include dir, not an error. */
debug_return_bool(true); debug_return_bool(true);
@ -1176,7 +1176,7 @@ push_include(const char *opath, bool isdir)
if ((fp = open_sudoers(path, true, &keepopen)) == NULL) { if ((fp = open_sudoers(path, true, &keepopen)) == NULL) {
/* The error was already printed by open_sudoers() */ /* The error was already printed by open_sudoers() */
sudoerserror(NULL); sudoerserror(NULL);
rcstr_delref(path); sudo_rcstr_delref(path);
debug_return_bool(false); debug_return_bool(false);
} }
} }
@ -1220,7 +1220,7 @@ pop_include(void)
if (fp != NULL) { if (fp != NULL) {
sudolinebuf.len = sudolinebuf.off = 0; sudolinebuf.len = sudolinebuf.off = 0;
sudolinebuf.toke_start = sudolinebuf.toke_end = 0; sudolinebuf.toke_start = sudolinebuf.toke_end = 0;
rcstr_delref(sudoers); sudo_rcstr_delref(sudoers);
sudoers = pl->path; sudoers = pl->path;
sudolineno = 1; sudolineno = 1;
sudoers_switch_to_buffer(sudoers_create_buffer(fp, YY_BUF_SIZE)); sudoers_switch_to_buffer(sudoers_create_buffer(fp, YY_BUF_SIZE));
@ -1228,7 +1228,7 @@ pop_include(void)
break; break;
} }
/* Unable to open path in include dir, go to next one. */ /* Unable to open path in include dir, go to next one. */
rcstr_delref(pl->path); sudo_rcstr_delref(pl->path);
free(pl); free(pl);
} }
/* If no path list, just pop the last dir on the stack. */ /* If no path list, just pop the last dir on the stack. */
@ -1237,7 +1237,7 @@ pop_include(void)
sudoers_switch_to_buffer(istack[idepth].bs); sudoers_switch_to_buffer(istack[idepth].bs);
free(sudolinebuf.buf); free(sudolinebuf.buf);
sudolinebuf = istack[idepth].line; sudolinebuf = istack[idepth].line;
rcstr_delref(sudoers); sudo_rcstr_delref(sudoers);
sudoers = istack[idepth].path; sudoers = istack[idepth].path;
sudolineno = istack[idepth].lineno; sudolineno = istack[idepth].lineno;
keepopen = istack[idepth].keepopen; keepopen = istack[idepth].keepopen;

View File

@ -550,14 +550,14 @@ check_defaults_and_aliases(bool strict, bool quiet)
if (!check_defaults(&parsed_policy, quiet)) { if (!check_defaults(&parsed_policy, quiet)) {
struct defaults *d; struct defaults *d;
rcstr_delref(errorfile); sudo_rcstr_delref(errorfile);
errorfile = NULL; errorfile = NULL;
errorlineno = -1; errorlineno = -1;
/* XXX - should edit all files with errors */ /* XXX - should edit all files with errors */
TAILQ_FOREACH(d, &parsed_policy.defaults, entries) { TAILQ_FOREACH(d, &parsed_policy.defaults, entries) {
if (d->error) { if (d->error) {
/* Defaults parse error, set errorfile/errorlineno. */ /* Defaults parse error, set errorfile/errorlineno. */
errorfile = rcstr_addref(d->file); errorfile = sudo_rcstr_addref(d->file);
errorlineno = d->line; errorlineno = d->line;
break; break;
} }
@ -604,8 +604,8 @@ reparse_sudoers(char *editor, int editor_argc, char **editor_argv,
sudo_warnx(U_("unable to parse temporary file (%s), unknown error"), sudo_warnx(U_("unable to parse temporary file (%s), unknown error"),
sp->tpath); sp->tpath);
parse_error = true; parse_error = true;
rcstr_delref(errorfile); sudo_rcstr_delref(errorfile);
if ((errorfile = rcstr_dup(sp->path)) == NULL) if ((errorfile = sudo_rcstr_dup(sp->path)) == NULL)
sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
} }
fclose(sudoersin); fclose(sudoersin);
@ -921,8 +921,8 @@ check_syntax(const char *file, bool quiet, bool strict, bool oldperms)
if (!quiet) if (!quiet)
sudo_warnx(U_("failed to parse %s file, unknown error"), file); sudo_warnx(U_("failed to parse %s file, unknown error"), file);
parse_error = true; parse_error = true;
rcstr_delref(errorfile); sudo_rcstr_delref(errorfile);
if ((errorfile = rcstr_dup(file)) == NULL) if ((errorfile = sudo_rcstr_dup(file)) == NULL)
sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory")); sudo_fatalx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
} }
if (!parse_error) { if (!parse_error) {