From 17fe94e6f01e92afefd5af30a8fcac05b489dee4 Mon Sep 17 00:00:00 2001 From: Jos Collin Date: Wed, 13 Nov 2024 15:25:20 +0530 Subject: [PATCH] cephfs-journal-tool: fix segfault during 'journal import' from invalid dump file Fixes: https://tracker.ceph.com/issues/68928 Signed-off-by: Jos Collin (cherry picked from commit 01db5d107c6408d5f8e492daec0eb501628cd50f) --- src/tools/cephfs/Dumper.cc | 43 ++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/src/tools/cephfs/Dumper.cc b/src/tools/cephfs/Dumper.cc index 68a190182dd03..dfda045d6a9c3 100644 --- a/src/tools/cephfs/Dumper.cc +++ b/src/tools/cephfs/Dumper.cc @@ -229,23 +229,54 @@ int Dumper::undump(const char *dump_file, bool force) char buf[HEADER_LEN]; r = safe_read(fd, buf, sizeof(buf)); if (r < 0) { + derr << "Error reading " << dump_file << dendl; + VOID_TEMP_FAILURE_RETRY(::close(fd)); + return r; + } else if (r == 0) { + //Empty file read + derr << "No-op since empty journal dump file: " << dump_file << dendl; VOID_TEMP_FAILURE_RETRY(::close(fd)); return r; } long long unsigned start, len, write_pos, format, trimmed_pos; long unsigned stripe_unit, stripe_count, object_size; - sscanf(strstr(buf, "start offset"), "start offset %llu", &start); - sscanf(strstr(buf, "length"), "length %llu", &len); - sscanf(strstr(buf, "write_pos"), "write_pos %llu", &write_pos); - sscanf(strstr(buf, "format"), "format %llu", &format); + char *phdr = strstr(buf, "start offset"); + if (phdr == NULL) { + derr << "Invalid header, no 'start offset' embedded" << dendl; + ::close(fd); + return -EINVAL; + } + sscanf(phdr, "start offset %llu", &start); + phdr = strstr(buf, "length"); + if (phdr == NULL) { + derr << "Invalid header, no 'length' embedded" << dendl; + ::close(fd); + return -EINVAL; + } + sscanf(phdr, "length %llu", &len); + phdr = strstr(buf, "write_pos"); + if (phdr == NULL) { + derr << "Invalid header, no 'write_pos' embedded" << dendl; + ::close(fd); + return -EINVAL; + } + sscanf(phdr, "write_pos %llu", &write_pos); + phdr = strstr(buf, "format"); + if (phdr == NULL) { + derr << "Invalid header, no 'format' embedded" << dendl; + ::close(fd); + return -EINVAL; + } + sscanf(phdr, "format %llu", &format); if (!force) { // need to check if fsid match onlien cluster fsid - if (strstr(buf, "fsid")) { + phdr = strstr(buf, "fsid"); + if (phdr) { uuid_d fsid; char fsid_str[40]; - sscanf(strstr(buf, "fsid"), "fsid %39s", fsid_str); + sscanf(phdr, "fsid %39s", fsid_str); r = fsid.parse(fsid_str); if (!r) { derr << "Invalid fsid" << dendl; -- 2.39.5