2
0
mirror of https://github.com/sudo-project/sudo.git synced 2025-09-03 07:45:47 +00:00

Got back to calling alias_free() on alias_add() failure.

We now need to remove the name and members from the leak list
*before* calling alias_add() since alias_add() will consume them
for both success and failure.
This commit is contained in:
Todd C. Miller
2021-02-02 14:40:37 -07:00
parent 8f2254594f
commit bdb02b1eff
3 changed files with 18 additions and 18 deletions

View File

@@ -136,11 +136,11 @@ alias_add(struct sudoers_parse_tree *parse_tree, char *name, int type,
HLTQ_TO_TAILQ(&a->members, members, entries); HLTQ_TO_TAILQ(&a->members, members, entries);
switch (rbinsert(parse_tree->aliases, a, NULL)) { switch (rbinsert(parse_tree->aliases, a, NULL)) {
case 1: case 1:
free(a); alias_free(a);
errno = EEXIST; errno = EEXIST;
debug_return_bool(false); debug_return_bool(false);
case -1: case -1:
free(a); alias_free(a);
debug_return_bool(false); debug_return_bool(false);
} }
debug_return_bool(true); debug_return_bool(true);

View File

@@ -2828,13 +2828,13 @@ yyreduce:
case 113: /* hostalias: ALIAS $@1 '=' hostlist */ case 113: /* hostalias: ALIAS $@1 '=' hostlist */
#line 948 "gram.y" #line 948 "gram.y"
{ {
parser_leak_remove(LEAK_PTR, (yyvsp[-3].string));
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
if (!alias_add(&parsed_policy, (yyvsp[-3].string), HOSTALIAS, if (!alias_add(&parsed_policy, (yyvsp[-3].string), HOSTALIAS,
sudoers, alias_line, alias_column, (yyvsp[0].member))) { sudoers, alias_line, alias_column, (yyvsp[0].member))) {
alias_error((yyvsp[-3].string), errno); alias_error((yyvsp[-3].string), errno);
YYERROR; YYERROR;
} }
parser_leak_remove(LEAK_PTR, (yyvsp[-3].string));
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
} }
#line 2834 "gram.c" #line 2834 "gram.c"
break; break;
@@ -2861,13 +2861,13 @@ yyreduce:
case 120: /* cmndalias: ALIAS $@2 '=' cmndlist */ case 120: /* cmndalias: ALIAS $@2 '=' cmndlist */
#line 975 "gram.y" #line 975 "gram.y"
{ {
parser_leak_remove(LEAK_PTR, (yyvsp[-3].string));
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
if (!alias_add(&parsed_policy, (yyvsp[-3].string), CMNDALIAS, if (!alias_add(&parsed_policy, (yyvsp[-3].string), CMNDALIAS,
sudoers, alias_line, alias_column, (yyvsp[0].member))) { sudoers, alias_line, alias_column, (yyvsp[0].member))) {
alias_error((yyvsp[-3].string), errno); alias_error((yyvsp[-3].string), errno);
YYERROR; YYERROR;
} }
parser_leak_remove(LEAK_PTR, (yyvsp[-3].string));
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
} }
#line 2867 "gram.c" #line 2867 "gram.c"
break; break;
@@ -2894,13 +2894,13 @@ yyreduce:
case 127: /* runasalias: ALIAS $@3 '=' userlist */ case 127: /* runasalias: ALIAS $@3 '=' userlist */
#line 1002 "gram.y" #line 1002 "gram.y"
{ {
parser_leak_remove(LEAK_PTR, (yyvsp[-3].string));
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
if (!alias_add(&parsed_policy, (yyvsp[-3].string), RUNASALIAS, if (!alias_add(&parsed_policy, (yyvsp[-3].string), RUNASALIAS,
sudoers, alias_line, alias_column, (yyvsp[0].member))) { sudoers, alias_line, alias_column, (yyvsp[0].member))) {
alias_error((yyvsp[-3].string), errno); alias_error((yyvsp[-3].string), errno);
YYERROR; YYERROR;
} }
parser_leak_remove(LEAK_PTR, (yyvsp[-3].string));
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
} }
#line 2900 "gram.c" #line 2900 "gram.c"
break; break;
@@ -2917,13 +2917,13 @@ yyreduce:
case 132: /* useralias: ALIAS $@4 '=' userlist */ case 132: /* useralias: ALIAS $@4 '=' userlist */
#line 1021 "gram.y" #line 1021 "gram.y"
{ {
parser_leak_remove(LEAK_PTR, (yyvsp[-3].string));
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
if (!alias_add(&parsed_policy, (yyvsp[-3].string), USERALIAS, if (!alias_add(&parsed_policy, (yyvsp[-3].string), USERALIAS,
sudoers, alias_line, alias_column, (yyvsp[0].member))) { sudoers, alias_line, alias_column, (yyvsp[0].member))) {
alias_error((yyvsp[-3].string), errno); alias_error((yyvsp[-3].string), errno);
YYERROR; YYERROR;
} }
parser_leak_remove(LEAK_PTR, (yyvsp[-3].string));
parser_leak_remove(LEAK_MEMBER, (yyvsp[0].member));
} }
#line 2923 "gram.c" #line 2923 "gram.c"
break; break;

View File

@@ -946,13 +946,13 @@ hostalias : ALIAS {
alias_line = this_lineno; alias_line = this_lineno;
alias_column = sudolinebuf.toke_start + 1; alias_column = sudolinebuf.toke_start + 1;
} '=' hostlist { } '=' hostlist {
parser_leak_remove(LEAK_PTR, $1);
parser_leak_remove(LEAK_MEMBER, $4);
if (!alias_add(&parsed_policy, $1, HOSTALIAS, if (!alias_add(&parsed_policy, $1, HOSTALIAS,
sudoers, alias_line, alias_column, $4)) { sudoers, alias_line, alias_column, $4)) {
alias_error($1, errno); alias_error($1, errno);
YYERROR; YYERROR;
} }
parser_leak_remove(LEAK_PTR, $1);
parser_leak_remove(LEAK_MEMBER, $4);
} }
| reserved_alias '=' hostlist | reserved_alias '=' hostlist
; ;
@@ -973,13 +973,13 @@ cmndalias : ALIAS {
alias_line = this_lineno; alias_line = this_lineno;
alias_column = sudolinebuf.toke_start + 1; alias_column = sudolinebuf.toke_start + 1;
} '=' cmndlist { } '=' cmndlist {
parser_leak_remove(LEAK_PTR, $1);
parser_leak_remove(LEAK_MEMBER, $4);
if (!alias_add(&parsed_policy, $1, CMNDALIAS, if (!alias_add(&parsed_policy, $1, CMNDALIAS,
sudoers, alias_line, alias_column, $4)) { sudoers, alias_line, alias_column, $4)) {
alias_error($1, errno); alias_error($1, errno);
YYERROR; YYERROR;
} }
parser_leak_remove(LEAK_PTR, $1);
parser_leak_remove(LEAK_MEMBER, $4);
} }
| reserved_alias '=' cmndlist | reserved_alias '=' cmndlist
; ;
@@ -1000,13 +1000,13 @@ runasalias : ALIAS {
alias_line = this_lineno; alias_line = this_lineno;
alias_column = sudolinebuf.toke_start + 1; alias_column = sudolinebuf.toke_start + 1;
} '=' userlist { } '=' userlist {
parser_leak_remove(LEAK_PTR, $1);
parser_leak_remove(LEAK_MEMBER, $4);
if (!alias_add(&parsed_policy, $1, RUNASALIAS, if (!alias_add(&parsed_policy, $1, RUNASALIAS,
sudoers, alias_line, alias_column, $4)) { sudoers, alias_line, alias_column, $4)) {
alias_error($1, errno); alias_error($1, errno);
YYERROR; YYERROR;
} }
parser_leak_remove(LEAK_PTR, $1);
parser_leak_remove(LEAK_MEMBER, $4);
} }
| reserved_alias '=' userlist | reserved_alias '=' userlist
; ;
@@ -1019,13 +1019,13 @@ useralias : ALIAS {
alias_line = this_lineno; alias_line = this_lineno;
alias_column = sudolinebuf.toke_start + 1; alias_column = sudolinebuf.toke_start + 1;
} '=' userlist { } '=' userlist {
parser_leak_remove(LEAK_PTR, $1);
parser_leak_remove(LEAK_MEMBER, $4);
if (!alias_add(&parsed_policy, $1, USERALIAS, if (!alias_add(&parsed_policy, $1, USERALIAS,
sudoers, alias_line, alias_column, $4)) { sudoers, alias_line, alias_column, $4)) {
alias_error($1, errno); alias_error($1, errno);
YYERROR; YYERROR;
} }
parser_leak_remove(LEAK_PTR, $1);
parser_leak_remove(LEAK_MEMBER, $4);
} }
| reserved_alias '=' userlist | reserved_alias '=' userlist
; ;