Add reference counting to Defaults bindings.
Previously, we checked that the previous entry's binding pointer was not the same while freeing. However, to be able to merge Defaults records we cannot rely on Defaults entries with the same binding being immediately adjacent. This removes the prev_binding checks in favor of a reference count which allows us to plug the memory leak in cvtsudoers when merging Defaults.
This commit is contained in:
@@ -251,6 +251,11 @@ struct runascontainer {
|
||||
struct member *runasgroups;
|
||||
};
|
||||
|
||||
struct defaults_binding {
|
||||
struct member_list members;
|
||||
unsigned int refcnt;
|
||||
};
|
||||
|
||||
struct sudoers_comment {
|
||||
STAILQ_ENTRY(sudoers_comment) entries;
|
||||
char *str;
|
||||
@@ -277,7 +282,7 @@ struct defaults {
|
||||
TAILQ_ENTRY(defaults) entries;
|
||||
char *var; /* variable name */
|
||||
char *val; /* variable value */
|
||||
struct member_list *binding; /* user/host/runas binding */
|
||||
struct defaults_binding *binding; /* user/host/runas binding */
|
||||
char *file; /* file Defaults entry was in */
|
||||
short type; /* DEFAULTS{,_USER,_RUNAS,_HOST} */
|
||||
char op; /* true, false, '+', '-' */
|
||||
@@ -364,7 +369,7 @@ void free_cmndspecs(struct cmndspec_list *csl);
|
||||
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_default(struct defaults *def);
|
||||
void free_defaults(struct defaults_list *defs);
|
||||
void init_parse_tree(struct sudoers_parse_tree *parse_tree, char *lhost, char *shost);
|
||||
void free_parse_tree(struct sudoers_parse_tree *parse_tree);
|
||||
|
Reference in New Issue
Block a user