Fix: relayd: live: read index file header
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 12 Aug 2019 15:47:34 +0000 (11:47 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Wed, 21 Aug 2019 16:43:19 +0000 (09:43 -0700)
The header of index files opened in "read" mode are not validated
when the file is being opened. This check should be performed to
restore the previous behaviour.

Moreover, the rest of the code using index files in "read" mode
assumes that the file header has already been skipped when reading
index entries.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/common/index/index.c

index 52a3c2e3fab9c89e2dcd054b8652f7c9582dcfc5..7c73dcfbd9e597def9249377348a462e6a86bd75 100644 (file)
@@ -49,8 +49,6 @@ static struct lttng_index_file *_lttng_index_file_create_from_trace_chunk(
        struct ctf_packet_index_file_hdr hdr;
        char index_directory_path[LTTNG_PATH_MAX];
        char index_file_path[LTTNG_PATH_MAX];
        struct ctf_packet_index_file_hdr hdr;
        char index_directory_path[LTTNG_PATH_MAX];
        char index_file_path[LTTNG_PATH_MAX];
-       const uint32_t element_len = ctf_packet_index_len(index_major,
-                       index_minor);
        const mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
        const bool acquired_reference = lttng_trace_chunk_get(chunk);
 
        const mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
        const bool acquired_reference = lttng_trace_chunk_get(chunk);
 
@@ -102,16 +100,46 @@ static struct lttng_index_file *_lttng_index_file_create_from_trace_chunk(
                goto error;
        }
 
                goto error;
        }
 
-       ctf_packet_index_file_hdr_init(&hdr, index_major, index_minor);
-       size_ret = lttng_write(fd, &hdr, sizeof(hdr));
-       if (size_ret < sizeof(hdr)) {
-               PERROR("Failed to write index header");
-               goto error;
+       if (flags == WRITE_FILE_FLAGS) {
+               ctf_packet_index_file_hdr_init(&hdr, index_major, index_minor);
+               size_ret = lttng_write(fd, &hdr, sizeof(hdr));
+               if (size_ret < sizeof(hdr)) {
+                       PERROR("Failed to write index header");
+                       goto error;
+               }
+               index_file->element_len = ctf_packet_index_len(index_major, index_minor);
+       } else {
+               uint32_t element_len;
+
+               size_ret = lttng_read(fd, &hdr, sizeof(hdr));
+               if (size_ret < 0) {
+                       PERROR("Failed to read index header");
+                       goto error;
+               }
+               if (be32toh(hdr.magic) != CTF_INDEX_MAGIC) {
+                       ERR("Invalid header magic");
+                       goto error;
+               }
+               if (index_major != be32toh(hdr.index_major)) {
+                       ERR("Index major number mismatch: %u, expect %u",
+                               be32toh(hdr.index_major), index_major);
+                       goto error;
+               }
+               if (index_minor != be32toh(hdr.index_minor)) {
+                       ERR("Index minor number mismatch: %u, expect %u",
+                               be32toh(hdr.index_minor), index_minor);
+                       goto error;
+               }
+               element_len = be32toh(hdr.packet_index_len);
+               if (element_len > sizeof(struct ctf_packet_index)) {
+                       ERR("Index element length too long");
+                       goto error;
+               }
+               index_file->element_len = element_len;
        }
        index_file->fd = fd;
        index_file->major = index_major;
        index_file->minor = index_minor;
        }
        index_file->fd = fd;
        index_file->major = index_major;
        index_file->minor = index_minor;
-       index_file->element_len = element_len;
        urcu_ref_init(&index_file->ref);
 
        return index_file;
        urcu_ref_init(&index_file->ref);
 
        return index_file;
This page took 0.026702 seconds and 4 git commands to generate.