Fix: lttng-crash: detect truncated files
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 23 Sep 2019 18:31:33 +0000 (14:31 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Wed, 25 Sep 2019 16:29:43 +0000 (12:29 -0400)
Detect truncated files which size is smaller than the ring buffer
header.

This can be caused by a situation where sessiond is killed with SIGKILL
while doing a metadata regenerate command.

Without this fix, lttng-crash is killed with a "Bus error" when
encountering a truncated file.

Fixes: #1166
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-crash/lttng-crash.c

index 298ed71a43c2b1b47053156f624aa50b39fd0519..f12ecfaea0a6fe272f2859a9dd57a77a80638d03 100644 (file)
@@ -498,7 +498,8 @@ int check_magic(const uint8_t *magic)
 }
 
 static
 }
 
 static
-int get_crash_layout(struct lttng_crash_layout *layout, int fd)
+int get_crash_layout(struct lttng_crash_layout *layout, int fd,
+               const char *input_file)
 {
        char *map;
        int ret = 0, unmapret;
 {
        char *map;
        int ret = 0, unmapret;
@@ -509,7 +510,21 @@ int get_crash_layout(struct lttng_crash_layout *layout, int fd)
        const struct crash_abi_unknown *abi;
        uint16_t endian;
        enum lttng_crash_type layout_type;
        const struct crash_abi_unknown *abi;
        uint16_t endian;
        enum lttng_crash_type layout_type;
+       struct stat stat;
 
 
+       ret = fstat(fd, &stat);
+       if (ret < 0) {
+               PERROR("Failed to fstat '%s'", input_file);
+               return -1;
+       }
+       if (stat.st_size < RB_CRASH_DUMP_ABI_LEN) {
+               ERR("File '%s' truncated: file length of %" PRIi64
+                               " bytes does not meet the minimal expected "
+                               "length of %d bytes",
+                               input_file, (int64_t) stat.st_size,
+                               RB_CRASH_DUMP_ABI_LEN);
+               return -1;
+       }
        map = mmap(NULL, RB_CRASH_DUMP_ABI_LEN, PROT_READ, MAP_PRIVATE,
                fd, 0);
        if (map == MAP_FAILED) {
        map = mmap(NULL, RB_CRASH_DUMP_ABI_LEN, PROT_READ, MAP_PRIVATE,
                fd, 0);
        if (map == MAP_FAILED) {
@@ -838,7 +853,7 @@ int extract_file(int output_dir_fd, const char *output_file,
        }
 
        /* Query the crash ABI layout */
        }
 
        /* Query the crash ABI layout */
-       ret = get_crash_layout(&layout, fd_src);
+       ret = get_crash_layout(&layout, fd_src, input_file);
        if (ret) {
                goto close_src;
        }
        if (ret) {
                goto close_src;
        }
This page took 0.027371 seconds and 5 git commands to generate.