X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=converter%2Fbabeltrace-lib.c;h=35f50719359c527f6db230bd05739b0b71727d8f;hp=5be268ccf4371b22e94a2e28e3d1898ecc009835;hb=d2b8ea6b81979dd25a8bab77c629499b988d7bae;hpb=847bf71a4af4770390a59e8ef8e1fdfca33687b9 diff --git a/converter/babeltrace-lib.c b/converter/babeltrace-lib.c index 5be268cc..35f50719 100644 --- a/converter/babeltrace-lib.c +++ b/converter/babeltrace-lib.c @@ -34,14 +34,19 @@ int convert_event(struct ctf_text_stream_pos *sout, struct ctf_event *event_class; uint64_t id = 0; int len_index; + int ret; + + if (sin->pos.offset == EOF) + return EOF; - if (sin->pos.offset == -EOF) - return -EOF; + /* Hide event payload struct brackets */ + sout->depth = -1; /* Read and print event header */ if (stream_class->event_header) { - generic_rw(&sin->pos.parent, &stream_class->event_header->p); - + ret = generic_rw(&sin->pos.parent, &stream_class->event_header->p); + if (ret) + goto error; /* lookup event id */ len_index = struct_declaration_lookup_field_index(stream_class->event_header_decl, g_quark_from_static_string("id")); @@ -56,13 +61,19 @@ int convert_event(struct ctf_text_stream_pos *sout, id = defint->value._unsigned; /* set id */ } - generic_rw(&sout->parent, &stream_class->event_header->p); + ret = generic_rw(&sout->parent, &stream_class->event_header->p); + if (ret) + goto error; } /* Read and print stream-declared event context */ if (stream_class->event_context) { - generic_rw(&sin->pos.parent, &stream_class->event_context->p); - generic_rw(&sout->parent, &stream_class->event_context->p); + ret = generic_rw(&sin->pos.parent, &stream_class->event_context->p); + if (ret) + goto error; + ret = generic_rw(&sout->parent, &stream_class->event_context->p); + if (ret) + goto error; } if (id >= stream_class->events_by_id->len) { @@ -77,17 +88,29 @@ int convert_event(struct ctf_text_stream_pos *sout, /* Read and print event-declared event context */ if (event_class->context) { - generic_rw(&sin->pos.parent, &event_class->context->p); - generic_rw(&sout->parent, &event_class->context->p); + ret = generic_rw(&sin->pos.parent, &event_class->context->p); + if (ret) + goto error; + ret = generic_rw(&sout->parent, &event_class->context->p); + if (ret) + goto error; } /* Read and print event payload */ if (event_class->fields) { - generic_rw(&sin->pos.parent, &event_class->fields->p); - generic_rw(&sout->parent, &event_class->fields->p); + ret = generic_rw(&sin->pos.parent, &event_class->fields->p); + if (ret) + goto error; + ret = generic_rw(&sout->parent, &event_class->fields->p); + if (ret) + goto error; } return 0; + +error: + fprintf(stdout, "[error] Unexpected end of stream. Either the trace data stream is corrupted or metadata description does not match data layout.\n"); + return ret; } static @@ -100,7 +123,7 @@ int convert_stream(struct ctf_text_stream_pos *sout, /* TODO: order events by timestamps across streams */ for (;;) { ret = convert_event(sout, sin); - if (ret == -EOF) + if (ret == EOF) break; else if (ret) { fprintf(stdout, "[error] Printing event failed.\n");