X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Fcommon%2Fparam-validation%2Fparam-validation.c;h=b52332bcaac106cb6a8f4f2b44947abd43f45cc5;hb=8839434ec07524e32c8940d31e3083cf29d3074a;hp=755310e509b96f08d3dc02c588a1f82622ead898;hpb=d0d4e0ed487ea23aaf0d023513c0a4d86901b79b;p=babeltrace.git diff --git a/src/plugins/common/param-validation/param-validation.c b/src/plugins/common/param-validation/param-validation.c index 755310e5..b52332bc 100644 --- a/src/plugins/common/param-validation/param-validation.c +++ b/src/plugins/common/param-validation/param-validation.c @@ -159,19 +159,21 @@ bt_bool validate_map_value_entry(const char *key, const bt_value *value, void *v_data) { struct validate_map_value_data *data = v_data; - const struct bt_param_validation_map_value_entry_descr *candidate; + const struct bt_param_validation_map_value_entry_descr *entry = NULL; guint i; /* Check if this key is in the available keys. */ for (i = 0; i < data->available_keys->len; i++) { - candidate = g_ptr_array_index(data->available_keys, i); + const struct bt_param_validation_map_value_entry_descr *candidate = + g_ptr_array_index(data->available_keys, i); if (g_str_equal(key, candidate->key)) { + entry = candidate; break; } } - if (i < data->available_keys->len) { + if (entry) { /* Key was found in available keys. */ g_ptr_array_remove_index_fast(data->available_keys, i); @@ -179,7 +181,7 @@ bt_bool validate_map_value_entry(const char *key, validate_ctx_push_map_scope(data->ctx, key); /* Validate the value of the entry. */ - data->status = validate_value(value, &candidate->value_descr, + data->status = validate_value(value, &entry->value_descr, data->ctx); validate_ctx_pop_scope(data->ctx); @@ -223,16 +225,14 @@ enum bt_param_validation_status validate_map_value( foreach_entry_status = bt_value_map_foreach_entry_const(map, validate_map_value_entry, &data); - if (foreach_entry_status == BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_MEMORY_ERROR) { - status = BT_PARAM_VALIDATION_STATUS_MEMORY_ERROR; - goto end; - } - - if (data.status != BT_PARAM_VALIDATION_STATUS_OK) { + if (foreach_entry_status == BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_INTERRUPTED) { + BT_ASSERT(data.status != BT_PARAM_VALIDATION_STATUS_OK); status = data.status; goto end; } + BT_ASSERT(data.status == BT_PARAM_VALIDATION_STATUS_OK); + for (i = 0; i < data.available_keys->len; i++) { const struct bt_param_validation_map_value_entry_descr *entry = g_ptr_array_index(data.available_keys, i); @@ -400,10 +400,10 @@ enum bt_param_validation_status bt_param_validation_validate( struct bt_param_validation_map_value_descr map_value_descr; enum bt_param_validation_status status; - ctx.error = NULL; + memset(&ctx, '\0', sizeof(ctx)); + ctx.scope_stack = g_array_new(FALSE, FALSE, sizeof(struct validate_ctx_stack_element)); - g_ptr_array_new_with_free_func(g_free); if (!ctx.scope_stack) { status = BT_PARAM_VALIDATION_STATUS_MEMORY_ERROR; goto end; @@ -417,5 +417,9 @@ end: *error = ctx.error; ctx.error = NULL; + if (ctx.scope_stack) { + g_array_free(ctx.scope_stack, TRUE); + } + return status; }