From: Mathieu Desnoyers Date: Mon, 12 Aug 2019 15:47:34 +0000 (-0400) Subject: Fix: relayd: live: read index file header X-Git-Tag: v2.11.0-rc3~71 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=0ee403c18b64971e546f9c69f713c8ef78ab4f26;p=lttng-tools.git Fix: relayd: live: read index file header 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 Signed-off-by: Jérémie Galarneau --- diff --git a/src/common/index/index.c b/src/common/index/index.c index 52a3c2e3f..7c73dcfbd 100644 --- a/src/common/index/index.c +++ b/src/common/index/index.c @@ -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]; - 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); @@ -102,16 +100,46 @@ static struct lttng_index_file *_lttng_index_file_create_from_trace_chunk( 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->element_len = element_len; urcu_ref_init(&index_file->ref); return index_file;