projects
/
babeltrace.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: return error on empty list in get_unary_unsigned
[babeltrace.git]
/
plugins
/
ctf
/
common
/
metadata
/
visitor-generate-ir.c
diff --git
a/plugins/ctf/common/metadata/visitor-generate-ir.c
b/plugins/ctf/common/metadata/visitor-generate-ir.c
index 2c88d5f9b6416cce5d4fd3d417e4553d7e61fa65..fb0f1df11045c0ccce1c04e97608286a65dc89af 100644
(file)
--- a/
plugins/ctf/common/metadata/visitor-generate-ir.c
+++ b/
plugins/ctf/common/metadata/visitor-generate-ir.c
@@
-30,6
+30,7
@@
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
+#include <stdbool.h>
#include <stdlib.h>
#include <ctype.h>
#include <assert.h>
#include <stdlib.h>
#include <ctype.h>
#include <assert.h>
@@
-854,6
+855,11
@@
int get_unary_unsigned(struct bt_list_head *head, uint64_t *value)
int ret = 0;
struct ctf_node *node;
int ret = 0;
struct ctf_node *node;
+ if (bt_list_empty(head)) {
+ ret = -1;
+ goto end;
+ }
+
bt_list_for_each_entry(node, head, siblings) {
int uexpr_type = node->u.unary_expression.type;
int uexpr_link = node->u.unary_expression.link;
bt_list_for_each_entry(node, head, siblings) {
int uexpr_type = node->u.unary_expression.type;
int uexpr_link = node->u.unary_expression.link;
@@
-1172,7
+1178,7
@@
static
int get_type_specifier_list_name(struct ctx *ctx,
struct ctf_node *type_specifier_list, GString *str)
{
int get_type_specifier_list_name(struct ctx *ctx,
struct ctf_node *type_specifier_list, GString *str)
{
- int ret;
+ int ret
= 0
;
struct ctf_node *iter;
int alias_item_nr = 0;
struct bt_list_head *head =
struct ctf_node *iter;
int alias_item_nr = 0;
struct bt_list_head *head =
@@
-1291,7
+1297,7
@@
int visit_type_declarator(struct ctx *ctx, struct ctf_node *type_specifier_list,
nested_decl_copy = bt_ctf_field_type_copy(nested_decl);
BT_PUT(nested_decl);
if (!nested_decl_copy) {
nested_decl_copy = bt_ctf_field_type_copy(nested_decl);
BT_PUT(nested_decl);
if (!nested_decl_copy) {
- _PERROR("%s", "cannot copy nested
declaration
");
+ _PERROR("%s", "cannot copy nested
field type
");
ret = -EINVAL;
goto error;
}
ret = -EINVAL;
goto error;
}
@@
-1366,7
+1372,7
@@
int visit_type_declarator(struct ctx *ctx, struct ctf_node *type_specifier_list,
BT_PUT(nested_decl);
if (!array_decl) {
_PERROR("%s",
BT_PUT(nested_decl);
if (!array_decl) {
_PERROR("%s",
- "cannot create array
declaration
");
+ "cannot create array
field type
");
ret = -ENOMEM;
goto error;
}
ret = -ENOMEM;
goto error;
}
@@
-1391,7
+1397,7
@@
int visit_type_declarator(struct ctx *ctx, struct ctf_node *type_specifier_list,
BT_PUT(nested_decl);
if (!seq_decl) {
_PERROR("%s",
BT_PUT(nested_decl);
if (!seq_decl) {
_PERROR("%s",
- "cannot create sequence
declaration
");
+ "cannot create sequence
field type
");
ret = -ENOMEM;
goto error;
}
ret = -ENOMEM;
goto error;
}
@@
-1464,7
+1470,7
@@
int visit_struct_decl_field(struct ctx *ctx,
&qfield_name, iter, &field_decl, NULL);
if (ret) {
assert(!field_decl);
&qfield_name, iter, &field_decl, NULL);
if (ret) {
assert(!field_decl);
- _PERROR("%s", "
unable to find structure field declaration type
");
+ _PERROR("%s", "
cannot visit type declarator
");
goto error;
}
goto error;
}
@@
-1523,7
+1529,7
@@
int visit_variant_decl_field(struct ctx *ctx,
if (ret) {
assert(!field_decl);
_PERROR("%s",
if (ret) {
assert(!field_decl);
_PERROR("%s",
- "
unable to find variant field declaration type
");
+ "
cannot visit type declarator
");
goto error;
}
goto error;
}
@@
-1574,7
+1580,7
@@
int visit_typedef(struct ctx *ctx, struct ctf_node *type_specifier_list,
ret = visit_type_declarator(ctx, type_specifier_list,
&qidentifier, iter, &type_decl, NULL);
if (ret) {
ret = visit_type_declarator(ctx, type_specifier_list,
&qidentifier, iter, &type_decl, NULL);
if (ret) {
- _PERROR("%s", "
problem creating type declaration
");
+ _PERROR("%s", "
cannot visit type declarator
");
ret = -EINVAL;
goto end;
}
ret = -EINVAL;
goto end;
}
@@
-1627,7
+1633,7
@@
int visit_typealias(struct ctx *ctx, struct ctf_node *target,
&qdummy_field_name, node, &type_decl, NULL);
if (ret) {
assert(!type_decl);
&qdummy_field_name, node, &type_decl, NULL);
if (ret) {
assert(!type_decl);
- _PERROR("%s", "
problem creating type declaration
");
+ _PERROR("%s", "
cannot visit type declarator
");
goto end;
}
goto end;
}
@@
-1795,7
+1801,7
@@
int visit_struct_decl(struct ctx *ctx, const char *name,
struct_decl_copy = bt_ctf_field_type_copy(*struct_decl);
if (!struct_decl_copy) {
_PERROR("%s",
struct_decl_copy = bt_ctf_field_type_copy(*struct_decl);
if (!struct_decl_copy) {
_PERROR("%s",
- "cannot create copy of structure
declaration
");
+ "cannot create copy of structure
field type
");
ret = -EINVAL;
goto error;
}
ret = -EINVAL;
goto error;
}
@@
-1829,7
+1835,7
@@
int visit_struct_decl(struct ctx *ctx, const char *name,
*struct_decl = bt_ctf_field_type_structure_create();
if (!*struct_decl) {
*struct_decl = bt_ctf_field_type_structure_create();
if (!*struct_decl) {
- _PERROR("%s", "cannot create structure
declaration
");
+ _PERROR("%s", "cannot create structure
field type
");
ret = -ENOMEM;
goto error;
}
ret = -ENOMEM;
goto error;
}
@@
-1912,7
+1918,7
@@
int visit_variant_decl(struct ctx *ctx, const char *name,
untagged_variant_decl);
if (!variant_decl_copy) {
_PERROR("%s",
untagged_variant_decl);
if (!variant_decl_copy) {
_PERROR("%s",
- "cannot create copy of
structure declaration
");
+ "cannot create copy of
variant field type
");
ret = -EINVAL;
goto error;
}
ret = -EINVAL;
goto error;
}
@@
-1938,7
+1944,7
@@
int visit_variant_decl(struct ctx *ctx, const char *name,
untagged_variant_decl = bt_ctf_field_type_variant_create(NULL,
NULL);
if (!untagged_variant_decl) {
untagged_variant_decl = bt_ctf_field_type_variant_create(NULL,
NULL);
if (!untagged_variant_decl) {
- _PERROR("%s", "cannot create variant
declaration
");
+ _PERROR("%s", "cannot create variant
field type
");
ret = -ENOMEM;
goto error;
}
ret = -ENOMEM;
goto error;
}
@@
-2119,7
+2125,7
@@
int visit_enum_decl(struct ctx *ctx, const char *name,
enum_decl_copy = bt_ctf_field_type_copy(*enum_decl);
if (!enum_decl_copy) {
_PERROR("%s",
enum_decl_copy = bt_ctf_field_type_copy(*enum_decl);
if (!enum_decl_copy) {
_PERROR("%s",
- "cannot create copy of enumeration
declaration
");
+ "cannot create copy of enumeration
field type
");
ret = -EINVAL;
goto error;
}
ret = -EINVAL;
goto error;
}
@@
-2172,7
+2178,7
@@
int visit_enum_decl(struct ctx *ctx, const char *name,
*enum_decl = bt_ctf_field_type_enumeration_create(integer_decl);
if (!*enum_decl) {
*enum_decl = bt_ctf_field_type_enumeration_create(integer_decl);
if (!*enum_decl) {
- _PERROR("%s", "cannot create enumeration
declaration
");
+ _PERROR("%s", "cannot create enumeration
field type
");
ret = -ENOMEM;
goto error;
}
ret = -ENOMEM;
goto error;
}
@@
-2232,7
+2238,7
@@
int visit_type_specifier(struct ctx *ctx,
/* Make a copy of the type declaration */
decl_copy = bt_ctf_field_type_copy(*decl);
if (!decl_copy) {
/* Make a copy of the type declaration */
decl_copy = bt_ctf_field_type_copy(*decl);
if (!decl_copy) {
- _PERROR("%s", "cannot create
copy of type declaration
");
+ _PERROR("%s", "cannot create
field type copy
");
ret = -EINVAL;
goto error;
}
ret = -EINVAL;
goto error;
}
@@
-2565,7
+2571,7
@@
int visit_integer_decl(struct ctx *ctx,
*integer_decl = bt_ctf_field_type_integer_create((unsigned int) size);
if (!*integer_decl) {
*integer_decl = bt_ctf_field_type_integer_create((unsigned int) size);
if (!*integer_decl) {
- _PERROR("%s", "cannot create integer
declaration
");
+ _PERROR("%s", "cannot create integer
field type
");
ret = -ENOMEM;
goto error;
}
ret = -ENOMEM;
goto error;
}
@@
-2586,7
+2592,7
@@
int visit_integer_decl(struct ctx *ctx,
}
if (ret) {
}
if (ret) {
- _PERROR("%s", "cannot configure integer
declaration
");
+ _PERROR("%s", "cannot configure integer
field type
");
ret = -EINVAL;
goto error;
}
ret = -EINVAL;
goto error;
}
@@
-2741,7
+2747,7
@@
int visit_floating_point_number_decl(struct ctx *ctx,
*float_decl = bt_ctf_field_type_floating_point_create();
if (!*float_decl) {
_PERROR("%s",
*float_decl = bt_ctf_field_type_floating_point_create();
if (!*float_decl) {
_PERROR("%s",
- "cannot create floating point number
declaration
");
+ "cannot create floating point number
field type
");
ret = -ENOMEM;
goto error;
}
ret = -ENOMEM;
goto error;
}
@@
-2754,7
+2760,7
@@
int visit_floating_point_number_decl(struct ctx *ctx,
ret |= bt_ctf_field_type_set_alignment(*float_decl, alignment);
if (ret) {
_PERROR("%s",
ret |= bt_ctf_field_type_set_alignment(*float_decl, alignment);
if (ret) {
_PERROR("%s",
- "cannot configure floating point number
declaration
");
+ "cannot configure floating point number
field type
");
ret = -EINVAL;
goto error;
}
ret = -EINVAL;
goto error;
}
@@
-2845,14
+2851,14
@@
int visit_string_decl(struct ctx *ctx,
*string_decl = bt_ctf_field_type_string_create();
if (!*string_decl) {
*string_decl = bt_ctf_field_type_string_create();
if (!*string_decl) {
- _PERROR("%s", "cannot create string
declaration
");
+ _PERROR("%s", "cannot create string
field type
");
ret = -ENOMEM;
goto error;
}
ret = bt_ctf_field_type_string_set_encoding(*string_decl, encoding);
if (ret) {
ret = -ENOMEM;
goto error;
}
ret = bt_ctf_field_type_string_set_encoding(*string_decl, encoding);
if (ret) {
- _PERROR("%s", "cannot configure string
declaration
");
+ _PERROR("%s", "cannot configure string
field type
");
ret = -EINVAL;
goto error;
}
ret = -EINVAL;
goto error;
}
@@
-3036,7
+3042,8
@@
int visit_event_decl_entry(struct ctx *ctx, struct ctf_node *node,
ret = get_unary_unsigned(&node->u.ctf_expression.right,
(uint64_t *) &id);
ret = get_unary_unsigned(&node->u.ctf_expression.right,
(uint64_t *) &id);
- if (ret || id < 0) {
+ /* Only read "id" if get_unary_unsigned() succeeded. */
+ if (ret || (!ret && id < 0)) {
_PERROR("%s", "unexpected unary expression for event declaration's \"id\" attribute");
ret = -EINVAL;
goto error;
_PERROR("%s", "unexpected unary expression for event declaration's \"id\" attribute");
ret = -EINVAL;
goto error;
@@
-3060,7
+3067,11
@@
int visit_event_decl_entry(struct ctx *ctx, struct ctf_node *node,
ret = get_unary_unsigned(&node->u.ctf_expression.right,
(uint64_t *) stream_id);
ret = get_unary_unsigned(&node->u.ctf_expression.right,
(uint64_t *) stream_id);
- if (ret || *stream_id < 0) {
+ /*
+ * Only read "stream_id" if get_unary_unsigned()
+ * succeeded.
+ */
+ if (ret || (!ret && *stream_id < 0)) {
_PERROR("%s", "unexpected unary expression for event declaration's \"stream_id\" attribute");
ret = -EINVAL;
goto error;
_PERROR("%s", "unexpected unary expression for event declaration's \"stream_id\" attribute");
ret = -EINVAL;
goto error;
@@
-3107,7
+3118,7
@@
int visit_event_decl_entry(struct ctx *ctx, struct ctf_node *node,
struct ctf_node, siblings),
&decl);
if (ret) {
struct ctf_node, siblings),
&decl);
if (ret) {
- _PERROR("%s", "cannot create event payload
declaration
");
+ _PERROR("%s", "cannot create event payload
field type
");
goto error;
}
goto error;
}
@@
-3116,7
+3127,7
@@
int visit_event_decl_entry(struct ctx *ctx, struct ctf_node *node,
event_class, decl);
BT_PUT(decl);
if (ret) {
event_class, decl);
BT_PUT(decl);
if (ret) {
- _PERROR("%s", "cannot set event's payload
declaration
");
+ _PERROR("%s", "cannot set event's payload
field type
");
goto error;
}
goto error;
}
@@
-3501,7
+3512,7
@@
int visit_event_decl(struct ctx *ctx, struct ctf_node *node)
event_id);
if (eevent_class) {
BT_PUT(eevent_class);
event_id);
if (eevent_class) {
BT_PUT(eevent_class);
- _PERROR("
%s", "duplicate event with ID %" PRId64 " in same stream"
);
+ _PERROR("
duplicate event with ID %" PRId64 " in same stream", event_id
);
ret = -EEXIST;
goto error;
}
ret = -EEXIST;
goto error;
}
@@
-3574,7
+3585,8
@@
int visit_stream_decl_entry(struct ctx *ctx, struct ctf_node *node,
ret = get_unary_unsigned(&node->u.ctf_expression.right,
(uint64_t *) &id);
ret = get_unary_unsigned(&node->u.ctf_expression.right,
(uint64_t *) &id);
- if (ret || id < 0) {
+ /* Only read "id" if get_unary_unsigned() succeeded. */
+ if (ret || (!ret && id < 0)) {
_PERROR("%s", "unexpected unary expression for stream declaration's \"id\" attribute");
ret = -EINVAL;
goto error;
_PERROR("%s", "unexpected unary expression for stream declaration's \"id\" attribute");
ret = -EINVAL;
goto error;
@@
-3592,7
+3604,7
@@
int visit_stream_decl_entry(struct ctx *ctx, struct ctf_node *node,
ret = bt_ctf_stream_class_set_id(stream_class, id);
if (ret) {
_PERROR("%s",
ret = bt_ctf_stream_class_set_id(stream_class, id);
if (ret) {
_PERROR("%s",
- "cannot set stream
declaration
's ID");
+ "cannot set stream
class
's ID");
goto error;
}
goto error;
}
@@
-3610,7
+3622,7
@@
int visit_stream_decl_entry(struct ctx *ctx, struct ctf_node *node,
struct ctf_node, siblings),
&decl);
if (ret) {
struct ctf_node, siblings),
&decl);
if (ret) {
- _PERROR("%s", "cannot create event header
declaration
");
+ _PERROR("%s", "cannot create event header
field type
");
goto error;
}
goto error;
}
@@
-3620,7
+3632,7
@@
int visit_stream_decl_entry(struct ctx *ctx, struct ctf_node *node,
stream_class, decl);
BT_PUT(decl);
if (ret) {
stream_class, decl);
BT_PUT(decl);
if (ret) {
- _PERROR("%s", "cannot set stream's event header
declaration
");
+ _PERROR("%s", "cannot set stream's event header
field type
");
goto error;
}
goto error;
}
@@
-3638,7
+3650,7
@@
int visit_stream_decl_entry(struct ctx *ctx, struct ctf_node *node,
struct ctf_node, siblings),
&decl);
if (ret) {
struct ctf_node, siblings),
&decl);
if (ret) {
- _PERROR("%s", "cannot create stream event context
declaration
");
+ _PERROR("%s", "cannot create stream event context
field type
");
goto error;
}
goto error;
}
@@
-3648,7
+3660,7
@@
int visit_stream_decl_entry(struct ctx *ctx, struct ctf_node *node,
stream_class, decl);
BT_PUT(decl);
if (ret) {
stream_class, decl);
BT_PUT(decl);
if (ret) {
- _PERROR("%s", "cannot set stream's event context
declaration
");
+ _PERROR("%s", "cannot set stream's event context
field type
");
goto error;
}
goto error;
}
@@
-3666,7
+3678,7
@@
int visit_stream_decl_entry(struct ctx *ctx, struct ctf_node *node,
struct ctf_node, siblings),
&decl);
if (ret) {
struct ctf_node, siblings),
&decl);
if (ret) {
- _PERROR("%s", "cannot create packet context
declaration
");
+ _PERROR("%s", "cannot create packet context
field type
");
goto error;
}
goto error;
}
@@
-3676,7
+3688,7
@@
int visit_stream_decl_entry(struct ctx *ctx, struct ctf_node *node,
stream_class, decl);
BT_PUT(decl);
if (ret) {
stream_class, decl);
BT_PUT(decl);
if (ret) {
- _PERROR("%s", "cannot set stream's packet context
declaration
");
+ _PERROR("%s", "cannot set stream's packet context
field type
");
goto error;
}
goto error;
}
@@
-3752,7
+3764,7
@@
int visit_stream_decl(struct ctx *ctx, struct ctf_node *node)
bt_ctf_trace_get_packet_header_type(ctx->trace);
if (!packet_header_decl) {
_PERROR("%s",
bt_ctf_trace_get_packet_header_type(ctx->trace);
if (!packet_header_decl) {
_PERROR("%s",
- "cannot get trace packet header
declaration
");
+ "cannot get trace packet header
field type
");
goto error;
}
goto error;
}
@@
-3936,7
+3948,7
@@
int visit_trace_decl_entry(struct ctx *ctx, struct ctf_node *node, int *set)
struct ctf_node, siblings),
&packet_header_decl);
if (ret) {
struct ctf_node, siblings),
&packet_header_decl);
if (ret) {
- _PERROR("%s", "cannot create packet header
declaration
");
+ _PERROR("%s", "cannot create packet header
field type
");
goto error;
}
goto error;
}
@@
-3945,7
+3957,7
@@
int visit_trace_decl_entry(struct ctx *ctx, struct ctf_node *node, int *set)
packet_header_decl);
BT_PUT(packet_header_decl);
if (ret) {
packet_header_decl);
BT_PUT(packet_header_decl);
if (ret) {
- _PERROR("%s", "cannot set trace
declaration's packet header declaration
");
+ _PERROR("%s", "cannot set trace
's packet header field type
");
goto error;
}
goto error;
}
@@
-4615,7
+4627,7
@@
end:
static
int move_ctx_stream_classes_to_trace(struct ctx *ctx)
{
static
int move_ctx_stream_classes_to_trace(struct ctx *ctx)
{
- int ret;
+ int ret
= 0
;
GHashTableIter iter;
gpointer key, stream_class;
GHashTableIter iter;
gpointer key, stream_class;
@@
-4640,7
+4652,7
@@
end:
BT_HIDDEN
struct ctf_visitor_generate_ir *ctf_visitor_generate_ir_create(FILE *efd,
BT_HIDDEN
struct ctf_visitor_generate_ir *ctf_visitor_generate_ir_create(FILE *efd,
- uint64_t clock_class_offset_ns)
+ uint64_t clock_class_offset_ns
, const char *name
)
{
int ret;
struct ctx *ctx = NULL;
{
int ret;
struct ctx *ctx = NULL;
@@
-4652,6
+4664,12
@@
struct ctf_visitor_generate_ir *ctf_visitor_generate_ir_create(FILE *efd,
goto error;
}
goto error;
}
+ ret = bt_ctf_trace_set_name(trace, name);
+ if (ret) {
+ _FPERROR(efd, "cannot set trace's name to `%s`", name);
+ goto error;
+ }
+
/* Set packet header to NULL to override the default one */
ret = bt_ctf_trace_set_packet_header_type(trace, NULL);
if (ret) {
/* Set packet header to NULL to override the default one */
ret = bt_ctf_trace_set_packet_header_type(trace, NULL);
if (ret) {
This page took
0.03172 seconds
and
4
git commands to generate.