]> arthur.barton.de Git - netdata.git/commitdiff
detect excess characters at expression
authorCosta Tsaousis <costa@tsaousis.gr>
Thu, 11 Aug 2016 13:36:12 +0000 (16:36 +0300)
committerCosta Tsaousis <costa@tsaousis.gr>
Thu, 11 Aug 2016 13:36:12 +0000 (16:36 +0300)
profile/test-eval.c
src/eval.c
src/eval.h

index 76b4336f7f31fe7faf3c1b2f13192f0751b64812..2fc86781876d4183d3953b8c2f1a3fdc91b4c2c5 100644 (file)
@@ -270,7 +270,7 @@ int main(int argc, char **argv) {
 
        EVAL_EXPRESSION *exp = expression_parse(argv[1], &failed_at, &error);
        if(!exp)
-               printf("\nFAILED\nExpression: '%s'\nParsing stopped at: '%s'\nError code: %d (%s)\n", argv[1], (failed_at)?failed_at:"<NONE>", error, expression_strerror(error));
+               printf("\nFAILED\nExpression: '%s'\nParsing stopped at: '%s'\nError code: %d (%s)\n", argv[1], (failed_at)?((*failed_at)?failed_at:"<END OF EXPRESSION>"):"<NONE>", error, expression_strerror(error));
        
        else {
                printf("\nOK\nExpression: '%s'\nParsed as : '%s'\nError code: %d (%s)\n", argv[1], exp->parsed_as, error, expression_strerror(error));
index a0f18e00f421038a1129bb8f91d23a08a9be27e0..ac5e7d5595e0248cdbe0fd1253eec7466a6f8cb4 100644 (file)
@@ -695,7 +695,7 @@ static inline EVAL_NODE *parse_one_full_operand(const char **string, int *error)
         op1->operator = EVAL_OPERATOR_VALUE;
         eval_node_set_value_to_constant(op1, 0, number);
     }
-    else if(*string)
+    else if(**string)
         *error = EVAL_ERROR_UNKNOWN_OPERAND;
     else
         *error = EVAL_ERROR_MISSING_OPERAND;
@@ -741,7 +741,7 @@ static inline EVAL_NODE *parse_rest_of_expression(const char **string, int *erro
 
         return parse_rest_of_expression(string, error, op);
     }
-    else if(**string == EVAL_OPERATOR_EXPRESSION_CLOSE) {
+    else if(**string == ')') {
         ;
     }
     else if(**string) {
@@ -794,6 +794,14 @@ EVAL_EXPRESSION *expression_parse(const char *string, const char **failed_at, in
     s = string;
     EVAL_NODE *op = parse_full_expression(&s, &err);
 
+    if(*s) {
+        if(op) {
+            eval_node_free(op);
+            op = NULL;
+        }
+        err = EVAL_ERROR_REMAINING_GARBAGE;
+    }
+
     if (failed_at) *failed_at = s;
     if (error) *error = err;
 
@@ -852,6 +860,9 @@ const char *expression_strerror(int error) {
         case EVAL_ERROR_MISSING_OPERATOR:
             return "expected operator";
 
+        case EVAL_ERROR_REMAINING_GARBAGE:
+            return "remaining characters after expression";
+
         case EVAL_ERROR_INVALID_VALUE:
             return "invalid value structure - internal error";
 
index 1d1f9e02d71b1c354f3ec72cfaf74f32b037771e..1ac56bfe04eb120c4f064178d9d5ced51260680e 100644 (file)
@@ -35,13 +35,14 @@ typedef struct eval_expression {
 #define EVAL_ERROR_UNKNOWN_OPERAND 2
 #define EVAL_ERROR_MISSING_OPERAND 3
 #define EVAL_ERROR_MISSING_OPERATOR 4
+#define EVAL_ERROR_REMAINING_GARBAGE 5
 
 // evaluation errors
-#define EVAL_ERROR_INVALID_VALUE 5
-#define EVAL_ERROR_INVALID_NUMBER_OF_OPERANDS 6
-#define EVAL_ERROR_VALUE_IS_NAN 7
-#define EVAL_ERROR_VALUE_IS_INFINITE 8
-#define EVAL_ERROR_UNKNOWN_VARIABLE 9
+#define EVAL_ERROR_INVALID_VALUE 11
+#define EVAL_ERROR_INVALID_NUMBER_OF_OPERANDS 12
+#define EVAL_ERROR_VALUE_IS_NAN 13
+#define EVAL_ERROR_VALUE_IS_INFINITE 14
+#define EVAL_ERROR_UNKNOWN_VARIABLE 15
 
 // parse the given string as an expression and return:
 //   a pointer to an expression if it parsed OK