Silence a false positive from the clang static analyzer.

This commit is contained in:
Todd C. Miller
2018-03-21 14:55:17 -06:00
parent fbed17e1a4
commit 821e8a07da
4 changed files with 24 additions and 24 deletions

View File

@@ -762,7 +762,7 @@ static void
filter_defaults(void) filter_defaults(void)
{ {
struct defaults *def, *next; struct defaults *def, *next;
struct member_list *binding = NULL; struct member_list *prev_binding = NULL;
debug_decl(filter_defaults, SUDOERS_DEBUG_DEFAULTS) debug_decl(filter_defaults, SUDOERS_DEBUG_DEFAULTS)
TAILQ_FOREACH_SAFE(def, &defaults, entries, next) { TAILQ_FOREACH_SAFE(def, &defaults, entries, next) {
@@ -770,17 +770,17 @@ filter_defaults(void)
case DEFAULTS_USER: case DEFAULTS_USER:
if (!userlist_matches_filter(def->binding)) { if (!userlist_matches_filter(def->binding)) {
TAILQ_REMOVE(&defaults, def, entries); TAILQ_REMOVE(&defaults, def, entries);
binding = free_default(def, binding); free_default(def, &prev_binding);
} else { } else {
binding = def->binding; prev_binding = def->binding;
} }
break; break;
case DEFAULTS_HOST: case DEFAULTS_HOST:
if (!hostlist_matches_filter(def->binding)) { if (!hostlist_matches_filter(def->binding)) {
TAILQ_REMOVE(&defaults, def, entries); TAILQ_REMOVE(&defaults, def, entries);
binding = free_default(def, binding); free_default(def, &prev_binding);
} else { } else {
binding = def->binding; prev_binding = def->binding;
} }
break; break;
default: default:

View File

@@ -871,13 +871,13 @@ free_members(struct member_list *members)
debug_return; debug_return;
} }
struct member_list * void
free_default(struct defaults *def, struct member_list *binding) free_default(struct defaults *def, struct member_list **binding)
{ {
debug_decl(free_default, SUDOERS_DEBUG_PARSER) debug_decl(free_default, SUDOERS_DEBUG_PARSER)
if (def->binding != binding) { if (def->binding != *binding) {
binding = def->binding; *binding = def->binding;
free_members(def->binding); free_members(def->binding);
free(def->binding); free(def->binding);
} }
@@ -886,14 +886,14 @@ free_default(struct defaults *def, struct member_list *binding)
free(def->val); free(def->val);
free(def); free(def);
debug_return_ptr(binding); debug_return;
} }
void void
free_privilege(struct privilege *priv) free_privilege(struct privilege *priv)
{ {
struct member_list *runasuserlist = NULL, *runasgrouplist = NULL; struct member_list *runasuserlist = NULL, *runasgrouplist = NULL;
struct member_list *binding = NULL; struct member_list *prev_binding = NULL;
struct cmndspec *cs; struct cmndspec *cs;
struct defaults *def; struct defaults *def;
#ifdef HAVE_SELINUX #ifdef HAVE_SELINUX
@@ -946,7 +946,7 @@ free_privilege(struct privilege *priv)
} }
while ((def = TAILQ_FIRST(&priv->defaults)) != NULL) { while ((def = TAILQ_FIRST(&priv->defaults)) != NULL) {
TAILQ_REMOVE(&priv->defaults, def, entries); TAILQ_REMOVE(&priv->defaults, def, entries);
binding = free_default(def, binding); free_default(def, &prev_binding);
} }
free(priv); free(priv);
@@ -983,7 +983,7 @@ free_userspec(struct userspec *us)
bool bool
init_parser(const char *path, bool quiet) init_parser(const char *path, bool quiet)
{ {
struct member_list *binding = NULL; struct member_list *prev_binding = NULL;
struct defaults *def; struct defaults *def;
struct userspec *us; struct userspec *us;
bool ret = true; bool ret = true;
@@ -996,7 +996,7 @@ init_parser(const char *path, bool quiet)
TAILQ_INIT(&userspecs); TAILQ_INIT(&userspecs);
TAILQ_FOREACH_SAFE(def, &defaults, entries, next) { TAILQ_FOREACH_SAFE(def, &defaults, entries, next) {
binding = free_default(def, binding); free_default(def, &prev_binding);
} }
TAILQ_INIT(&defaults); TAILQ_INIT(&defaults);

View File

@@ -1099,13 +1099,13 @@ free_members(struct member_list *members)
debug_return; debug_return;
} }
struct member_list * void
free_default(struct defaults *def, struct member_list *binding) free_default(struct defaults *def, struct member_list **binding)
{ {
debug_decl(free_default, SUDOERS_DEBUG_PARSER) debug_decl(free_default, SUDOERS_DEBUG_PARSER)
if (def->binding != binding) { if (def->binding != *binding) {
binding = def->binding; *binding = def->binding;
free_members(def->binding); free_members(def->binding);
free(def->binding); free(def->binding);
} }
@@ -1114,14 +1114,14 @@ free_default(struct defaults *def, struct member_list *binding)
free(def->val); free(def->val);
free(def); free(def);
debug_return_ptr(binding); debug_return;
} }
void void
free_privilege(struct privilege *priv) free_privilege(struct privilege *priv)
{ {
struct member_list *runasuserlist = NULL, *runasgrouplist = NULL; struct member_list *runasuserlist = NULL, *runasgrouplist = NULL;
struct member_list *binding = NULL; struct member_list *prev_binding = NULL;
struct cmndspec *cs; struct cmndspec *cs;
struct defaults *def; struct defaults *def;
#ifdef HAVE_SELINUX #ifdef HAVE_SELINUX
@@ -1174,7 +1174,7 @@ free_privilege(struct privilege *priv)
} }
while ((def = TAILQ_FIRST(&priv->defaults)) != NULL) { while ((def = TAILQ_FIRST(&priv->defaults)) != NULL) {
TAILQ_REMOVE(&priv->defaults, def, entries); TAILQ_REMOVE(&priv->defaults, def, entries);
binding = free_default(def, binding); free_default(def, &prev_binding);
} }
free(priv); free(priv);
@@ -1211,7 +1211,7 @@ free_userspec(struct userspec *us)
bool bool
init_parser(const char *path, bool quiet) init_parser(const char *path, bool quiet)
{ {
struct member_list *binding = NULL; struct member_list *prev_binding = NULL;
struct defaults *def; struct defaults *def;
struct userspec *us; struct userspec *us;
bool ret = true; bool ret = true;
@@ -1224,7 +1224,7 @@ init_parser(const char *path, bool quiet)
TAILQ_INIT(&userspecs); TAILQ_INIT(&userspecs);
TAILQ_FOREACH_SAFE(def, &defaults, entries, next) { TAILQ_FOREACH_SAFE(def, &defaults, entries, next) {
binding = free_default(def, binding); free_default(def, &prev_binding);
} }
TAILQ_INIT(&defaults); TAILQ_INIT(&defaults);

View File

@@ -269,7 +269,7 @@ void free_member(struct member *m);
void free_members(struct member_list *members); void free_members(struct member_list *members);
void free_privilege(struct privilege *priv); void free_privilege(struct privilege *priv);
void free_userspec(struct userspec *us); void free_userspec(struct userspec *us);
struct member_list *free_default(struct defaults *def, struct member_list *binding); void free_default(struct defaults *def, struct member_list **binding);
/* match_addr.c */ /* match_addr.c */
bool addr_matches(char *n); bool addr_matches(char *n);