From b27c0d35dd198c5cd2264f681c4f2d20efbe2e75 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 20 Apr 2012 16:04:47 +0200 Subject: [PATCH] MEDIUM: pattern: report the precise argument parsing error when known. The argument parser knows what exact error it has faced, and the pattern parser is able to report errors, so let's make use of it. From now on, it becomes possible to detect such things : $ ./haproxy -db -f echo5.cfg [ALERT] 110/160344 (4791) : parsing [echo5.cfg:38] : 'stick': invalid arg 2 in fetch method 'payload' : Missing arguments (got 1/2), type 'unsigned integer' expected. [ALERT] 110/160344 (4791) : parsing [echo5.cfg:39] : 'stick': invalid args in fetch method 'payload' : payload length must be > 0. [ALERT] 110/160344 (4791) : parsing [echo5.cfg:40] : 'stick': invalid arg 3 in fetch method 'payload_lv' : Failed to parse 'x' as type 'signed integer'. [ALERT] 110/160344 (4791) : parsing [echo5.cfg:41] : 'stick': invalid arg 4 in fetch method 'payload_lv' : End of arguments expected at ',13'. [ALERT] 110/160344 (4791) : Error(s) found in configuration file : echo5.cfg [ALERT] 110/160344 (4791) : Fatal errors found in configuration. --- src/pattern.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/pattern.c b/src/pattern.c index c2de92d4d..0c568efa0 100644 --- a/src/pattern.c +++ b/src/pattern.c @@ -316,7 +316,8 @@ struct pattern_expr *pattern_parse_expr(char **str, int *idx, char *err, int err expr->fetch = fetch; if (end != endw) { - char *err_msg; + char *err_msg = NULL; + int err_arg; if (!fetch->arg_mask) { p = my_strndup(str[*idx], endw - str[*idx]); @@ -327,12 +328,13 @@ struct pattern_expr *pattern_parse_expr(char **str, int *idx, char *err, int err goto out_error; } - if (make_arg_list(endw + 1, end - endw - 2, fetch->arg_mask, &expr->arg_p, NULL, NULL, NULL) < 0) { + if (make_arg_list(endw + 1, end - endw - 2, fetch->arg_mask, &expr->arg_p, &err_msg, NULL, &err_arg) < 0) { p = my_strndup(str[*idx], endw - str[*idx]); if (p) { - snprintf(err, err_size, "invalid args in fetch method '%s'.", p); + snprintf(err, err_size, "invalid arg %d in fetch method '%s' : %s.", err_arg+1, p, err_msg); free(p); } + free(err_msg); goto out_error; } @@ -405,7 +407,8 @@ struct pattern_expr *pattern_parse_expr(char **str, int *idx, char *err, int err conv_expr->conv = conv; if (end != endw) { - char *err_msg; + char *err_msg = NULL; + int err_arg; if (!conv->arg_mask) { p = my_strndup(str[*idx], endw - str[*idx]); @@ -417,12 +420,13 @@ struct pattern_expr *pattern_parse_expr(char **str, int *idx, char *err, int err goto out_error; } - if (make_arg_list(endw + 1, end - endw - 2, conv->arg_mask, &conv_expr->arg_p, NULL, NULL, NULL) < 0) { + if (make_arg_list(endw + 1, end - endw - 2, conv->arg_mask, &conv_expr->arg_p, &err_msg, NULL, &err_arg) < 0) { p = my_strndup(str[*idx], endw - str[*idx]); if (p) { - snprintf(err, err_size, "invalid args in conv method '%s'.", p); + snprintf(err, err_size, "invalid arg %d in conv method '%s' : %s.", err_arg+1, p, err_msg); free(p); } + free(err_msg); goto out_error; }