Whamcloud - gitweb
LU-12420 utils: llog_reader handles uninitialized mountdata 03/48303/2
authorLi Xi <lixi@ddn.com>
Tue, 11 Jun 2019 12:28:30 +0000 (20:28 +0800)
committerOleg Drokin <green@whamcloud.com>
Tue, 27 Feb 2024 05:45:41 +0000 (05:45 +0000)
When reading an mountdata that has never been used, "llog_reader
CONFIGS/mountdata" command crashes with following output:

Header size : 500170753
Time : Wed Sep  4 00:57:37 6869
Number of records: 65534
Target uuid :
-----------------------
Segmentation fault

After apply this patch, llog_reader will print following message
and quit under this circumstance:

Header size : 500170753
Time : Wed Sep  4 00:57:37 6869
Number of records: 65534
Target uuid :
-----------------------
uninitialized llog record at index 0

Lustre-change: https://review.whamcloud.com/35178
Lustre-commit: 46f53da979344c88ab985de7227a81240a8107bf

Change-Id: I25147f7fd09c6d59ff0049bdb20ac1979cf43ee4
Signed-off-by: Li Xi <lixi@ddn.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Wang Shilong <wshilong@ddn.com>
Reviewed-by: Li Dongyang <dongyangli@ddn.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/48303
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lustre/utils/llog_reader.c

index 6e7064f..b4e4757 100644 (file)
@@ -278,7 +278,7 @@ int llog_pack_buffer(int fd, struct llog_log_hdr **llog,
        /* the llog header not countable here.*/
        recs_num = count - 1;
 
-       recs_buf = malloc(recs_num * sizeof(**recs_pr));
+       recs_buf = calloc(recs_num, sizeof(**recs_pr));
        if (recs_buf == NULL) {
                rc = -ENOMEM;
                llapi_error(LLAPI_MSG_ERROR, rc,
@@ -934,6 +934,12 @@ static void print_records(struct llog_rec_hdr **recs,
        int i, skip = 0;
 
        for (i = 0; i < rec_number; i++) {
+               if (recs[i] == NULL) {
+                       llapi_printf(LLAPI_MSG_NORMAL,
+                                    "uninitialized llog record at index %d\n",
+                                    i);
+                       break;
+               }
                printf("#%.2d (%.3d)", __le32_to_cpu(recs[i]->lrh_index),
                       __le32_to_cpu(recs[i]->lrh_len));