2
0
mirror of https://github.com/sudo-project/sudo.git synced 2025-08-31 22:35:10 +00:00

Add free_userspecs() and free_default() and use them instead of

looping over the lists and calling free_userspec() and free_default().
This commit is contained in:
Todd C. Miller
2018-05-15 16:35:07 -06:00
parent 3a4c0e06c1
commit f38317269d
6 changed files with 82 additions and 105 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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()) {

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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 */