X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=formats%2Fctf%2Fctf.c;h=687e360e1699e87bb1b8eba7b7077bf2d48fe388;hb=3dd513bb4187aa06c6a0e773a00efd5e44bbd82b;hp=bb94e52770e36641fd8107414229992426ec1e58;hpb=68ef79528cd8154154c4760483fee45e9f349a53;p=babeltrace.git diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index bb94e527..687e360e 100644 --- a/formats/ctf/ctf.c +++ b/formats/ctf/ctf.c @@ -548,10 +548,15 @@ int ctf_read_event(struct bt_stream_pos *ppos, struct ctf_stream_definition *str goto error; } + if (pos->last_offset == pos->offset) { + fprintf(stderr, "[error] Invalid 0 byte event encountered.\n"); + return -EINVAL; + } + return 0; error: - fprintf(stderr, "[error] Unexpected end of stream. Either the trace data stream is corrupted or metadata description does not match data layout.\n"); + fprintf(stderr, "[error] Unexpected end of packet. Either the trace data stream is corrupted or metadata description does not match data layout.\n"); return ret; } @@ -670,7 +675,7 @@ int ctf_fini_pos(struct ctf_stream_pos *pos) /* * for SEEK_CUR: go to next packet. - * for SEEK_POS: go to packet numer (index). + * for SEEK_SET: go to packet numer (index). */ void ctf_packet_seek(struct bt_stream_pos *stream_pos, size_t index, int whence) { @@ -712,7 +717,7 @@ void ctf_packet_seek(struct bt_stream_pos *stream_pos, size_t index, int whence) switch (whence) { case SEEK_CUR: /* The writer will add padding */ - pos->mmap_offset += WRITE_PACKET_LEN / CHAR_BIT; + pos->mmap_offset += pos->packet_size / CHAR_BIT; break; case SEEK_SET: assert(index == 0); /* only seek supported for now */ @@ -729,14 +734,6 @@ void ctf_packet_seek(struct bt_stream_pos *stream_pos, size_t index, int whence) pos->offset = 0; } else { read_next_packet: - if (pos->cur_index >= pos->packet_cycles_index->len) { - pos->offset = EOF; - return; - } - if (pos->cur_index >= pos->packet_real_index->len) { - pos->offset = EOF; - return; - } switch (whence) { case SEEK_CUR: { @@ -745,6 +742,9 @@ void ctf_packet_seek(struct bt_stream_pos *stream_pos, size_t index, int whence) if (pos->offset == EOF) { return; } + assert(pos->cur_index < pos->packet_cycles_index->len); + assert(pos->cur_index < pos->packet_real_index->len); + /* For printing discarded event count */ packet_index = &g_array_index(pos->packet_cycles_index, struct packet_index, pos->cur_index); @@ -782,6 +782,10 @@ void ctf_packet_seek(struct bt_stream_pos *stream_pos, size_t index, int whence) break; } case SEEK_SET: + if (index >= pos->packet_cycles_index->len) { + pos->offset = EOF; + return; + } packet_index = &g_array_index(pos->packet_cycles_index, struct packet_index, index); pos->last_events_discarded = packet_index->events_discarded; @@ -1482,28 +1486,28 @@ begin: fprintf(stderr, "[error] Unable to read packet context: %s\n", strerror(-ret)); return ret; } - /* read content size from header */ - len_index = bt_struct_declaration_lookup_field_index(file_stream->parent.stream_packet_context->declaration, g_quark_from_static_string("content_size")); + /* read packet size from header */ + len_index = bt_struct_declaration_lookup_field_index(file_stream->parent.stream_packet_context->declaration, g_quark_from_static_string("packet_size")); if (len_index >= 0) { struct bt_definition *field; field = bt_struct_definition_get_field_from_index(file_stream->parent.stream_packet_context, len_index); - packet_index.content_size = bt_get_unsigned_int(field); + packet_index.packet_size = bt_get_unsigned_int(field); } else { /* Use file size for packet size */ - packet_index.content_size = filesize * CHAR_BIT; + packet_index.packet_size = filesize * CHAR_BIT; } - /* read packet size from header */ - len_index = bt_struct_declaration_lookup_field_index(file_stream->parent.stream_packet_context->declaration, g_quark_from_static_string("packet_size")); + /* read content size from header */ + len_index = bt_struct_declaration_lookup_field_index(file_stream->parent.stream_packet_context->declaration, g_quark_from_static_string("content_size")); if (len_index >= 0) { struct bt_definition *field; field = bt_struct_definition_get_field_from_index(file_stream->parent.stream_packet_context, len_index); - packet_index.packet_size = bt_get_unsigned_int(field); + packet_index.content_size = bt_get_unsigned_int(field); } else { - /* Use content size if non-zero, else file size */ - packet_index.packet_size = packet_index.content_size ? : filesize * CHAR_BIT; + /* Use packet size if non-zero, else file size */ + packet_index.content_size = packet_index.packet_size ? : filesize * CHAR_BIT; } /* read timestamp begin from header */