Fix: check for unknown enum/variant fields
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 9 Dec 2013 12:31:11 +0000 (07:31 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 9 Dec 2013 12:31:11 +0000 (07:31 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
types/variant.c

index 3641fa05d16b69a22074170917f5f653eaa17d4e..3972d787275fc47298319be6d290855045da00ae 100644 (file)
@@ -46,6 +46,9 @@ int bt_variant_rw(struct bt_stream_pos *ppos, struct bt_definition *definition)
        struct bt_definition *field;
 
        field = bt_variant_get_current_field(variant_definition);
+       if (!field) {
+               return -EINVAL;
+       }
        return generic_rw(ppos, field);
 }
 
@@ -261,16 +264,30 @@ struct bt_definition *bt_variant_get_current_field(struct definition_variant *va
        unsigned long index;
        GArray *tag_array;
        GQuark tag;
+       gpointer orig_key, value;
 
        tag_array = _enum->value;
+       if (!tag_array) {
+               /* Enumeration has unknown tag. */
+               fprintf(stderr, "[error] Enumeration used for variant has unknown tag.\n");
+               return NULL;
+       }
        /*
         * The 1 to 1 mapping from enumeration to value should have been already
         * checked. (see TODO above)
         */
        assert(tag_array->len == 1);
        tag = g_array_index(tag_array, GQuark, 0);
-       index = (unsigned long) g_hash_table_lookup(variant_declaration->untagged_variant->fields_by_tag,
-                                                   (gconstpointer) (unsigned long) tag);
+       if (!g_hash_table_lookup_extended(variant_declaration->untagged_variant->fields_by_tag,
+                       (gconstpointer) (unsigned long) tag,
+                       &orig_key,
+                       &value)) {
+               /* Cannot find matching field. */
+               fprintf(stderr, "[error] Cannot find matching field for enum field \"%s\" in variant.\n",
+                       g_quark_to_string(tag));
+               return NULL;
+       }
+       index = (unsigned long) value;
        variant->current_field = g_ptr_array_index(variant->fields, index);
        return variant->current_field;
 }
This page took 0.033929 seconds and 4 git commands to generate.