From: Todd C. Miller Date: Tue, 15 May 2018 22:35:07 +0000 (-0600) Subject: Add free_userspecs() and free_default() and use them instead of X-Git-Tag: SUDO_1_8_24^2~80 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f38317269d0226ac8e953ae86f0a9cb8f0a3f57a;p=sudo Add free_userspecs() and free_default() and use them instead of looping over the lists and calling free_userspec() and free_default(). --- diff --git a/plugins/sudoers/file.c b/plugins/sudoers/file.c index 85a0163d6..c604f47b2 100644 --- a/plugins/sudoers/file.c +++ b/plugins/sudoers/file.c @@ -71,9 +71,6 @@ sudo_file_open(struct sudo_nss *nss) static int sudo_file_close(struct sudo_nss *nss) { - struct member_list *prev_binding = NULL; - struct defaults *def; - struct userspec *us; debug_decl(sudo_file_close, SUDOERS_DEBUG_NSS) if (nss->handle != NULL) { @@ -82,14 +79,8 @@ sudo_file_close(struct sudo_nss *nss) sudoersin = NULL; /* XXX - do in main module? */ - while ((us = TAILQ_FIRST(&nss->userspecs)) != NULL) { - TAILQ_REMOVE(&nss->userspecs, us, entries); - free_userspec(us); - } - while ((def = TAILQ_FIRST(&nss->defaults)) != NULL) { - TAILQ_REMOVE(&nss->defaults, def, entries); - free_default(def, &prev_binding); - } + free_userspecs(&nss->userspecs); + free_defaults(&nss->defaults); } debug_return_int(0); diff --git a/plugins/sudoers/gram.c b/plugins/sudoers/gram.c index f0bd07433..12155f5ba 100644 --- a/plugins/sudoers/gram.c +++ b/plugins/sudoers/gram.c @@ -870,6 +870,21 @@ free_members(struct member_list *members) debug_return; } +void +free_defaults(struct defaults_list *defs) +{ + struct member_list *prev_binding = NULL; + struct defaults *def; + debug_decl(free_defaults, SUDOERS_DEBUG_PARSER) + + while ((def = TAILQ_FIRST(defs)) != NULL) { + TAILQ_REMOVE(defs, def, entries); + free_default(def, &prev_binding); + } + + debug_return; +} + void free_default(struct defaults *def, struct member_list **binding) { @@ -954,6 +969,20 @@ free_privilege(struct privilege *priv) debug_return; } +void +free_userspecs(struct userspec_list *usl) +{ + struct userspec *us; + debug_decl(free_userspecs, SUDOERS_DEBUG_PARSER) + + while ((us = TAILQ_FIRST(usl)) != NULL) { + TAILQ_REMOVE(usl, us, entries); + free_userspec(us); + } + + debug_return; +} + void free_userspec(struct userspec *us) { @@ -984,23 +1013,11 @@ free_userspec(struct userspec *us) bool init_parser(const char *path, bool quiet) { - struct member_list *prev_binding = NULL; - struct defaults *def; - struct userspec *us; bool ret = true; - void *next; debug_decl(init_parser, SUDOERS_DEBUG_PARSER) - TAILQ_FOREACH_SAFE(us, &userspecs, entries, next) { - free_userspec(us); - } - TAILQ_INIT(&userspecs); - - TAILQ_FOREACH_SAFE(def, &defaults, entries, next) { - free_default(def, &prev_binding); - } - TAILQ_INIT(&defaults); - + free_userspecs(&userspecs); + free_defaults(&defaults); init_lexer(); if (!init_aliases()) { @@ -1045,7 +1062,7 @@ init_options(struct command_options *opts) opts->limitprivs = NULL; #endif } -#line 996 "gram.c" +#line 1013 "gram.c" /* allocate initial stack or double stack size, up to YYMAXDEPTH */ #if defined(__cplusplus) || defined(__STDC__) static int yygrowstack(void) @@ -2170,7 +2187,7 @@ case 116: } } break; -#line 2121 "gram.c" +#line 2138 "gram.c" } yyssp -= yym; yystate = *yyssp; diff --git a/plugins/sudoers/gram.y b/plugins/sudoers/gram.y index 91986f444..8c285e661 100644 --- a/plugins/sudoers/gram.y +++ b/plugins/sudoers/gram.y @@ -1098,6 +1098,21 @@ free_members(struct member_list *members) debug_return; } +void +free_defaults(struct defaults_list *defs) +{ + struct member_list *prev_binding = NULL; + struct defaults *def; + debug_decl(free_defaults, SUDOERS_DEBUG_PARSER) + + while ((def = TAILQ_FIRST(defs)) != NULL) { + TAILQ_REMOVE(defs, def, entries); + free_default(def, &prev_binding); + } + + debug_return; +} + void free_default(struct defaults *def, struct member_list **binding) { @@ -1182,6 +1197,20 @@ free_privilege(struct privilege *priv) debug_return; } +void +free_userspecs(struct userspec_list *usl) +{ + struct userspec *us; + debug_decl(free_userspecs, SUDOERS_DEBUG_PARSER) + + while ((us = TAILQ_FIRST(usl)) != NULL) { + TAILQ_REMOVE(usl, us, entries); + free_userspec(us); + } + + debug_return; +} + void free_userspec(struct userspec *us) { @@ -1212,23 +1241,11 @@ free_userspec(struct userspec *us) bool init_parser(const char *path, bool quiet) { - struct member_list *prev_binding = NULL; - struct defaults *def; - struct userspec *us; bool ret = true; - void *next; debug_decl(init_parser, SUDOERS_DEBUG_PARSER) - TAILQ_FOREACH_SAFE(us, &userspecs, entries, next) { - free_userspec(us); - } - TAILQ_INIT(&userspecs); - - TAILQ_FOREACH_SAFE(def, &defaults, entries, next) { - free_default(def, &prev_binding); - } - TAILQ_INIT(&defaults); - + free_userspecs(&userspecs); + free_defaults(&defaults); init_lexer(); if (!init_aliases()) { diff --git a/plugins/sudoers/ldap.c b/plugins/sudoers/ldap.c index 78afd151d..67ae25fa4 100644 --- a/plugins/sudoers/ldap.c +++ b/plugins/sudoers/ldap.c @@ -1253,10 +1253,7 @@ ldap_to_sudoers(LDAP *ld, struct ldap_result *lres, oom: sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); - while ((us = TAILQ_FIRST(ldap_userspecs)) != NULL) { - TAILQ_REMOVE(ldap_userspecs, us, entries); - free_userspec(us); - } + free_userspecs(ldap_userspecs); debug_return_ptr(NULL); } @@ -1668,9 +1665,7 @@ sudo_ldap_getdefs(struct sudo_nss *nss) { struct ldap_config_str *base; struct sudo_ldap_handle *handle = nss->handle; - struct member_list *prev_binding = NULL; struct timeval tv, *tvp = NULL; - struct defaults *def; LDAP *ld; LDAPMessage *entry, *result = NULL; char *filt; @@ -1682,10 +1677,7 @@ sudo_ldap_getdefs(struct sudo_nss *nss) ld = handle->ld; /* Free old defaults, if any. */ - while ((def = TAILQ_FIRST(&nss->defaults)) != NULL) { - TAILQ_REMOVE(&nss->defaults, def, entries); - free_default(def, &prev_binding); - } + free_defaults(&nss->defaults); filt = sudo_ldap_build_default_filter(); if (filt == NULL) { @@ -1811,23 +1803,14 @@ static void sudo_ldap_result_free_nss(struct sudo_nss *nss) { struct sudo_ldap_handle *handle = nss->handle; - struct member_list *prev_binding = NULL; - struct defaults *def; - struct userspec *us; debug_decl(sudo_ldap_result_free_nss, SUDOERS_DEBUG_LDAP) if (handle->pw != NULL) sudo_pw_delref(handle->pw); /* XXX - do in main module? */ - while ((us = TAILQ_FIRST(&nss->userspecs)) != NULL) { - TAILQ_REMOVE(&nss->userspecs, us, entries); - free_userspec(us); - } - while ((def = TAILQ_FIRST(&nss->defaults)) != NULL) { - TAILQ_REMOVE(&nss->defaults, def, entries); - free_default(def, &prev_binding); - } + free_userspecs(&nss->userspecs); + free_defaults(&nss->defaults); debug_return; } @@ -1970,7 +1953,6 @@ sudo_ldap_query(struct sudo_nss *nss, struct passwd *pw) { struct sudo_ldap_handle *handle = nss->handle; struct ldap_result *lres = NULL; - struct userspec *us; int ret = 0; LDAP *ld; debug_decl(sudo_ldap_query, SUDOERS_DEBUG_LDAP) @@ -1988,10 +1970,7 @@ sudo_ldap_query(struct sudo_nss *nss, struct passwd *pw) } /* Free old userspecs, if any. */ - while ((us = TAILQ_FIRST(&nss->userspecs)) != NULL) { - TAILQ_REMOVE(&nss->userspecs, us, entries); - free_userspec(us); - } + free_userspecs(&nss->userspecs); DPRINTF1("%s: ldap search user %s, host %s", __func__, pw->pw_name, user_runhost); @@ -2013,12 +1992,8 @@ sudo_ldap_query(struct sudo_nss *nss, struct passwd *pw) done: /* Cleanup. */ sudo_ldap_result_free(lres); - if (ret == -1) { - while ((us = TAILQ_FIRST(&nss->userspecs)) != NULL) { - TAILQ_REMOVE(&nss->userspecs, us, entries); - free_userspec(us); - } - } + if (ret == -1) + free_userspecs(&nss->userspecs); debug_return_int(ret); } diff --git a/plugins/sudoers/parse.h b/plugins/sudoers/parse.h index 94fb6c369..4beef2926 100644 --- a/plugins/sudoers/parse.h +++ b/plugins/sudoers/parse.h @@ -270,7 +270,9 @@ void free_member(struct member *m); void free_members(struct member_list *members); void free_privilege(struct privilege *priv); void free_userspec(struct userspec *us); +void free_userspecs(struct userspec_list *usl); void free_default(struct defaults *def, struct member_list **binding); +void free_defaults(struct defaults_list *defs); /* match_addr.c */ bool addr_matches(char *n); diff --git a/plugins/sudoers/sssd.c b/plugins/sudoers/sssd.c index ea077b31b..d57f80a69 100644 --- a/plugins/sudoers/sssd.c +++ b/plugins/sudoers/sssd.c @@ -279,9 +279,6 @@ sudo_sss_open(struct sudo_nss *nss) static int sudo_sss_close(struct sudo_nss *nss) { - struct member_list *prev_binding = NULL; - struct defaults *def; - struct userspec *us; struct sudo_sss_handle *handle; debug_decl(sudo_sss_close, SUDOERS_DEBUG_SSSD); @@ -297,14 +294,8 @@ sudo_sss_close(struct sudo_nss *nss) nss->handle = NULL; /* XXX - do in main module? */ - while ((us = TAILQ_FIRST(&nss->userspecs)) != NULL) { - TAILQ_REMOVE(&nss->userspecs, us, entries); - free_userspec(us); - } - while ((def = TAILQ_FIRST(&nss->defaults)) != NULL) { - TAILQ_REMOVE(&nss->defaults, def, entries); - free_default(def, &prev_binding); - } + free_userspecs(&nss->userspecs); + free_defaults(&nss->defaults); } debug_return_int(0); } @@ -317,7 +308,6 @@ sudo_sss_query(struct sudo_nss *nss, struct passwd *pw) { struct sudo_sss_handle *handle = nss->handle; struct sss_sudo_result *sss_result = NULL; - struct userspec *us; int ret = 0; debug_decl(sudo_sss_query, SUDOERS_DEBUG_SSSD); @@ -330,10 +320,7 @@ sudo_sss_query(struct sudo_nss *nss, struct passwd *pw) } /* Free old userspecs, if any. */ - while ((us = TAILQ_FIRST(&nss->userspecs)) != NULL) { - TAILQ_REMOVE(&nss->userspecs, us, entries); - free_userspec(us); - } + free_userspecs(&nss->userspecs); /* Fetch list of sudoRole entries that match user and host. */ sss_result = sudo_sss_result_get(nss, pw); @@ -358,12 +345,8 @@ sudo_sss_query(struct sudo_nss *nss, struct passwd *pw) done: /* Cleanup */ handle->fn_free_result(sss_result); - if (ret == -1) { - while ((us = TAILQ_FIRST(&nss->userspecs)) != NULL) { - TAILQ_REMOVE(&nss->userspecs, us, entries); - free_userspec(us); - } - } + if (ret == -1) + free_userspecs(&nss->userspecs); sudo_debug_printf(SUDO_DEBUG_DIAG, "Done with LDAP searches"); @@ -384,8 +367,6 @@ sudo_sss_getdefs(struct sudo_nss *nss) struct sudo_sss_handle *handle = nss->handle; struct sss_sudo_result *sss_result = NULL; struct sss_sudo_rule *sss_rule; - struct member_list *prev_binding = NULL; - struct defaults *def; uint32_t sss_error; unsigned int i; int rc; @@ -395,10 +376,7 @@ sudo_sss_getdefs(struct sudo_nss *nss) debug_return_int(-1); /* Free old defaults, if any. */ - while ((def = TAILQ_FIRST(&nss->defaults)) != NULL) { - TAILQ_REMOVE(&nss->defaults, def, entries); - free_default(def, &prev_binding); - } + free_defaults(&nss->defaults); sudo_debug_printf(SUDO_DEBUG_DIAG, "Looking for cn=defaults"); @@ -787,10 +765,7 @@ sss_to_sudoers(struct sudo_sss_handle *handle, struct sss_sudo_result *sss_resul oom: sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory")); - while ((us = TAILQ_FIRST(sss_userspecs)) != NULL) { - TAILQ_REMOVE(sss_userspecs, us, entries); - free_userspec(us); - } + free_userspecs(sss_userspecs); debug_return_bool(false); } #endif /* HAVE_SSSD */