Use 64-bit type for packet and content size
authorJuha Niskanen <juniskane@gmail.com>
Mon, 13 Feb 2012 13:33:58 +0000 (08:33 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 13 Feb 2012 13:33:58 +0000 (08:33 -0500)
Expression filestats.st_size * CHAR_BIT wraps around very easily
when stored to 32-bit size_t. Currently BabelTrace cannot handle
input larger than 256Mb because of this and diagnostic messages
from this function can be incorrect because of overflow.

This patch fixes my immediate problem, but further work is needed
for proper large file support i.e. handling files bigger than 2Gb.

Signed-off-by: Juha Niskanen <juniskane@gmail.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
formats/ctf/ctf.c
include/babeltrace/ctf/types.h

index 3ce428c387681db74cefadffd0f861daad43aba0..ea760f0e0725aecf7d53e719e8492374834b0491 100644 (file)
@@ -1185,14 +1185,14 @@ int create_stream_packet_index(struct ctf_trace *td,
 
                /* Validate content size and packet size values */
                if (packet_index.content_size > packet_index.packet_size) {
-                       fprintf(stderr, "[error] Content size (%zu bits) is larger than packet size (%zu bits).\n",
+                       fprintf(stderr, "[error] Content size (%" PRIu64 " bits) is larger than packet size (%" PRIu64 " bits).\n",
                                packet_index.content_size, packet_index.packet_size);
                        return -EINVAL;
                }
 
-               if (packet_index.packet_size > (filestats.st_size - packet_index.offset) * CHAR_BIT) {
-                       fprintf(stderr, "[error] Packet size (%zu bits) is larger than remaining file size (%zu bits).\n",
-                               packet_index.content_size, (size_t) (filestats.st_size - packet_index.offset) * CHAR_BIT);
+               if (packet_index.packet_size > ((uint64_t)filestats.st_size - packet_index.offset) * CHAR_BIT) {
+                       fprintf(stderr, "[error] Packet size (%" PRIu64 " bits) is larger than remaining file size (%" PRIu64 " bits).\n",
+                               packet_index.content_size, ((uint64_t)filestats.st_size - packet_index.offset) * CHAR_BIT);
                        return -EINVAL;
                }
 
index 12cca6e12539ddc0880b5e55677f476800882c2e..9cbb3387cabdea53042130f1101e79516bd97f26 100644 (file)
@@ -36,8 +36,8 @@ struct bt_stream_callbacks;
 struct packet_index {
        off_t offset;           /* offset of the packet in the file, in bytes */
        off_t data_offset;      /* offset of data within the packet, in bits */
-       size_t packet_size;     /* packet size, in bits */
-       size_t content_size;    /* content size, in bits */
+       uint64_t packet_size;   /* packet size, in bits */
+       uint64_t content_size;  /* content size, in bits */
        uint64_t timestamp_begin;
        uint64_t timestamp_end;
        uint32_t events_discarded;
This page took 0.035485 seconds and 4 git commands to generate.