Blame SOURCES/0004-coredump-fix-unexpected-truncation-of-generated-core.patch

de9238
From dbb542e10bfe1b2e21c7927bda9be1d301cfef65 Mon Sep 17 00:00:00 2001
de9238
From: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
de9238
Date: Fri, 17 Jun 2022 20:38:19 +0900
de9238
Subject: [PATCH 4/5] coredump: fix unexpected truncation of generated core
de9238
 files
de9238
de9238
Core files generated by crash gcore command are sometimes unexpectedly
de9238
truncated. Then, we can get aware of this from the following warning
de9238
message output by gdb:
de9238
de9238
    BFD: warning: /root/./core.1.systemd is truncated: expected core file size >= 43606016, found: 43597824
de9238
de9238
From the investigation, it turned out that this truncation is
de9238
occurring when there is no write() operation after the area skipped by
de9238
lseek(). Holes are generated only when there is write() operation.
de9238
de9238
To fix this issue, use ftruncate() to allocate holes explicitly.
de9238
de9238
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
de9238
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
de9238
---
de9238
 src/libgcore/gcore_coredump.c | 15 +++++++++++++++
de9238
 1 file changed, 15 insertions(+)
de9238
de9238
diff --git a/src/libgcore/gcore_coredump.c b/src/libgcore/gcore_coredump.c
de9238
index 424b0a40a42b..27086d91468b 100644
de9238
--- a/src/libgcore/gcore_coredump.c
de9238
+++ b/src/libgcore/gcore_coredump.c
de9238
@@ -331,6 +331,21 @@ void gcore_coredump(void)
de9238
 	}
de9238
 	progressf("done.\n");
de9238
 
de9238
+	/*
de9238
+	 * Use ftruncate() to generate holes explicitly, or core file
de9238
+	 * gets truncated if there is no write() operation after the
de9238
+	 * area skipped by lseek().
de9238
+	 */
de9238
+	if (fflush(gcore->fp))
de9238
+		error(FATAL, "%s: fflush: %s\n",
de9238
+		      gcore->corename,
de9238
+		      strerror(errno));
de9238
+
de9238
+	if (ftruncate(fileno(gcore->fp), ftell(gcore->fp)) < 0)
de9238
+		error(FATAL, "%s: ftruncate: %s\n",
de9238
+		      gcore->corename,
de9238
+		      strerror(errno));
de9238
+
de9238
 	gcore->flags |= GCF_SUCCESS;
de9238
 
de9238
 }
de9238
-- 
de9238
2.37.1
de9238