[prelude-cvslog] r10632 - libprelude/trunk/src
noreply at prelude-ids.org
noreply at prelude-ids.org
Mon Jul 7 18:38:04 CEST 2008
Author: yoann
Date: 2008-07-07 18:38:04 +0200 (Mon, 07 Jul 2008)
New Revision: 10632
Modified:
libprelude/trunk/src/idmef-criteria-string.lex.l
libprelude/trunk/src/idmef-criteria-string.yac.y
Log:
Allow IDMEF criteria with multiples values for a single path,
as can be seen in the following example:
alert.classification.text = (A || B || C || D)
This will be internally translated to the original criteria language:
alert.classification.text = A || alert.classification.text = B || alert.classification.text = C || alert.classification.text = D
Modified: libprelude/trunk/src/idmef-criteria-string.lex.l
===================================================================
--- libprelude/trunk/src/idmef-criteria-string.lex.l 2008-07-03 12:02:49 UTC (rev 10631)
+++ libprelude/trunk/src/idmef-criteria-string.lex.l 2008-07-07 16:38:04 UTC (rev 10632)
@@ -51,7 +51,11 @@
int yylex_destroy(void);
+static prelude_bool_t in_parenthesis = FALSE;
+static void do_push(void);
+static void do_pop(void);
+
static char *escape_str(char *str)
{
size_t w = 0, i = 0;
@@ -72,7 +76,6 @@
return str;
}
-
%}
IDMEF_PATH ([a-zA-Z0-9_\-]+(\(\-?[0-9\*]+\))?\.?)+
@@ -83,42 +86,16 @@
%option noyywrap
%option stack
-%x IDMEF_VALUE
+%x HAS_PATH
%%
-substr { yy_push_state(IDMEF_VALUE); return TOK_RELATION_SUBSTRING; }
-\!substr { yy_push_state(IDMEF_VALUE); return TOK_RELATION_NOT_SUBSTRING; }
-substr\* { yy_push_state(IDMEF_VALUE); return TOK_RELATION_SUBSTRING_NOCASE; }
-\!substr\* { yy_push_state(IDMEF_VALUE); return TOK_RELATION_NOT_SUBSTRING_NOCASE; }
-
{IDMEF_PATH} {
yylval.str = strdup(yytext);
+ yy_push_state(HAS_PATH);
return TOK_IDMEF_PATH;
}
-\<\> { yy_push_state(IDMEF_VALUE); return TOK_RELATION_SUBSTRING; }
-\<\>\* { yy_push_state(IDMEF_VALUE); return TOK_RELATION_SUBSTRING_NOCASE; }
-\!\<\> { yy_push_state(IDMEF_VALUE); return TOK_RELATION_NOT_SUBSTRING; }
-\!\<\>\* { yy_push_state(IDMEF_VALUE); return TOK_RELATION_NOT_SUBSTRING_NOCASE; }
-
-\> { yy_push_state(IDMEF_VALUE); return TOK_RELATION_GREATER; }
-\>\= { yy_push_state(IDMEF_VALUE); return TOK_RELATION_GREATER_OR_EQUAL; }
-\< { yy_push_state(IDMEF_VALUE); return TOK_RELATION_LESS; }
-\<\= { yy_push_state(IDMEF_VALUE); return TOK_RELATION_LESS_OR_EQUAL; }
-
-\~ { yy_push_state(IDMEF_VALUE); return TOK_RELATION_REGEXP; }
-\~\* { yy_push_state(IDMEF_VALUE); return TOK_RELATION_REGEXP_NOCASE; }
-\!\~ { yy_push_state(IDMEF_VALUE); return TOK_RELATION_NOT_REGEXP; }
-\!\~\* { yy_push_state(IDMEF_VALUE); return TOK_RELATION_NOT_REGEXP_NOCASE; }
-
-\=\= { yy_push_state(IDMEF_VALUE); return TOK_RELATION_EQUAL; }
-\= { yy_push_state(IDMEF_VALUE); return TOK_RELATION_EQUAL; }
-\=\* { yy_push_state(IDMEF_VALUE); return TOK_RELATION_EQUAL_NOCASE; }
-\!\= { yy_push_state(IDMEF_VALUE); return TOK_RELATION_NOT_EQUAL; }
-\!\=\* { yy_push_state(IDMEF_VALUE); return TOK_RELATION_NOT_EQUAL_NOCASE; }
-\! { return TOK_RELATION_IS_NULL; }
-
\&\& { return TOK_OPERATOR_AND; }
\& { return TOK_OPERATOR_AND; }
\|\| { return TOK_OPERATOR_OR; }
@@ -127,50 +104,103 @@
\( { return '('; }
\) { return ')'; }
-<IDMEF_VALUE>{SQSTRING} {
+{BLANK} {
+ /* nop */;
+ }
+
+. {
+ /* invalid token */
+ yylval.str = strdup(yytext);
+ return TOK_ERROR;
+ }
+
+
+<HAS_PATH>\<\> { do_push(); return TOK_RELATION_SUBSTRING; }
+<HAS_PATH>\<\>\* { do_push(); return TOK_RELATION_SUBSTRING_NOCASE; }
+<HAS_PATH>\!\<\> { do_push(); return TOK_RELATION_NOT_SUBSTRING; }
+<HAS_PATH>\!\<\>\* { do_push(); return TOK_RELATION_NOT_SUBSTRING_NOCASE; }
+
+<HAS_PATH>\> { do_push(); return TOK_RELATION_GREATER; }
+<HAS_PATH>\>\= { do_push(); return TOK_RELATION_GREATER_OR_EQUAL; }
+<HAS_PATH>\< { do_push(); return TOK_RELATION_LESS; }
+<HAS_PATH>\<\= { do_push(); return TOK_RELATION_LESS_OR_EQUAL; }
+
+<HAS_PATH>\~ { do_push(); return TOK_RELATION_REGEXP; }
+<HAS_PATH>\~\* { do_push(); return TOK_RELATION_REGEXP_NOCASE; }
+<HAS_PATH>\!\~ { do_push(); return TOK_RELATION_NOT_REGEXP; }
+<HAS_PATH>\!\~\* { do_push(); return TOK_RELATION_NOT_REGEXP_NOCASE; }
+
+<HAS_PATH>\=\= { do_push(); return TOK_RELATION_EQUAL; }
+<HAS_PATH>\= { do_push(); return TOK_RELATION_EQUAL; }
+<HAS_PATH>\=\* { do_push(); return TOK_RELATION_EQUAL_NOCASE; }
+<HAS_PATH>\!\= { do_push(); return TOK_RELATION_NOT_EQUAL; }
+<HAS_PATH>\!\=\* { do_push(); return TOK_RELATION_NOT_EQUAL_NOCASE; }
+<HAS_PATH>\! { return TOK_RELATION_IS_NULL; }
+
+<HAS_PATH>\&\& { return TOK_OPERATOR_AND; }
+<HAS_PATH>\& { return TOK_OPERATOR_AND; }
+<HAS_PATH>\|\| { return TOK_OPERATOR_OR; }
+<HAS_PATH>\| { return TOK_OPERATOR_OR; }
+
+
+<HAS_PATH>\( {
+ in_parenthesis = TRUE;
+ return '(';
+ }
+
+<HAS_PATH>\) {
+ in_parenthesis = FALSE;
+ do_pop();
+ return ')';
+ }
+
+<HAS_PATH>{SQSTRING} {
yylval.str = escape_str(strndup(yytext + 1, yyleng - 2));
- yy_pop_state();
+
+ if ( ! in_parenthesis )
+ yy_pop_state();
+
return TOK_IDMEF_VALUE;
}
-<IDMEF_VALUE>{DQSTRING} {
+<HAS_PATH>{DQSTRING} {
yylval.str = escape_str(strndup(yytext + 1, yyleng - 2));
- yy_pop_state();
+ do_pop();
return TOK_IDMEF_VALUE;
}
-<IDMEF_VALUE>[^ \t\(\)\&\|]+ {
+
+<HAS_PATH>[^\&\|\(\) ]+ {
yylval.str = escape_str(strdup(yytext));
- yy_pop_state();
+ do_pop();
return TOK_IDMEF_VALUE;
}
-<IDMEF_VALUE>{BLANK} {
+<HAS_PATH>{BLANK} {
/* nop */;
}
-<IDMEF_VALUE>. {
- /* invalid token */
- return TOK_ERROR;
- }
+%%
-{BLANK} {
- /* nop */;
- }
+void _idmef_criteria_string_init_lexer(void);
-. {
- /* invalid token */
- yylval.str = strdup(yytext);
- return TOK_ERROR;
- }
+void _idmef_criteria_string_init_lexer(void)
+{
+ BEGIN INITIAL;
+}
-%%
-void _idmef_criteria_string_init_lexer(void);
+static void do_push(void)
+{
+}
-void _idmef_criteria_string_init_lexer(void)
+
+static void do_pop(void)
{
- BEGIN INITIAL;
+ if ( ! in_parenthesis ) {
+ yy_pop_state();
+ }
}
+
Modified: libprelude/trunk/src/idmef-criteria-string.yac.y
===================================================================
--- libprelude/trunk/src/idmef-criteria-string.yac.y 2008-07-03 12:02:49 UTC (rev 10631)
+++ libprelude/trunk/src/idmef-criteria-string.yac.y 2008-07-07 16:38:04 UTC (rev 10632)
@@ -41,9 +41,12 @@
#include "idmef-criteria.h"
#include "common.h"
-
+static int path_count = 0;
static int real_ret = 0;
+static idmef_path_t *cur_path;
static idmef_criteria_t *processed_criteria;
+static idmef_criterion_operator_t cur_operator;
+
pthread_mutex_t _criteria_parse_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -60,12 +63,42 @@
#define YYERROR_VERBOSE
+
+static int create_criteria(idmef_criteria_t **criteria, idmef_path_t *path,
+ idmef_criterion_value_t *value, idmef_criterion_operator_t operator)
+{
+ idmef_criterion_t *criterion;
+
+ real_ret = idmef_criteria_new(criteria);
+ if ( real_ret < 0 )
+ goto err;
+
+ if ( path_count++ > 0 )
+ idmef_path_ref(path);
+
+ real_ret = idmef_criterion_new(&criterion, path, value, operator);
+ if ( real_ret < 0 ) {
+ idmef_criteria_destroy(*criteria);
+ goto err;
+ }
+
+ idmef_criteria_set_criterion(*criteria, criterion);
+ return 0;
+
+err:
+ idmef_path_destroy(path);
+ cur_path = NULL;
+
+ return real_ret;
+}
+
+
%}
%union {
char *str;
int operator;
- idmef_criterion_t *criterion;
+ idmef_path_t *path;
idmef_criteria_t *criteria;
idmef_criterion_operator_t relation;
}
@@ -106,7 +139,10 @@
%type <criteria> criteria
%type <criteria> criteria_base
-%type <criterion> criterion
+%type <criteria> value
+%type <criteria> multiple_value
+%type <criteria> criterion
+%type <path> path
%type <relation> relation
%type <operator> operator
@@ -114,152 +150,149 @@
/* Grammar follows */
%%
-input: criteria {
- processed_criteria = $1;
- }
+input:
+ criteria {
+ processed_criteria = $1;
+ }
;
-criteria: criteria_base {
- $$ = $1;
- }
- | criteria operator criteria_base {
- if ( $2 == operator_or ) {
- idmef_criteria_or_criteria($1, $3);
- } else {
- idmef_criteria_and_criteria($1, $3);
- }
- $$ = $1;
- }
+criteria:
+ criteria_base {
+ $$ = $1;
+ }
+
+ | criteria operator criteria_base {
+ if ( $2 == operator_or )
+ idmef_criteria_or_criteria($1, $3);
+ else
+ idmef_criteria_and_criteria($1, $3);
+
+ $$ = $1;
+ }
;
-criteria_base: criterion {
- idmef_criteria_t *criteria;
+criteria_base:
+ criterion {
+ $$ = $1;
+ }
- real_ret = idmef_criteria_new(&criteria);
- if ( real_ret < 0 )
- YYABORT;
+ | '(' criteria ')' {
+ $$ = $2;
+ }
+;
- idmef_criteria_set_criterion(criteria, $1);
- $$ = criteria;
- }
- | '(' criteria ')' {
- $$ = $2;
- }
+criterion:
+ path relation '(' multiple_value ')' {
+ $$ = $4;
+ }
+
+ | path relation value {
+ $$ = $3;
+ }
+
+ | path {
+ idmef_criteria_t *criteria;
+
+ real_ret = create_criteria(&criteria, $1, NULL, IDMEF_CRITERION_OPERATOR_NOT|IDMEF_CRITERION_OPERATOR_NULL);
+ if ( real_ret < 0 )
+ YYABORT;
+
+ $$ = criteria;
+ }
+
+ | TOK_RELATION_IS_NULL path {
+ idmef_criteria_t *criteria;
+
+ real_ret = create_criteria(&criteria, $2, NULL, IDMEF_CRITERION_OPERATOR_NULL);
+ if ( real_ret < 0 )
+ YYABORT;
+
+ $$ = criteria;
+ }
;
-criterion: TOK_IDMEF_PATH relation TOK_IDMEF_VALUE {
- idmef_path_t *path = NULL;
- idmef_criterion_value_t *value = NULL;
- idmef_criterion_operator_t operator = $2;
- idmef_criterion_t *criterion;
- real_ret = idmef_path_new_fast(&path, $1);
- if ( real_ret < 0 ) {
- free($1);
- free($3);
- YYABORT;
- }
+path:
+ TOK_IDMEF_PATH {
+ real_ret = idmef_path_new_fast(&cur_path, $1);
+ free($1);
- real_ret = idmef_criterion_value_new_from_string(&value, path, $3, operator);
- if ( real_ret < 0 ) {
- free($1);
- free($3);
- idmef_path_destroy(path);
- YYABORT;
- }
+ if ( real_ret < 0 )
+ YYABORT;
- real_ret = idmef_criterion_new(&criterion, path, value, operator);
- if ( real_ret < 0 ) {
- free($1);
- free($3);
- idmef_path_destroy(path);
- idmef_criterion_value_destroy(value);
- YYABORT;
- }
+ path_count = 0;
+ $$ = cur_path;
+ }
+;
- free($1);
- free($3);
- $$ = criterion;
- }
- | TOK_IDMEF_PATH {
- idmef_path_t *path;
- idmef_criterion_t *criterion;
+value:
+ TOK_IDMEF_VALUE {
+ idmef_criteria_t *criteria;
+ idmef_criterion_value_t *value = NULL;
- real_ret = idmef_path_new_fast(&path, $1);
- if ( real_ret < 0 ) {
- free($1);
- YYABORT;
- }
+ real_ret = idmef_criterion_value_new_from_string(&value, cur_path, $1, cur_operator);
+ free($1);
- real_ret = idmef_criterion_new(&criterion, path, NULL,
- IDMEF_CRITERION_OPERATOR_NOT|
- IDMEF_CRITERION_OPERATOR_NULL);
- if ( real_ret < 0 ) {
- free($1);
- idmef_path_destroy(path);
- YYABORT;
- }
+ if ( real_ret < 0 )
+ YYABORT;
- free($1);
+ real_ret = create_criteria(&criteria, cur_path, value, cur_operator);
+ if ( real_ret < 0 )
+ YYABORT;
- $$ = criterion;
- }
- | TOK_RELATION_IS_NULL TOK_IDMEF_PATH {
- idmef_path_t *path;
- idmef_criterion_t *criterion;
+ $$ = criteria;
+ }
+;
- real_ret = idmef_path_new_fast(&path, $2);
- if ( real_ret < 0) {
- free($2);
- YYABORT;
- }
- real_ret = idmef_criterion_new(&criterion, path, NULL,
- IDMEF_CRITERION_OPERATOR_NULL);
- if ( real_ret < 0 ) {
- free($2);
- idmef_path_destroy(path);
- YYABORT;
- }
- free($2);
+multiple_value:
+ value operator multiple_value {
+ if ( $2 == operator_or )
+ idmef_criteria_or_criteria($1, $3);
+ else
+ idmef_criteria_and_criteria($1, $3);
- $$ = criterion;
- }
+ $$ = $1;
+ }
+
+ | value {
+ $$ = $1;
+ }
;
+
relation:
- TOK_RELATION_SUBSTRING { $$ = IDMEF_CRITERION_OPERATOR_SUBSTR; }
-| TOK_RELATION_SUBSTRING_NOCASE { $$ = IDMEF_CRITERION_OPERATOR_SUBSTR|IDMEF_CRITERION_OPERATOR_NOCASE; }
-| TOK_RELATION_NOT_SUBSTRING { $$ = IDMEF_CRITERION_OPERATOR_SUBSTR|IDMEF_CRITERION_OPERATOR_NOT; }
-| TOK_RELATION_NOT_SUBSTRING_NOCASE { $$ = IDMEF_CRITERION_OPERATOR_SUBSTR|IDMEF_CRITERION_OPERATOR_NOT|IDMEF_CRITERION_OPERATOR_NOCASE; }
-| TOK_RELATION_REGEXP { $$ = IDMEF_CRITERION_OPERATOR_REGEX; }
-| TOK_RELATION_REGEXP_NOCASE { $$ = IDMEF_CRITERION_OPERATOR_REGEX|IDMEF_CRITERION_OPERATOR_NOCASE; }
-| TOK_RELATION_NOT_REGEXP { $$ = IDMEF_CRITERION_OPERATOR_REGEX|IDMEF_CRITERION_OPERATOR_NOT; }
-| TOK_RELATION_NOT_REGEXP_NOCASE { $$ = IDMEF_CRITERION_OPERATOR_REGEX|IDMEF_CRITERION_OPERATOR_NOT|IDMEF_CRITERION_OPERATOR_NOCASE; }
-| TOK_RELATION_GREATER { $$ = IDMEF_CRITERION_OPERATOR_GREATER; }
-| TOK_RELATION_GREATER_OR_EQUAL { $$ = IDMEF_CRITERION_OPERATOR_GREATER|IDMEF_CRITERION_OPERATOR_EQUAL; }
-| TOK_RELATION_LESS { $$ = IDMEF_CRITERION_OPERATOR_LESSER; }
-| TOK_RELATION_LESS_OR_EQUAL { $$ = IDMEF_CRITERION_OPERATOR_LESSER|IDMEF_CRITERION_OPERATOR_EQUAL; }
-| TOK_RELATION_EQUAL { $$ = IDMEF_CRITERION_OPERATOR_EQUAL; }
-| TOK_RELATION_EQUAL_NOCASE { $$ = IDMEF_CRITERION_OPERATOR_EQUAL|IDMEF_CRITERION_OPERATOR_NOCASE; }
-| TOK_RELATION_NOT_EQUAL { $$ = IDMEF_CRITERION_OPERATOR_EQUAL|IDMEF_CRITERION_OPERATOR_NOT; }
-| TOK_RELATION_NOT_EQUAL_NOCASE { $$ = IDMEF_CRITERION_OPERATOR_EQUAL|IDMEF_CRITERION_OPERATOR_NOCASE|IDMEF_CRITERION_OPERATOR_NOT; }
-| TOK_RELATION_IS_NULL { $$ = IDMEF_CRITERION_OPERATOR_NULL; }
+ TOK_RELATION_SUBSTRING { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_SUBSTR; }
+| TOK_RELATION_SUBSTRING_NOCASE { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_SUBSTR|IDMEF_CRITERION_OPERATOR_NOCASE; }
+| TOK_RELATION_NOT_SUBSTRING { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_SUBSTR|IDMEF_CRITERION_OPERATOR_NOT; }
+| TOK_RELATION_NOT_SUBSTRING_NOCASE { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_SUBSTR|IDMEF_CRITERION_OPERATOR_NOT|IDMEF_CRITERION_OPERATOR_NOCASE; }
+| TOK_RELATION_REGEXP { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_REGEX; }
+| TOK_RELATION_REGEXP_NOCASE { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_REGEX|IDMEF_CRITERION_OPERATOR_NOCASE; }
+| TOK_RELATION_NOT_REGEXP { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_REGEX|IDMEF_CRITERION_OPERATOR_NOT; }
+| TOK_RELATION_NOT_REGEXP_NOCASE { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_REGEX|IDMEF_CRITERION_OPERATOR_NOT|IDMEF_CRITERION_OPERATOR_NOCASE; }
+| TOK_RELATION_GREATER { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_GREATER; }
+| TOK_RELATION_GREATER_OR_EQUAL { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_GREATER|IDMEF_CRITERION_OPERATOR_EQUAL; }
+| TOK_RELATION_LESS { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_LESSER; }
+| TOK_RELATION_LESS_OR_EQUAL { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_LESSER|IDMEF_CRITERION_OPERATOR_EQUAL; }
+| TOK_RELATION_EQUAL { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_EQUAL; }
+| TOK_RELATION_EQUAL_NOCASE { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_EQUAL|IDMEF_CRITERION_OPERATOR_NOCASE; }
+| TOK_RELATION_NOT_EQUAL { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_EQUAL|IDMEF_CRITERION_OPERATOR_NOT; }
+| TOK_RELATION_NOT_EQUAL_NOCASE { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_EQUAL|IDMEF_CRITERION_OPERATOR_NOCASE|IDMEF_CRITERION_OPERATOR_NOT; }
+| TOK_RELATION_IS_NULL { cur_operator = $$ = IDMEF_CRITERION_OPERATOR_NULL; }
| TOK_ERROR { real_ret = prelude_error_verbose(PRELUDE_ERROR_IDMEF_CRITERIA_PARSE,
"Criteria parser reported: Invalid operator found"); YYERROR; }
;
-operator: TOK_OPERATOR_AND { $$ = operator_and; }
- | TOK_OPERATOR_OR { $$ = operator_or; }
+operator: TOK_OPERATOR_AND { $$ = operator_and; }
+ | TOK_OPERATOR_OR { $$ = operator_or; }
;
%%
-
static void yyerror(char *s) /* Called by yyparse on error */
{
real_ret = prelude_error_verbose_make(PRELUDE_ERROR_SOURCE_IDMEF_CRITERIA,
More information about the Prelude-cvslog
mailing list