Code

store_lookup: Catch invalid values when parsing a matcher.
authorSebastian Harl <sh@tokkee.org>
Mon, 28 Jul 2014 07:15:19 +0000 (09:15 +0200)
committerSebastian Harl <sh@tokkee.org>
Mon, 28 Jul 2014 07:15:19 +0000 (09:15 +0200)
Added a unit-test exposing the segfault we would have seen previously.

src/core/store_lookup.c
t/unit/core/store_lookup_test.c

index 0bb157c76e7a49162e3832f5b9ae0e013372485a..8aa8ab085e4dd1fc40eb2586e95ea62cb506ba2c 100644 (file)
@@ -818,6 +818,9 @@ sdb_store_matcher_parse_cmp(const char *obj_type, const char *attr,
        else
                return NULL;
 
+       if (! value)
+               return NULL;
+
        if (value->type != SDB_TYPE_STRING) {
                if (type == SDB_ATTRIBUTE)
                        return parse_attr_cmp(attr, op, value);
index 351ae18da7dfd899c918c897da267503597d644b..43bb1e53d7746bcc4689895be686f5eeacd04aff 100644 (file)
@@ -421,6 +421,7 @@ START_TEST(test_parse_cmp)
                { "host",      NULL,   "<=", &hostname, -1 },
                { "host",      NULL,   ">=", &hostname, -1 },
                { "host",      NULL,   ">",  &hostname, -1 },
+               { "host",      NULL,   "=",  NULL,      -1 },
                { "service",   NULL,   "=",  &srvname,  MATCHER_NAME },
                { "service",   NULL,   "!=", &srvname,  MATCHER_NOT },
                { "service",   NULL,   "=~", &srvname,  MATCHER_NAME },
@@ -432,6 +433,7 @@ START_TEST(test_parse_cmp)
                { "service",   NULL,   "<=", &srvname,  -1 },
                { "service",   NULL,   ">=", &srvname,  -1 },
                { "service",   NULL,   ">",  &srvname,  -1 },
+               { "service",   NULL,   "=",  NULL,      -1 },
                { "attribute", NULL,   "=",  &attrname, MATCHER_NAME },
                { "attribute", NULL,   "!=", &attrname, MATCHER_NOT },
                { "attribute", NULL,   "=~", &attrname, MATCHER_NAME },
@@ -440,11 +442,13 @@ START_TEST(test_parse_cmp)
                { "attribute", NULL,   "<=", &attrname, -1 },
                { "attribute", NULL,   ">=", &attrname, -1 },
                { "attribute", NULL,   ">",  &attrname, -1 },
+               { "attribute", NULL,   "=",  NULL,      -1 },
                { "attribute", "attr", "=",  &attrname, MATCHER_ATTR },
                { "attribute", "attr", "!=", &attrname, MATCHER_NOT },
                { "attribute", "attr", "=~", &attrname, MATCHER_ATTR },
                { "attribute", "attr", "!~", &attrname, MATCHER_NOT },
                { "attribute", "attr", "&^", &attrname, -1 },
+               { "attribute", "attr", "<",  NULL,      -1 },
                { "attribute", "attr", "<",  &attrname, MATCHER_LT },
                { "attribute", "attr", "<=", &attrname, MATCHER_LE },
 /*             { "attribute", "attr", "=",  &attrname, MATCHER_EQ }, */