]> granicus.if.org Git - sudo/commitdiff
Refactor freeing of a member_list into free_members().
authorTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 1 Nov 2016 20:15:07 +0000 (14:15 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 1 Nov 2016 20:15:07 +0000 (14:15 -0600)
plugins/sudoers/alias.c
plugins/sudoers/gram.c
plugins/sudoers/gram.y
plugins/sudoers/parse.h

index 4676a16bcfb0698427ba6695c7244ae14b5bde0b..c18169ab1d589250b1b4a76015537db4a1d937c3 100644 (file)
@@ -170,21 +170,10 @@ void
 alias_free(void *v)
 {
     struct alias *a = (struct alias *)v;
-    struct member *m;
-    struct sudo_command *c;
-    void *next;
     debug_decl(alias_free, SUDOERS_DEBUG_ALIAS)
 
     free(a->name);
-    TAILQ_FOREACH_SAFE(m, &a->members, entries, next) {
-       if (m->type == COMMAND) {
-               c = (struct sudo_command *) m->name;
-               free(c->cmnd);
-               free(c->args);
-       }
-       free(m->name);
-       free(m);
-    }
+    free_members(&a->members);
     free(a);
 
     debug_return;
index 9bd12bd8be2b43cc55819774bf59988d7e92fcff..c34f964326f1123eb403343f11c2410450a7d4b1 100644 (file)
@@ -854,6 +854,26 @@ add_userspec(struct member *members, struct privilege *privs)
     debug_return_bool(true);
 }
 
+/*
+ * Free a tailq of members but not the struct member_list container itself.
+ */
+void
+free_members(struct member_list *members)
+{
+    struct member *m, *next;
+    struct sudo_command *c;
+
+    TAILQ_FOREACH_SAFE(m, members, entries, next) {
+       if (m->type == COMMAND) {
+               c = (struct sudo_command *) m->name;
+               free(c->cmnd);
+               free(c->args);
+       }
+       free(m->name);
+       free(m);
+    }
+}
+
 /*
  * Free up space used by data structures from a previous parser run and sets
  * the current sudoers file to path.
@@ -948,19 +968,8 @@ init_parser(const char *path, bool quiet)
     binding = NULL;
     TAILQ_FOREACH_SAFE(d, &defaults, entries, d_next) {
        if (d->binding != binding) {
-           struct member *m, *m_next;
-
            binding = d->binding;
-           TAILQ_FOREACH_SAFE(m, d->binding, entries, m_next) {
-               if (m->type == COMMAND) {
-                       struct sudo_command *c =
-                           (struct sudo_command *) m->name;
-                       free(c->cmnd);
-                       free(c->args);
-               }
-               free(m->name);
-               free(m);
-           }
+           free_members(d->binding);
            free(d->binding);
        }
        free(d->var);
@@ -994,7 +1003,7 @@ init_parser(const char *path, bool quiet)
 
     debug_return_bool(ret);
 }
-#line 945 "gram.c"
+#line 954 "gram.c"
 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
 #if defined(__cplusplus) || defined(__STDC__)
 static int yygrowstack(void)
@@ -2077,7 +2086,7 @@ case 115:
                            }
                        }
 break;
-#line 2028 "gram.c"
+#line 2037 "gram.c"
     }
     yyssp -= yym;
     yystate = *yyssp;
index 1b087a9952eae60543f12923721246b77bed79a5..38bd6104a97831afb226fedce1b51e9d3d90c51f 100644 (file)
@@ -1010,6 +1010,26 @@ add_userspec(struct member *members, struct privilege *privs)
     debug_return_bool(true);
 }
 
+/*
+ * Free a tailq of members but not the struct member_list container itself.
+ */
+void
+free_members(struct member_list *members)
+{
+    struct member *m, *next;
+    struct sudo_command *c;
+
+    TAILQ_FOREACH_SAFE(m, members, entries, next) {
+       if (m->type == COMMAND) {
+               c = (struct sudo_command *) m->name;
+               free(c->cmnd);
+               free(c->args);
+       }
+       free(m->name);
+       free(m);
+    }
+}
+
 /*
  * Free up space used by data structures from a previous parser run and sets
  * the current sudoers file to path.
@@ -1104,19 +1124,8 @@ init_parser(const char *path, bool quiet)
     binding = NULL;
     TAILQ_FOREACH_SAFE(d, &defaults, entries, d_next) {
        if (d->binding != binding) {
-           struct member *m, *m_next;
-
            binding = d->binding;
-           TAILQ_FOREACH_SAFE(m, d->binding, entries, m_next) {
-               if (m->type == COMMAND) {
-                       struct sudo_command *c =
-                           (struct sudo_command *) m->name;
-                       free(c->cmnd);
-                       free(c->args);
-               }
-               free(m->name);
-               free(m);
-           }
+           free_members(d->binding);
            free(d->binding);
        }
        free(d->var);
index 973d0ac60e3e6448730ca94e680192b340dc532d..5546cd8b93940edc06dad362f51595bf5c4efae3 100644 (file)
@@ -244,6 +244,7 @@ bool init_aliases(void);
 
 /* gram.c */
 bool init_parser(const char *, bool);
+void free_members(struct member_list *members);
 
 /* match_addr.c */
 bool addr_matches(char *n);