BUG/MEDIUM: pattern: Segfault in binary parser
authorThierry FOURNIER <tfournier@exceliance.fr>
Tue, 21 Jan 2014 09:59:24 +0000 (10:59 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 21 Jan 2014 21:14:21 +0000 (22:14 +0100)
The functions pat_parse_* must return 0 if fail and the number of
elements eated from **text if not fail. The function pat_parse_bin()
returns 0 or the length parsed. This causes a segfault. I just apply the
double operator "!" on the result of the function pat_parse_bin() and
the return value value match the expected value.

src/pattern.c

index 38b1383..b053201 100644 (file)
@@ -445,12 +445,18 @@ int pat_parse_bin(const char **text, struct pattern *pattern, enum pat_usage usa
        pattern->expect_type = SMP_T_CBIN;
 
        if (usage == PAT_U_COMPILE)
-               return parse_binary(*text, &pattern->ptr.str, &pattern->len, err);
+               /* If the parse_binary fails, it returns 0. In succes case, it returns
+                * the length of the arsed binary content. The function pat_parse_* 
+                * must return 0 if fail and the number of elements eated from **text
+                * if not fail. In succes case, this function eat always 1 elements.
+                * The double operator "!" converts the range "1-n" to "1".
+                */
+               return !!parse_binary(*text, &pattern->ptr.str, &pattern->len, err);
 
        trash = get_trash_chunk();
        pattern->len = trash->size;
        pattern->ptr.str = trash->str;
-       return parse_binary(*text, &pattern->ptr.str, &pattern->len, err);
+       return !!parse_binary(*text, &pattern->ptr.str, &pattern->len, err);
 }
 
 /* Parse and concatenate all further strings into one. */