diff --git a/.crash-gcore-command.metadata b/.crash-gcore-command.metadata index c41bc28..c7e70ff 100644 --- a/.crash-gcore-command.metadata +++ b/.crash-gcore-command.metadata @@ -1 +1 @@ -70f9352418f658080e988d5b7e7d3b4ce6a98f99 SOURCES/crash-gcore-command-1.6.3.tar.gz +2c15b78c28ef2e71307e826a5a7912346b4c4d2a SOURCES/crash-gcore-command-1.6.4.tar.gz diff --git a/.gitignore b/.gitignore index 3242885..3a19bba 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/crash-gcore-command-1.6.3.tar.gz +SOURCES/crash-gcore-command-1.6.4.tar.gz diff --git a/SOURCES/0001-coredump-fix-building-failure-due-to-undefined-macro.patch b/SOURCES/0001-coredump-fix-building-failure-due-to-undefined-macro.patch new file mode 100644 index 0000000..3420893 --- /dev/null +++ b/SOURCES/0001-coredump-fix-building-failure-due-to-undefined-macro.patch @@ -0,0 +1,60 @@ +From 33f3c97f7d45c8bb1b43a8d551cb01a9873bb123 Mon Sep 17 00:00:00 2001 +From: HATAYAMA Daisuke +Date: Tue, 28 Feb 2023 03:59:16 -0500 +Subject: [PATCH 1/2] coredump: fix building failure due to undefined macros + MAPLE_TREE_{COUNT,GATHER} +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +As of the commit 13794ace3830bf0274fe7b2e0e579ad72e31848f (coredump: +fix failure of executing gcore command due to introduction of maple +tree management on vma list), gcore.so fails to get built with the +following error messages with defs.h without maple tree API support: + + libgcore/gcore_coredump.c:189:50: error: ‘MAPLE_TREE_COUNT’ undeclared (first use in this function); did you mean ‘RADIX_TREE_COUNT’? + 189 | entry_num = do_maple_tree(mm_mt, MAPLE_TREE_COUNT, NULL); + | ^~~~~~~~~~~~~~~~ + | RADIX_TREE_COUNT + libgcore/gcore_coredump.c:189:50: note: each undeclared identifier is reported only once for each function it appears in + libgcore/gcore_coredump.c:191:38: error: ‘MAPLE_TREE_GATHER’ undeclared (first use in this function); did you mean ‘RADIX_TREE_GATHER’? + 191 | do_maple_tree(mm_mt, MAPLE_TREE_GATHER, entry_list); + | ^~~~~~~~~~~~~~~~~ + | RADIX_TREE_GATHER + +This is caused by the missing macros MAPLE_TREE_COUNT and +MAPLE_TREE_GATHER. + +To fix the issue, define the two macros within crash gcore so that +build is successfully done expecting the resulting binary works well +when it is ran against new crash utility that has maple tree API +support. + +Signed-off-by: HATAYAMA Daisuke +Signed-off-by: Lianbo Jiang +--- + src/libgcore/gcore_coredump.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/src/libgcore/gcore_coredump.c b/src/libgcore/gcore_coredump.c +index fa744d4c26a5..8eece96777be 100644 +--- a/src/libgcore/gcore_coredump.c ++++ b/src/libgcore/gcore_coredump.c +@@ -128,6 +128,14 @@ void gcore_readmem_user(ulong addr, void *buf, long size, char *type) + } + } + ++#if !defined(MAPLE_TREE_COUNT) ++#define MAPLE_TREE_COUNT (1) ++#endif ++ ++#if !defined(MAPLE_TREE_GATHER) ++#define MAPLE_TREE_GATHER (4) ++#endif ++ + ulong __attribute__((weak)) + do_maple_tree(ulong root, int flag, struct list_pair *lp) + { +-- +2.45.1 + diff --git a/SOURCES/0001-coredump-use-MEMBER_-OFFSET-SIZE-instead-of-GCORE_-O.patch b/SOURCES/0001-coredump-use-MEMBER_-OFFSET-SIZE-instead-of-GCORE_-O.patch deleted file mode 100644 index 2d80085..0000000 --- a/SOURCES/0001-coredump-use-MEMBER_-OFFSET-SIZE-instead-of-GCORE_-O.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 4731ebf085fe6322ba8c7ca14918d3cab2186cf0 Mon Sep 17 00:00:00 2001 -From: HATAYAMA Daisuke -Date: Fri, 25 Feb 2022 04:45:37 -0500 -Subject: [PATCH 1/8] coredump: use MEMBER_{OFFSET, SIZE} instead of - GCORE_{OFFSET, SIZE} - -fill_auxv_note() and compat_fill_auxv_note() is called just once each -time gcore command is invoked because each process has just one -NT_AUXV. This means using MEMBER_{OFFSET, SIZE} is enough; using -GCORE_{OFFSET, SIZE} is overkill. - -Signed-off-by: HATAYAMA Daisuke -Signed-off-by: Lianbo Jiang ---- - src/libgcore/gcore_coredump.c | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/src/libgcore/gcore_coredump.c b/src/libgcore/gcore_coredump.c -index 3d0c0fcce61e..6f57b21b62b6 100644 ---- a/src/libgcore/gcore_coredump.c -+++ b/src/libgcore/gcore_coredump.c -@@ -930,11 +930,11 @@ fill_auxv_note(struct elf_note_info *info, struct task_context *tc, - ulong *auxv; - int i; - -- auxv = (ulong *)GETBUF(GCORE_SIZE(mm_struct_saved_auxv)); -+ auxv = (ulong *)GETBUF(MEMBER_SIZE("mm_struct", "saved_auxv")); - - readmem(task_mm(tc->task, FALSE) + -- GCORE_OFFSET(mm_struct_saved_auxv), KVADDR, auxv, -- GCORE_SIZE(mm_struct_saved_auxv), "fill_auxv_note", -+ MEMBER_OFFSET("mm_struct", "saved_auxv"), KVADDR, auxv, -+ MEMBER_SIZE("mm_struct", "saved_auxv"), "fill_auxv_note", - gcore_verbose_error_handle()); - - i = 0; -@@ -956,11 +956,11 @@ compat_fill_auxv_note(struct elf_note_info *info, - uint32_t *auxv; - int i; - -- auxv = (uint32_t *)GETBUF(GCORE_SIZE(mm_struct_saved_auxv)); -+ auxv = (uint32_t *)GETBUF(MEMBER_SIZE("mm_struct", "saved_auxv")); - - readmem(task_mm(tc->task, FALSE) + -- GCORE_OFFSET(mm_struct_saved_auxv), KVADDR, auxv, -- GCORE_SIZE(mm_struct_saved_auxv), "fill_auxv_note32", -+ MEMBER_OFFSET("mm_struct", "saved_auxv"), KVADDR, auxv, -+ MEMBER_SIZE("mm_struct", "saved_auxv"), "fill_auxv_note32", - gcore_verbose_error_handle()); - - i = 0; --- -2.37.1 - diff --git a/SOURCES/0002-gcore-defs-remove-definitions-and-initializations-fo.patch b/SOURCES/0002-gcore-defs-remove-definitions-and-initializations-fo.patch deleted file mode 100644 index 2bbad74..0000000 --- a/SOURCES/0002-gcore-defs-remove-definitions-and-initializations-fo.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 6f4357340807f70bd1999f0b88435361c583f0b9 Mon Sep 17 00:00:00 2001 -From: HATAYAMA Daisuke -Date: Fri, 25 Feb 2022 04:51:06 -0500 -Subject: [PATCH 2/8] gcore, defs: remove definitions and initializations for - saved_auxv entries of offset and size tables - -saved_auxv entries of offset and size tables are now not used in the -source code by the previous commit. Let's remove definitions and -initializations for them. - -Signed-off-by: HATAYAMA Daisuke -Signed-off-by: Lianbo Jiang ---- - src/gcore.c | 2 -- - src/libgcore/gcore_defs.h | 2 -- - 2 files changed, 4 deletions(-) - -diff --git a/src/gcore.c b/src/gcore.c -index 5b78d9980887..f86b15f8a9f6 100644 ---- a/src/gcore.c -+++ b/src/gcore.c -@@ -371,7 +371,6 @@ static void gcore_offset_table_init(void) - GCORE_MEMBER_OFFSET_INIT(mm_struct_arg_end, "mm_struct", "arg_end"); - GCORE_MEMBER_OFFSET_INIT(mm_struct_map_count, "mm_struct", "map_count"); - GCORE_MEMBER_OFFSET_INIT(mm_struct_reserved_vm, "mm_struct", "reserved_vm"); -- GCORE_MEMBER_OFFSET_INIT(mm_struct_saved_auxv, "mm_struct", "saved_auxv"); - GCORE_MEMBER_OFFSET_INIT(mm_struct_saved_files, "mm_struct", "saved_files"); - GCORE_MEMBER_OFFSET_INIT(mm_struct_context, "mm_struct", "context"); - GCORE_MEMBER_OFFSET_INIT(pid_level, "pid", "level"); -@@ -520,7 +519,6 @@ static void gcore_size_table_init(void) - { - GCORE_STRUCT_SIZE_INIT(i387_union, "i387_union"); - GCORE_STRUCT_SIZE_INIT(mm_context_t, "mm_context_t"); -- GCORE_MEMBER_SIZE_INIT(mm_struct_saved_auxv, "mm_struct", "saved_auxv"); - GCORE_MEMBER_SIZE_INIT(mm_struct_saved_files, "mm_struct", "saved_files"); - GCORE_MEMBER_SIZE_INIT(thread_struct_ds, "thread_struct", "ds"); - GCORE_MEMBER_SIZE_INIT(thread_struct_es, "thread_struct", "es"); -diff --git a/src/libgcore/gcore_defs.h b/src/libgcore/gcore_defs.h -index df87851d23a1..3233ea533ca0 100644 ---- a/src/libgcore/gcore_defs.h -+++ b/src/libgcore/gcore_defs.h -@@ -1072,7 +1072,6 @@ struct gcore_offset_table - long mm_struct_arg_end; - long mm_struct_map_count; - long mm_struct_reserved_vm; -- long mm_struct_saved_auxv; - long mm_struct_saved_files; - long mm_struct_context; - long pid_level; -@@ -1148,7 +1147,6 @@ struct gcore_offset_table - struct gcore_size_table - { - long mm_context_t; -- long mm_struct_saved_auxv; - long mm_struct_saved_files; - long thread_struct_ds; - long thread_struct_es; --- -2.37.1 - diff --git a/SOURCES/0002-x86-fix-extend-gcore.so-taking-much-time-like-more-t.patch b/SOURCES/0002-x86-fix-extend-gcore.so-taking-much-time-like-more-t.patch new file mode 100644 index 0000000..bc22d7e --- /dev/null +++ b/SOURCES/0002-x86-fix-extend-gcore.so-taking-much-time-like-more-t.patch @@ -0,0 +1,67 @@ +From b3af265aa60251f282145bb0eee3b83d8a15ebb7 Mon Sep 17 00:00:00 2001 +From: HATAYAMA Daisuke +Date: Mon, 18 Sep 2023 20:45:11 -0400 +Subject: [PATCH 2/2] x86: fix extend gcore.so taking much time like more than + 1 hour when huge thread group is present + +extend gcore.so command takes lengthy time such as more than 1 hour +when huge thread group is present. + +The root cause of this issue is that we never take into account time +complexity of function gcore_arch_vsyscall_has_vm_alwaysdump_flag() +sufficiently, which iterates the task list and vma lists of each task +to detect existence of VM_ALWAYS flag in a given crash dump and so has +O(nm) where the n is the length of the task list and the m is the +total number of vma among all tasks. + +To fix this issue, skip this process for the kernels whose version is +equal to or larger than v3.4.0. + +Originally, this process was implemented to detect existence of +VM_ALWAYS flag that was removed at the commit +909af768e88867016f427264ae39d27a57b6a8ed (coredump: remove +VM_ALWAYSDUMP flag) included at Linux kernel v3.4. However, the base +kernel version of RHEL7.0 GA is 3.10.0-123.el7. Hence, the kernels for +RHEL7 and later have included the commit. For RHEL7 and later, it's +sufficient to conclude absence of the flag by checking kernel version +of a given crash dump. + +The issue could still remain on RHEL6 and older, but we think it's +acceptable because today we rarely handle crash dump files of RHEL6 +and older. + +Signed-off-by: HATAYAMA Daisuke +Signed-off-by: Lianbo Jiang +--- + src/libgcore/gcore_x86.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/src/libgcore/gcore_x86.c b/src/libgcore/gcore_x86.c +index 8878f79d4c08..3ddf5109ade0 100644 +--- a/src/libgcore/gcore_x86.c ++++ b/src/libgcore/gcore_x86.c +@@ -2502,6 +2502,21 @@ int gcore_arch_vsyscall_has_vm_alwaysdump_flag(void) + struct task_context *tc; + int i; + ++ /* ++ * The commit 909af768e88867016f427264ae39d27a57b6a8ed ++ * (coredump: remove VM_ALWAYSDUMP flag) of the Linux kernel ++ * was merged at v3.4. We can say VM_ALWAYSDUMP flag doesn't ++ * exist for the version 3.4.0 or later. The base kernel ++ * version of RHEL7.0 GA is 3.10.0-123.el7. Hence, this ++ * condition is expected to match RHEL7 and later RHEL major ++ * versions. On the other hand, the commit ++ * 909af768e88867016f427264ae39d27a57b6a8ed was backported ++ * into the kernel package in RHEL6 and the exploring code is ++ * still needed. ++ */ ++ if (THIS_KERNEL_VERSION >= LINUX(3, 4, 0)) ++ return FALSE; ++ + /* + * For simplicity, consider that VM_ALWAYSDUMP was already not + * present when maple tree was introduced. +-- +2.45.1 + diff --git a/SOURCES/0003-gcore-fix-memory-allocation-failure-during-processin.patch b/SOURCES/0003-gcore-fix-memory-allocation-failure-during-processin.patch deleted file mode 100644 index 724ac1b..0000000 --- a/SOURCES/0003-gcore-fix-memory-allocation-failure-during-processin.patch +++ /dev/null @@ -1,129 +0,0 @@ -From 4cb65a0d9168778d120920418b968d05da10989f Mon Sep 17 00:00:00 2001 -From: HATAYAMA Daisuke -Date: Fri, 25 Feb 2022 04:59:48 -0500 -Subject: [PATCH 3/8] gcore: fix memory allocation failure during processing - NT_AUXV note - -For crash dumps generated using kernel-4.18.0-365.el8 or later on -CentOS stream 8, crash gcore command fails as follows: - - crash> gcore -v 7 -f 128 10604 - gcore: Opening file core.10604.test-dumpfilter ... - gcore: done. - gcore: Writing ELF header ... - gcore: done. - gcore: Retrieving and writing note information ... - gcore: zero-size memory allocation! (called from 7fd558ce1e05) - Failed. - -This memory allocation failure occurs in fill_auxv_note() that creates -NT_AUXV note due to saved_auxv entries of size and offset tables are -somehow 0. - -This is because during the merge of the upstream kernel commit -1c33bb0507508af24fd754dd7123bd8e997fab2f (x86/elf: Support a new ELF -aux vector AT_MINSIGSTKSZ), location of saved_auxv of struct mm_struct -has been moved as workaround in order to avoid kABI breakage. - -Fix this by using RHEL-specific location for saved_auxv if there is -member rh_reserved_saved_auxv in struct mm_struct. - -Signed-off-by: HATAYAMA Daisuke -Signed-off-by: Lianbo Jiang ---- - src/libgcore/gcore_coredump.c | 54 +++++++++++++++++++++++++++++------ - 1 file changed, 46 insertions(+), 8 deletions(-) - -diff --git a/src/libgcore/gcore_coredump.c b/src/libgcore/gcore_coredump.c -index 6f57b21b62b6..c14cc116e951 100644 ---- a/src/libgcore/gcore_coredump.c -+++ b/src/libgcore/gcore_coredump.c -@@ -18,6 +18,10 @@ - - static struct elf_note_info *elf_note_info_init(void); - -+static void get_auxv_size_addr(struct task_context *tc, -+ size_t *size, -+ ulong *addr); -+ - static void fill_prstatus_note(struct elf_note_info *info, - struct task_context *tc, - struct memelfnote *memnote); -@@ -923,18 +927,49 @@ compat_fill_prstatus_note(struct elf_note_info *info, - - #endif /* GCORE_ARCH_COMPAT */ - -+static void get_auxv_size_addr(struct task_context *tc, -+ size_t *psize, -+ ulong *paddr) -+{ -+ size_t size; -+ ulong addr; -+ -+ if (MEMBER_EXISTS("mm_struct", "rh_reserved_saved_auxv")) { -+ ulong mm_rh; -+ -+ size = MEMBER_SIZE("mm_struct_rh", "saved_auxv"); -+ readmem(task_mm(tc->task, FALSE) + MEMBER_OFFSET("mm_struct", "mm_rh"), -+ KVADDR, -+ &mm_rh, -+ sizeof(mm_rh), -+ "mm_struct mm_rh", -+ gcore_verbose_error_handle()); -+ addr = mm_rh + MEMBER_OFFSET("mm_struct_rh", "saved_auxv"); -+ } else { -+ size = MEMBER_SIZE("mm_struct", "saved_auxv"); -+ addr = task_mm(tc->task, FALSE) + -+ MEMBER_OFFSET("mm_struct", "saved_auxv"); -+ } -+ -+ *psize = size; -+ *paddr = addr; -+} -+ - static void - fill_auxv_note(struct elf_note_info *info, struct task_context *tc, - struct memelfnote *memnote) - { - ulong *auxv; -+ ulong addr; -+ size_t size; - int i; - -- auxv = (ulong *)GETBUF(MEMBER_SIZE("mm_struct", "saved_auxv")); -+ get_auxv_size_addr(tc, &size, &addr); - -- readmem(task_mm(tc->task, FALSE) + -- MEMBER_OFFSET("mm_struct", "saved_auxv"), KVADDR, auxv, -- MEMBER_SIZE("mm_struct", "saved_auxv"), "fill_auxv_note", -+ auxv = (ulong *)GETBUF(size); -+ -+ readmem(addr, KVADDR, auxv, -+ size, "fill_auxv_note", - gcore_verbose_error_handle()); - - i = 0; -@@ -954,13 +989,16 @@ compat_fill_auxv_note(struct elf_note_info *info, - struct memelfnote *memnote) - { - uint32_t *auxv; -+ ulong addr; -+ size_t size; - int i; - -- auxv = (uint32_t *)GETBUF(MEMBER_SIZE("mm_struct", "saved_auxv")); -+ get_auxv_size_addr(tc, &size, &addr); -+ -+ auxv = (uint32_t *)GETBUF(size); - -- readmem(task_mm(tc->task, FALSE) + -- MEMBER_OFFSET("mm_struct", "saved_auxv"), KVADDR, auxv, -- MEMBER_SIZE("mm_struct", "saved_auxv"), "fill_auxv_note32", -+ readmem(addr, KVADDR, auxv, -+ size, "fill_auxv_note32", - gcore_verbose_error_handle()); - - i = 0; --- -2.37.1 - diff --git a/SOURCES/0004-x86-Fix-failure-of-collecting-vsyscall-mapping-due-t.patch b/SOURCES/0004-x86-Fix-failure-of-collecting-vsyscall-mapping-due-t.patch deleted file mode 100644 index a4c7ca5..0000000 --- a/SOURCES/0004-x86-Fix-failure-of-collecting-vsyscall-mapping-due-t.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 03f9360715731f18e4fdae7b30aa34b30dddcd57 Mon Sep 17 00:00:00 2001 -From: HATAYAMA Daisuke -Date: Sat, 26 Mar 2022 21:42:02 +0900 -Subject: [PATCH 4/8] x86: Fix failure of collecting vsyscall mapping due to - change of enum type of vsyscall_mode - -vsyscall mapping fails to get collected because the commit -bd49e16e3339 (x86/vsyscall: Add a new vsyscall=xonly mode) merged at -kernel v5.2-rc7 added constant XONLY to the anonymous enumeration type -of variable vsyscall_mode, which made the value of constant NONE -change from 1 to 2. - -This commit fixes the issue by checking the value of constant NONE -using gdb's print command and typeof operator since there's no utility -function to handle such anonymous enumeration type currently in crash -utility. - -Signed-off-by: HATAYAMA Daisuke -Signed-off-by: Lianbo Jiang ---- - src/libgcore/gcore_x86.c | 56 ++++++++++++++++++++++++++++++++++++++-- - 1 file changed, 54 insertions(+), 2 deletions(-) - -diff --git a/src/libgcore/gcore_x86.c b/src/libgcore/gcore_x86.c -index 08e573c741f6..f334a85d4240 100644 ---- a/src/libgcore/gcore_x86.c -+++ b/src/libgcore/gcore_x86.c -@@ -41,6 +41,9 @@ struct gcore_x86_table - static struct gcore_x86_table gcore_x86_table; - struct gcore_x86_table *gxt = &gcore_x86_table; - -+static void gdb_run_command(char *cmd, char *buf, size_t size); -+static int get_vsyscall_mode_none(void); -+ - #ifdef X86_64 - static ulong gcore_x86_64_get_old_rsp(int cpu); - static ulong gcore_x86_64_get_per_cpu__old_rsp(int cpu); -@@ -2367,6 +2370,54 @@ int gcore_is_arch_32bit_emulation(struct task_context *tc) - return FALSE; - } - -+static void gdb_run_command(char *cmd, char *buf, size_t size) -+{ -+ open_tmpfile(); -+ if (!gdb_pass_through(cmd, -+ pc->tmpfile, -+ GNU_RETURN_ON_ERROR)) { -+ close_tmpfile(); -+ error(FATAL, "gdb command failed: %s", cmd); -+ } -+ rewind(pc->tmpfile); -+ fgets(buf, size, pc->tmpfile); -+ close_tmpfile(); -+} -+ -+static int get_vsyscall_mode_none(void) -+{ -+ static int none = -1; -+ char cmd[32], buf[BUFSIZE]; -+ int i; -+ -+ if (none != -1) -+ return none; -+ -+ /* -+ * Variable vsyscall_mode is of anonymous enumeration -+ * type. Because there's no utility function in crash utility -+ * to get value of each constant in specified anonymous -+ * enumeration type, we have no choice but rely on gdb's print -+ * command in combination with typeof operator. -+ */ -+ for (i = 0; i < 10; ++i) { -+ snprintf(cmd, sizeof(cmd), "p (typeof(vsyscall_mode))%d", i); -+ gdb_run_command(cmd, buf, sizeof(buf)); -+ if (strstr(buf, "NONE")) -+ return none = i; -+ } -+ -+ /* -+ * When the above logic doesn't work as expected, use 2, which -+ * is the value on the definition where vsyscall_mode was -+ * first introduced at the commit 3ae36655b97a (x86-64: Rework -+ * vsyscall emulation and add vsyscall= parameter). -+ */ -+ none = 2; -+ -+ return none; -+} -+ - /** - * Return an address to gate_vma. - */ -@@ -2377,7 +2428,8 @@ ulong gcore_arch_get_gate_vma(void) - return 0UL; - - if (symbol_exists("vsyscall_mode")) { -- enum { ENUMERATE, NONE } vsyscall_mode; -+ int vsyscall_mode; -+ int none = get_vsyscall_mode_none(); - - readmem(symbol_value("vsyscall_mode"), - KVADDR, -@@ -2386,7 +2438,7 @@ ulong gcore_arch_get_gate_vma(void) - "gcore_arch_get_gate_vma: vsyscall_mode", - gcore_verbose_error_handle()); - -- if (vsyscall_mode == NONE) -+ if (vsyscall_mode == none) - return 0UL; - } - --- -2.37.1 - diff --git a/SOURCES/0005-coredump-fix-segmentation-fault-caused-by-type-misma.patch b/SOURCES/0005-coredump-fix-segmentation-fault-caused-by-type-misma.patch deleted file mode 100644 index 1459b6b..0000000 --- a/SOURCES/0005-coredump-fix-segmentation-fault-caused-by-type-misma.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 1ba701c1d7bd94cc5a02f51652712acdcbf0875c Mon Sep 17 00:00:00 2001 -From: Vincent Whitchurch -Date: Tue, 21 Jun 2022 09:15:33 +0000 -Subject: [PATCH 5/8] coredump: fix segmentation fault caused by type mismatch -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -crash gcore command on ARM sometimes results in segmentation fault: - - crash> gcore -v 0 - Segmentation fault (core dumped) - -This is caused by type mismatch of a variable paddr in function -gcore_readmem_user() to hold a physical address, which is indicated by -the following warning message: - - libgcore/gcore_coredump.c: In function ‘gcore_readmem_user’: - libgcore/gcore_coredump.c:85:26: warning: passing argument 2 of - ‘uvtop_quiet’ from incompatible pointer type - [-Wincompatible-pointer-types] - - if (!uvtop_quiet(addr, &paddr)) { - ^~~~~~ - libgcore/gcore_coredump.c:71:49: note: expected ‘physaddr_t *’ {aka - ‘long long unsigned int *’} but argument is of type ‘ulong *’ {aka ‘long - unsigned int *’} - - static int uvtop_quiet(ulong vaddr, physaddr_t *paddr); - ~~~~~~~~~~~~^~~~~ - -On ARM, long unsigned int has 4 byte length, while physaddr_t has 8 -byte length. The mismatch causes overwriting of stack variables. - -Fix this by changing the type of the variable paddr to physaddr_t. - -Signed-off-by: Vincent Whitchurch -Signed-off-by: Lianbo Jiang ---- - src/libgcore/gcore_coredump.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/src/libgcore/gcore_coredump.c b/src/libgcore/gcore_coredump.c -index c14cc116e951..424b0a40a42b 100644 ---- a/src/libgcore/gcore_coredump.c -+++ b/src/libgcore/gcore_coredump.c -@@ -78,7 +78,8 @@ readswap(ulonglong pte_val, char *buf, ulong len, ulonglong vaddr) - - void gcore_readmem_user(ulong addr, void *buf, long size, char *type) - { -- ulong paddr, cnt; -+ physaddr_t paddr; -+ ulong cnt; - char *bufptr = buf; - - while (size > 0) { --- -2.37.1 - diff --git a/SOURCES/0006-elf-fix-warning-message-caused-by-type-mismatch-of-o.patch b/SOURCES/0006-elf-fix-warning-message-caused-by-type-mismatch-of-o.patch deleted file mode 100644 index 6005a21..0000000 --- a/SOURCES/0006-elf-fix-warning-message-caused-by-type-mismatch-of-o.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 8ff3de974aa9fdf8934797122dc55428ef571ab2 Mon Sep 17 00:00:00 2001 -From: Vincent Whitchurch -Date: Tue, 21 Jun 2022 09:15:34 +0000 -Subject: [PATCH 6/8] elf: fix warning message caused by type mismatch of - offset types -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Use loff_t consistently to fix these warnings on -m32 builds on 64-bit: - - libgcore/gcore_coredump.c: In function ‘writenote’: - libgcore/gcore_coredump.c:701:58: warning: passing argument 3 of - ‘gcore->elf->ops->write_note_header’ from incompatible pointer type - [-Wincompatible-pointer-types] - - if (!gcore->elf->ops->write_note_header(gcore->elf, fp, foffset)) - ^~~~~~~ - libgcore/gcore_coredump.c:701:58: note: expected ‘off_t *’ {aka ‘long - int *’} but argument is of type ‘loff_t *’ {aka ‘long long int *’} - -Signed-off-by: Vincent Whitchurch -Signed-off-by: Lianbo Jiang ---- - src/libgcore/gcore_defs.h | 2 +- - src/libgcore/gcore_elf_struct.c | 4 ++-- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/libgcore/gcore_defs.h b/src/libgcore/gcore_defs.h -index 3233ea533ca0..409678e1ad68 100644 ---- a/src/libgcore/gcore_defs.h -+++ b/src/libgcore/gcore_defs.h -@@ -1232,7 +1232,7 @@ struct gcore_elf_operations - int (*write_section_header)(struct gcore_elf_struct *this, FILE *fp); - int (*write_program_header)(struct gcore_elf_struct *this, FILE *fp); - int (*write_note_header)(struct gcore_elf_struct *this, FILE *fp, -- off_t *offset); -+ loff_t *offset); - - uint64_t (*get_e_phoff)(struct gcore_elf_struct *this); - uint64_t (*get_e_shoff)(struct gcore_elf_struct *this); -diff --git a/src/libgcore/gcore_elf_struct.c b/src/libgcore/gcore_elf_struct.c -index 2aca984cf90f..b31388aa7e28 100644 ---- a/src/libgcore/gcore_elf_struct.c -+++ b/src/libgcore/gcore_elf_struct.c -@@ -141,7 +141,7 @@ static int elf64_write_program_header(struct gcore_elf_struct *this, FILE *fp) - } - - static int elf64_write_note_header(struct gcore_elf_struct *this, FILE *fp, -- off_t *offset) -+ loff_t *offset) - { - Elf64_Nhdr *n = &((struct gcore_elf64_struct *)this)->nhdr; - -@@ -314,7 +314,7 @@ static int elf32_write_program_header(struct gcore_elf_struct *this, FILE *fp) - } - - static int elf32_write_note_header(struct gcore_elf_struct *this, FILE *fp, -- off_t *offset) -+ loff_t *offset) - { - Elf32_Nhdr *n = &((struct gcore_elf32_struct *)this)->nhdr; - --- -2.37.1 - diff --git a/SOURCES/0007-coredump-fix-unexpected-truncation-of-generated-core.patch b/SOURCES/0007-coredump-fix-unexpected-truncation-of-generated-core.patch deleted file mode 100644 index c96c980..0000000 --- a/SOURCES/0007-coredump-fix-unexpected-truncation-of-generated-core.patch +++ /dev/null @@ -1,53 +0,0 @@ -From dbb542e10bfe1b2e21c7927bda9be1d301cfef65 Mon Sep 17 00:00:00 2001 -From: HATAYAMA Daisuke -Date: Fri, 17 Jun 2022 20:38:19 +0900 -Subject: [PATCH 7/8] coredump: fix unexpected truncation of generated core - files - -Core files generated by crash gcore command are sometimes unexpectedly -truncated. Then, we can get aware of this from the following warning -message output by gdb: - - BFD: warning: /root/./core.1.systemd is truncated: expected core file size >= 43606016, found: 43597824 - -From the investigation, it turned out that this truncation is -occurring when there is no write() operation after the area skipped by -lseek(). Holes are generated only when there is write() operation. - -To fix this issue, use ftruncate() to allocate holes explicitly. - -Signed-off-by: HATAYAMA Daisuke -Signed-off-by: Lianbo Jiang ---- - src/libgcore/gcore_coredump.c | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) - -diff --git a/src/libgcore/gcore_coredump.c b/src/libgcore/gcore_coredump.c -index 424b0a40a42b..27086d91468b 100644 ---- a/src/libgcore/gcore_coredump.c -+++ b/src/libgcore/gcore_coredump.c -@@ -331,6 +331,21 @@ void gcore_coredump(void) - } - progressf("done.\n"); - -+ /* -+ * Use ftruncate() to generate holes explicitly, or core file -+ * gets truncated if there is no write() operation after the -+ * area skipped by lseek(). -+ */ -+ if (fflush(gcore->fp)) -+ error(FATAL, "%s: fflush: %s\n", -+ gcore->corename, -+ strerror(errno)); -+ -+ if (ftruncate(fileno(gcore->fp), ftell(gcore->fp)) < 0) -+ error(FATAL, "%s: ftruncate: %s\n", -+ gcore->corename, -+ strerror(errno)); -+ - gcore->flags |= GCF_SUCCESS; - - } --- -2.37.1 - diff --git a/SOURCES/0008-gcore.mk-fix-mismatch-of-_FILE_OFFSET_BITS-when-buil.patch b/SOURCES/0008-gcore.mk-fix-mismatch-of-_FILE_OFFSET_BITS-when-buil.patch deleted file mode 100644 index 21947c2..0000000 --- a/SOURCES/0008-gcore.mk-fix-mismatch-of-_FILE_OFFSET_BITS-when-buil.patch +++ /dev/null @@ -1,43 +0,0 @@ -From d2795659986dacc51e98a3d1dbc8b673582c20fe Mon Sep 17 00:00:00 2001 -From: HATAYAMA Daisuke -Date: Tue, 28 Jun 2022 03:54:46 +0900 -Subject: [PATCH 8/8] gcore.mk: fix mismatch of _FILE_OFFSET_BITS when building - gcore.so - -On arm and mips, while _FILE_OFFSET_BITS=64 is used when building -gcore.so by make extensions, it is not used by gcore.mk. - -Fix this inconsistency by using _FILE_OFFSET_BITS=64 in gcore.mk on -arm and mips. - -Signed-off-by: HATAYAMA Daisuke -Signed-off-by: Lianbo Jiang ---- - src/gcore.mk | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/gcore.mk b/src/gcore.mk -index 4af292b79c60..1fd4d84c2ded 100644 ---- a/src/gcore.mk -+++ b/src/gcore.mk -@@ -32,7 +32,7 @@ endif - - ifeq ($(shell arch), arm) - TARGET=ARM -- TARGET_CFLAGS= -+ TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64 - ARCH=SUPPORTED - endif - -@@ -44,7 +44,7 @@ endif - - ifeq ($(shell arch), mips) - TARGET=MIPS -- TARGET_CFLAGS= -+ TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64 - ARCH=SUPPORTED - endif - --- -2.37.1 - diff --git a/SPECS/crash-gcore-command.spec b/SPECS/crash-gcore-command.spec index 0318f6f..1dd2b54 100644 --- a/SPECS/crash-gcore-command.spec +++ b/SPECS/crash-gcore-command.spec @@ -2,8 +2,8 @@ Summary: Gcore extension module for the crash utility Name: crash-gcore-command -Version: 1.6.3 -Release: 2%{?dist} +Version: 1.6.4 +Release: 1%{?dist} License: GPLv2 Source0: https://github.com/fujitsu/crash-gcore/archive/v%{version}/%{name}-%{version}.tar.gz URL: https://github.com/fujitsu/crash-gcore @@ -13,14 +13,8 @@ BuildRequires: crash-devel >= 5.1.5 BuildRequires: gcc Requires: crash >= 5.1.5 -Patch0: 0001-coredump-use-MEMBER_-OFFSET-SIZE-instead-of-GCORE_-O.patch -Patch1: 0002-gcore-defs-remove-definitions-and-initializations-fo.patch -Patch2: 0003-gcore-fix-memory-allocation-failure-during-processin.patch -Patch3: 0004-x86-Fix-failure-of-collecting-vsyscall-mapping-due-t.patch -Patch4: 0005-coredump-fix-segmentation-fault-caused-by-type-misma.patch -Patch5: 0006-elf-fix-warning-message-caused-by-type-mismatch-of-o.patch -Patch6: 0007-coredump-fix-unexpected-truncation-of-generated-core.patch -Patch7: 0008-gcore.mk-fix-mismatch-of-_FILE_OFFSET_BITS-when-buil.patch +Patch0: 0001-coredump-fix-building-failure-due-to-undefined-macro.patch +Patch1: 0002-x86-fix-extend-gcore.so-taking-much-time-like-more-t.patch %description Command for creating a core dump file of a user-space task that was @@ -43,6 +37,9 @@ install -m 0755 -t %{buildroot}%{_libdir}/crash/extensions %{_builddir}/%{repona %license COPYING %changelog +* Fri Jul 05 2024 Lianbo Jiang - 1.6.4-1 +- Rebase to upstream 1.6.4 + * Fri Nov 18 2022 Lianbo Jiang - 1.6.3-2 - Update to the latest commit d2795659986d