ovsdb: Fix segfault when a column set contains an invalid column name.
authorBen Pfaff <blp@nicira.com>
Sat, 12 Dec 2009 00:37:29 +0000 (16:37 -0800)
committerBen Pfaff <blp@nicira.com>
Sat, 12 Dec 2009 00:37:29 +0000 (16:37 -0800)
ovsdb/column.c
tests/ovsdb-query.at
tests/test-ovsdb.c

index dc93dc71b7fdcb9b6bdf187c15b8b6480ea8e165..73dc9c24c16015d97dc8d0b5945e45ca2335fc88 100644 (file)
@@ -143,6 +143,7 @@ ovsdb_column_set_from_json(const struct json *json,
 
         return NULL;
     } else {
+        struct ovsdb_error *error = NULL;
         size_t i;
 
         if (json->type != JSON_ARRAY) {
@@ -152,26 +153,34 @@ ovsdb_column_set_from_json(const struct json *json,
         /* XXX this is O(n**2) */
         for (i = 0; i < json->u.array.n; i++) {
             struct ovsdb_column *column;
+            const char *s;
 
             if (json->u.array.elems[i]->type != JSON_STRING) {
                 goto error;
             }
 
-            column = shash_find_data(&table->schema->columns,
-                                     json->u.array.elems[i]->u.string);
-            if (ovsdb_column_set_contains(set, column->index)) {
+            s = json->u.array.elems[i]->u.string;
+            column = shash_find_data(&table->schema->columns, s);
+            if (!column) {
+                error = ovsdb_syntax_error(json, NULL, "%s is not a valid "
+                                           "column name", s);
+                goto error;
+            } else if (ovsdb_column_set_contains(set, column->index)) {
                 goto error;
             }
             ovsdb_column_set_add(set, column);
         }
-
         return NULL;
-    }
 
-error:
-    ovsdb_column_set_destroy(set);
-    return ovsdb_syntax_error(json, NULL,
-                              "array of distinct column names expected");
+    error:
+        ovsdb_column_set_destroy(set);
+        ovsdb_column_set_init(set);
+        if (!error) {
+            error = ovsdb_syntax_error(json, NULL, "array of distinct column "
+                                       "names expected");
+        }
+        return error;
+    }
 }
 
 struct json *
index c39aa1210d61401275b9126d69049182274c4790..2c2b648d80da23de5592813df5d5ff283aeccaee 100644 (file)
@@ -533,3 +533,11 @@ query 25: a-a-a
 query 26: ababa
 query 27: a-a-a],
   [query])
+
+OVSDB_CHECK_NEGATIVE([parse colunn set containing bad name],
+  [[query-distinct \
+    '{"columns": {"i": {"type": "integer"}}}' \
+    '[{"i": 0}]' \
+    '[[]]' \
+    '["i", "bad"]']],
+  [bad is not a valid column name])
index 4f44afe86979436cf0ccb193e2e2e274eb3aadfb..a4a5f019a76c642cd80b6468730935827a0c3a9b 100644 (file)
@@ -791,7 +791,7 @@ do_query_distinct(int argc UNUSED, char *argv[])
 
     /* Parse column set. */
     json = parse_json(argv[4]);
-    ovsdb_column_set_from_json(json, table, &columns);
+    check_ovsdb_error(ovsdb_column_set_from_json(json, table, &columns));
     json_destroy(json);
 
     /* Parse rows, add to table. */