@@ -167,7 +167,7 @@ static struct defaults *new_default(char *, char *, short);
167167static struct member * new_member (char * , short );
168168static struct sudo_command * new_command (char * , char * );
169169static struct command_digest * new_digest (unsigned int , char * );
170- static void alias_error (const char * name , int errnum );
170+ static void alias_error (const char * name , short type , int errnum );
171171
172172#line 167 "gram.c"
173173
@@ -2927,7 +2927,7 @@ yyparse (void)
29272927 {
29282928 if (!alias_add (& parsed_policy , (yyvsp [-3 ].string ), HOSTALIAS ,
29292929 sudoers , alias_line , alias_column , (yyvsp [0 ].member ))) {
2930- alias_error ((yyvsp [-3 ].string ), errno );
2930+ alias_error ((yyvsp [-3 ].string ), HOSTALIAS , errno );
29312931 YYERROR ;
29322932 }
29332933 parser_leak_remove (LEAK_PTR , (yyvsp [-3 ].string ));
@@ -2960,7 +2960,7 @@ yyparse (void)
29602960 {
29612961 if (!alias_add (& parsed_policy , (yyvsp [-3 ].string ), CMNDALIAS ,
29622962 sudoers , alias_line , alias_column , (yyvsp [0 ].member ))) {
2963- alias_error ((yyvsp [-3 ].string ), errno );
2963+ alias_error ((yyvsp [-3 ].string ), CMNDALIAS , errno );
29642964 YYERROR ;
29652965 }
29662966 parser_leak_remove (LEAK_PTR , (yyvsp [-3 ].string ));
@@ -2993,7 +2993,7 @@ yyparse (void)
29932993 {
29942994 if (!alias_add (& parsed_policy , (yyvsp [-3 ].string ), RUNASALIAS ,
29952995 sudoers , alias_line , alias_column , (yyvsp [0 ].member ))) {
2996- alias_error ((yyvsp [-3 ].string ), errno );
2996+ alias_error ((yyvsp [-3 ].string ), RUNASALIAS , errno );
29972997 YYERROR ;
29982998 }
29992999 parser_leak_remove (LEAK_PTR , (yyvsp [-3 ].string ));
@@ -3016,7 +3016,7 @@ yyparse (void)
30163016 {
30173017 if (!alias_add (& parsed_policy , (yyvsp [-3 ].string ), USERALIAS ,
30183018 sudoers , alias_line , alias_column , (yyvsp [0 ].member ))) {
3019- alias_error ((yyvsp [-3 ].string ), errno );
3019+ alias_error ((yyvsp [-3 ].string ), USERALIAS , errno );
30203020 YYERROR ;
30213021 }
30223022 parser_leak_remove (LEAK_PTR , (yyvsp [-3 ].string ));
@@ -3475,12 +3475,27 @@ sudoerserror(const char *s)
34753475}
34763476
34773477static void
3478- alias_error (const char * name , int errnum )
3478+ alias_error (const char * name , short type , int errnum )
34793479{
3480- if (errnum == EEXIST )
3481- sudoerserrorf (U_ ("Alias \"%s\" already defined" ), name );
3482- else
3480+ if (errnum == EEXIST ) {
3481+ struct alias * a = alias_get (& parsed_policy , name , type );
3482+ if (a != NULL ) {
3483+ sudoerserrorf (
3484+ U_ ("duplicate %s \"%s\", previously defined at %s:%d:%d" ),
3485+ alias_type_to_string (type ), name , a -> file , a -> line , a -> column );
3486+ alias_put (a );
3487+ } else {
3488+ if (errno == ELOOP ) {
3489+ sudoerserrorf (U_ ("cycle in %s \"%s\"" ),
3490+ alias_type_to_string (type ), name );
3491+ } else {
3492+ sudoerserrorf (U_ ("duplicate %s \"%s\"" ),
3493+ alias_type_to_string (type ), name );
3494+ }
3495+ }
3496+ } else {
34833497 sudoerserror (N_ ("unable to allocate memory" ));
3498+ }
34843499}
34853500
34863501static struct defaults *
0 commit comments