]> granicus.if.org Git - sudo/commitdiff
Add free_userspecs() and free_default() and use them instead of
authorTodd C. Miller <Todd.Miller@sudo.ws>
Tue, 15 May 2018 22:35:07 +0000 (16:35 -0600)
committerTodd C. Miller <Todd.Miller@sudo.ws>
Tue, 15 May 2018 22:35:07 +0000 (16:35 -0600)
looping over the lists and calling free_userspec() and free_default().

plugins/sudoers/file.c
plugins/sudoers/gram.c
plugins/sudoers/gram.y
plugins/sudoers/ldap.c
plugins/sudoers/parse.h
plugins/sudoers/sssd.c

index 85a0163d65747a5a807cd1dcdb31306aacf6a359..c604f47b29840f5b3ba73f5edce23fe06bca4cd9 100644 (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);
index f0bd0743334e8ebdd37359d04f7baca342529102..12155f5ba571fdba63c2bd981226be073bf5dbdc 100644 (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;
index 91986f444580e00d1266184762d64ed0b908b706..8c285e66114313978cdbace401e388ac4e5ccd18 100644 (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()) {
index 78afd151d7133d31523f1f5db6fd848bbb949573..67ae25fa43176adf573467e36bb080fa06d36e81 100644 (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);
 }
 
index 94fb6c369376070295c17e4ba608546866989db0..4beef2926aaa22a8a3a0858eafeb5eb77ad283d1 100644 (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);
index ea077b31b3a4ba5c01434dcb1db67b18dff7a17b..d57f80a69a739c0fa1780cf79236148281257cad 100644 (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 */