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;
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.
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);
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)
}
}
break;
-#line 2028 "gram.c"
+#line 2037 "gram.c"
}
yyssp -= yym;
yystate = *yyssp;
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.
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);
/* gram.c */
bool init_parser(const char *, bool);
+void free_members(struct member_list *members);
/* match_addr.c */
bool addr_matches(char *n);