2
0
mirror of https://gitlab.com/apparmor/apparmor synced 2025-08-22 10:07:12 +00:00

Add new processid fn that handles both quoted and unquoted ids

There is a lot of duplication of code calling processqunquoted and
processquoted.  Move all this code to use the new processid fn.

Signed-off-by: John Johansen <john.johansen@canonical.com>
Acked-by: Kees Cook <kees@ubuntu.com>
This commit is contained in:
John Johansen 2012-01-02 16:48:44 -08:00
parent 37e2975d4d
commit 7f9c79e345
3 changed files with 22 additions and 66 deletions

View File

@ -271,6 +271,7 @@ extern struct var_string *split_out_var(char *string);
extern void free_var_string(struct var_string *var); extern void free_var_string(struct var_string *var);
/* parser_misc.c */ /* parser_misc.c */
extern char *processid(char *string, int len);
extern char *processquoted(char *string, int len); extern char *processquoted(char *string, int len);
extern char *processunquoted(char *string, int len); extern char *processunquoted(char *string, int len);
extern int get_keyword_token(const char *keyword); extern int get_keyword_token(const char *keyword);

View File

@ -247,7 +247,7 @@ LT_EQUAL <=
} }
<SUB_NAME>{ <SUB_NAME>{
{ID}+ { ({ID}+|{QUOTED_ID}) {
/* Ugh, this is a gross hack. I used to use /* Ugh, this is a gross hack. I used to use
* {ID}+ to match all TOK_IDs, but that would * {ID}+ to match all TOK_IDs, but that would
* also match TOK_MODE + TOK_END_OF_RULE * also match TOK_MODE + TOK_END_OF_RULE
@ -256,25 +256,11 @@ LT_EQUAL <=
* match any random string, I go into a * match any random string, I go into a
* separate state. */ * separate state. */
DUMP_PREPROCESS; DUMP_PREPROCESS;
yylval.id = processunquoted(yytext, yyleng); yylval.id = processid(yytext, yyleng);
PDEBUG("Found sub name: \"%s\"\n", yylval.id); PDEBUG("Found sub name: \"%s\"\n", yylval.id);
yy_pop_state(); yy_pop_state();
return TOK_ID; return TOK_ID;
} }
{QUOTED_ID} {
/* Ugh, this is a gross hack. I used to use
* {ID}+ to match all TOK_IDs, but that would
* also match TOK_MODE + TOK_END_OF_RULE
* without any spaces in between (because it's
* a longer match). So now, when I want to
* match any random string, I go into a
* separate state. */
DUMP_PREPROCESS;
yylval.id = processquoted(yytext, yyleng);
PDEBUG("Found sub name: \"%s\"\n", yylval.id);
yy_pop_state();
return TOK_ID;
}
[^\n] { [^\n] {
DUMP_PREPROCESS; DUMP_PREPROCESS;
@ -284,7 +270,7 @@ LT_EQUAL <=
} }
<SUB_NAME2>{ <SUB_NAME2>{
{ID}+ { ({ID}+|{QUOTED_ID}) {
/* Ugh, this is a gross hack. I used to use /* Ugh, this is a gross hack. I used to use
* {ID}+ to match all TOK_IDs, but that would * {ID}+ to match all TOK_IDs, but that would
* also match TOK_MODE + TOK_END_OF_RULE * also match TOK_MODE + TOK_END_OF_RULE
@ -293,21 +279,7 @@ LT_EQUAL <=
* match any random string, I go into a * match any random string, I go into a
* separate state. */ * separate state. */
DUMP_PREPROCESS; DUMP_PREPROCESS;
yylval.id = processunquoted(yytext, yyleng); yylval.id = processid(yytext, yyleng);
PDEBUG("Found sub name: \"%s\"\n", yylval.id);
yy_pop_state();
return TOK_ID;
}
{QUOTED_ID} {
/* Ugh, this is a gross hack. I used to use
* {ID}+ to match all TOK_IDs, but that would
* also match TOK_MODE + TOK_END_OF_RULE
* without any spaces in between (because it's
* a longer match). So now, when I want to
* match any random string, I go into a
* separate state. */
DUMP_PREPROCESS;
yylval.id = processquoted(yytext, yyleng);
PDEBUG("Found sub name: \"%s\"\n", yylval.id); PDEBUG("Found sub name: \"%s\"\n", yylval.id);
yy_pop_state(); yy_pop_state();
return TOK_ID; return TOK_ID;
@ -364,16 +336,9 @@ LT_EQUAL <=
<ASSIGN_MODE>{ <ASSIGN_MODE>{
{WS}+ { DUMP_PREPROCESS; /* Eat whitespace */ } {WS}+ { DUMP_PREPROCESS; /* Eat whitespace */ }
{ID}+ { ({ID}+|{QUOTED_ID}) {
DUMP_PREPROCESS; DUMP_PREPROCESS;
yylval.var_val = processunquoted(yytext, yyleng); yylval.var_val = processid(yytext, yyleng);
PDEBUG("Found assignment value: \"%s\"\n", yylval.var_val);
return TOK_VALUE;
}
{QUOTED_ID} {
DUMP_PREPROCESS;
yylval.var_val = processquoted(yytext, yyleng);
PDEBUG("Found assignment value: \"%s\"\n", yylval.var_val); PDEBUG("Found assignment value: \"%s\"\n", yylval.var_val);
return TOK_VALUE; return TOK_VALUE;
} }
@ -431,7 +396,7 @@ LT_EQUAL <=
return TOK_ARROW; return TOK_ARROW;
} }
{ID}+ { ({ID}+|{QUOTED_ID}) {
/* Ugh, this is a gross hack. I used to use /* Ugh, this is a gross hack. I used to use
* {ID}+ to match all TOK_IDs, but that would * {ID}+ to match all TOK_IDs, but that would
* also match TOK_MODE + TOK_END_OF_RULE * also match TOK_MODE + TOK_END_OF_RULE
@ -440,25 +405,11 @@ LT_EQUAL <=
* match any random string, I go into a * match any random string, I go into a
* separate state. */ * separate state. */
DUMP_PREPROCESS; DUMP_PREPROCESS;
yylval.id = processunquoted(yytext, yyleng); yylval.id = processid(yytext, yyleng);
PDEBUG("Found change profile name: \"%s\"\n", yylval.id); PDEBUG("Found change profile name: \"%s\"\n", yylval.id);
yy_pop_state(); yy_pop_state();
return TOK_ID; return TOK_ID;
} }
{QUOTED_ID} {
/* Ugh, this is a gross hack. I used to use
* {ID}+ to match all TOK_IDs, but that would
* also match TOK_MODE + TOK_END_OF_RULE
* without any spaces in between (because it's
* a longer match). So now, when I want to
* match any random string, I go into a
* separate state. */
DUMP_PREPROCESS;
yylval.id = processquoted(yytext, yyleng);
PDEBUG("Found change profile quoted name: \"%s\"\n", yylval.id);
yy_pop_state();
return TOK_ID;
}
{WS}+ { DUMP_PREPROCESS; /* Ignoring whitespace */ } {WS}+ { DUMP_PREPROCESS; /* Ignoring whitespace */ }
[^\n] { [^\n] {
@ -568,16 +519,9 @@ LT_EQUAL <=
return TOK_CLOSE; return TOK_CLOSE;
} }
{PATHNAME} { ({PATHNAME}|{QPATHNAME}) {
DUMP_PREPROCESS; DUMP_PREPROCESS;
yylval.id = processunquoted(yytext, yyleng); yylval.id = processid(yytext, yyleng);
PDEBUG("Found id: \"%s\"\n", yylval.id);
return TOK_ID;
}
{QPATHNAME} {
DUMP_PREPROCESS;
yylval.id = processquoted(yytext, yyleng);
PDEBUG("Found id: \"%s\"\n", yylval.id); PDEBUG("Found id: \"%s\"\n", yylval.id);
return TOK_ID; return TOK_ID;
} }

View File

@ -17,6 +17,7 @@
/* assistance routines */ /* assistance routines */
#include <assert.h>
#include <ctype.h> #include <ctype.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -397,6 +398,16 @@ char *processunquoted(char *string, int len)
return tmp; return tmp;
} }
char *processid(char *string, int len)
{
/* lexer should never call this fn if len <= 0 */
assert(len > 0);
if (*string == '"')
return processquoted(string, len);
return processunquoted(string, len);
}
/* rewrite a quoted string substituting escaped characters for the /* rewrite a quoted string substituting escaped characters for the
* real thing. Strip the quotes around the string */ * real thing. Strip the quotes around the string */