aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSakib Sajal <sakib.sajal@windriver.com>2022-09-22 16:38:53 -0400
committerArmin Kuster <akuster808@gmail.com>2022-09-25 11:03:26 -0400
commitbd2d8fba766f912bd1bc5cde7d6f0e72152f1547 (patch)
treec85505af4219ffaf6ec417933d0e011d8064ed5f
parentde2bbc5ef443f4cb045f8b6b6c60f9e2ac103c2c (diff)
downloadmeta-openembedded-contrib-bd2d8fba766f912bd1bc5cde7d6f0e72152f1547.tar.gz
minicoredumper: retry elf parsing as long as needed
Maximum number of tries, in rare cases, is insufficient for elf parse. Backport patch that fixes the issue. Signed-off-by: Sakib Sajal <sakib.sajal@windriver.com> Signed-off-by: Khem Raj <raj.khem@gmail.com> (cherry picked from commit e231c86e282eefff0e8164551f75f8e01682abe6) Signed-off-by: Sakib Sajal <sakib.sajal@windriver.com>
-rw-r--r--meta-oe/recipes-kernel/minicoredumper/files/0001-minicoredumper-retry-elf-parsing-as-long-as-needed.patch128
-rw-r--r--meta-oe/recipes-kernel/minicoredumper/minicoredumper_2.0.1.bb1
2 files changed, 129 insertions, 0 deletions
diff --git a/meta-oe/recipes-kernel/minicoredumper/files/0001-minicoredumper-retry-elf-parsing-as-long-as-needed.patch b/meta-oe/recipes-kernel/minicoredumper/files/0001-minicoredumper-retry-elf-parsing-as-long-as-needed.patch
new file mode 100644
index 0000000000..8d5b8b6cbb
--- /dev/null
+++ b/meta-oe/recipes-kernel/minicoredumper/files/0001-minicoredumper-retry-elf-parsing-as-long-as-needed.patch
@@ -0,0 +1,128 @@
+From 7a8c6a06c86e133e4346b1dc66483bd8d0d3c716 Mon Sep 17 00:00:00 2001
+From: John Ogness <john.ogness@linutronix.de>
+Date: Tue, 24 Aug 2021 21:10:43 +0200
+Subject: [PATCH] minicoredumper: retry elf parsing as long as needed
+
+As was reported in github issue #2 ("maximum number of tries
+insufficient, in rare cases, for elf parse"), the number of retries
+for parsing a process may be insufficient. Rather than setting an
+upper limit on the maximum number of retries, track the number of
+headers seen. As long as the number of seen headers is greater than
+the previous try, try again.
+
+In order to avoid introducing any new issues, preserve the behavior
+of retrying at least 10 times, even if no new headers are seen.
+
+Reported-by: github.com/ssajal-wr
+Signed-off-by: John Ogness <john.ogness@linutronix.de>
+
+Upstream-Status: Backport [7a8c6a06c86e133e4346b1dc66483bd8d0d3c716]
+
+Signed-off-by: Sakib Sajal <sakib.sajal@windriver.com>
+---
+ src/minicoredumper/corestripper.c | 30 +++++++++++++++++++++++-------
+ 1 file changed, 23 insertions(+), 7 deletions(-)
+
+diff --git a/src/minicoredumper/corestripper.c b/src/minicoredumper/corestripper.c
+index d96d1df..c96b350 100644
+--- a/src/minicoredumper/corestripper.c
++++ b/src/minicoredumper/corestripper.c
+@@ -761,7 +761,7 @@ static int init_log(struct dump_info *di)
+ typedef int elf_parse_cb(struct dump_info *di, Elf *elf, GElf_Phdr *phdr);
+
+ static int do_elf_ph_parse(struct dump_info *di, GElf_Phdr *type,
+- elf_parse_cb *callback)
++ elf_parse_cb *callback, size_t *phnum_found)
+ {
+ GElf_Ehdr ehdr_mem;
+ GElf_Ehdr *ehdr;
+@@ -770,6 +770,9 @@ static int do_elf_ph_parse(struct dump_info *di, GElf_Phdr *type,
+ size_t phnum;
+ size_t cnt;
+
++ if (phnum_found)
++ *phnum_found = 0;
++
+ /* start from beginning of core */
+ if (lseek64(di->elf_fd, 0, SEEK_SET) == -1) {
+ info("lseek failed: %s", strerror(errno));
+@@ -809,6 +812,9 @@ static int do_elf_ph_parse(struct dump_info *di, GElf_Phdr *type,
+ goto out;
+ }
+
++ if (phnum_found)
++ *phnum_found = phnum;
++
+ for (cnt = 0; cnt < phnum; cnt++) {
+ GElf_Phdr phdr_mem;
+ GElf_Phdr *phdr;
+@@ -891,7 +897,7 @@ static int vma_cb(struct dump_info *di, Elf *elf, GElf_Phdr *phdr)
+ /*
+ * Tries to parse the found ELF headers and reads all vmas from it.
+ */
+-static int parse_vma_info(struct dump_info *di)
++static int parse_vma_info(struct dump_info *di, size_t *phnum_found)
+ {
+ unsigned long min_off = ULONG_MAX;
+ unsigned long max_len = 0;
+@@ -911,7 +917,7 @@ static int parse_vma_info(struct dump_info *di)
+ memset(&type, 0, sizeof(type));
+ type.p_type = PT_LOAD;
+ type.p_flags = PF_R;
+- if (do_elf_ph_parse(di, &type, vma_cb) != 0)
++ if (do_elf_ph_parse(di, &type, vma_cb, phnum_found) != 0)
+ return -1;
+
+ for (v = di->vma; v; v = v->next) {
+@@ -1614,8 +1620,10 @@ int add_core_data(struct dump_info *di, off64_t dest_offset, size_t len,
+ */
+ static int init_src_core(struct dump_info *di, int src)
+ {
++ size_t last_phnum = 0;
+ int tries = 0;
+ int ret = -1;
++ size_t phnum;
+ size_t len;
+ char *buf;
+ long pos;
+@@ -1642,7 +1650,7 @@ again:
+ goto out;
+
+ /* try to elf-parse the core to read vma info */
+- ret = parse_vma_info(di);
++ ret = parse_vma_info(di, &phnum);
+
+ /* restore our position */
+ if (lseek64(di->elf_fd, pos, SEEK_SET) == -1)
+@@ -1653,9 +1661,17 @@ again:
+
+ tries++;
+
+- /* maybe try again */
+- if (tries < 10)
++ if (phnum > last_phnum) {
++ /* new headers found, keep trying */
++ last_phnum = phnum;
+ goto again;
++ } else if (tries < 10) {
++ /*
++ * even if no new headers are found,
++ * retry at least 10 times
++ */
++ goto again;
++ }
+
+ goto out;
+ }
+@@ -2106,7 +2122,7 @@ static int dump_stacks(struct dump_info *di)
+ /* find and set the first task */
+ memset(&type, 0, sizeof(type));
+ type.p_type = PT_NOTE;
+- do_elf_ph_parse(di, &type, note_cb);
++ do_elf_ph_parse(di, &type, note_cb, NULL);
+ }
+
+ if (di->first_pid)
+--
+2.25.1
+
diff --git a/meta-oe/recipes-kernel/minicoredumper/minicoredumper_2.0.1.bb b/meta-oe/recipes-kernel/minicoredumper/minicoredumper_2.0.1.bb
index bf99152942..0b934ee2d8 100644
--- a/meta-oe/recipes-kernel/minicoredumper/minicoredumper_2.0.1.bb
+++ b/meta-oe/recipes-kernel/minicoredumper/minicoredumper_2.0.1.bb
@@ -17,6 +17,7 @@ SRC_URI = "git://github.com/diamon/minicoredumper;protocol=https;branch=master \
file://0001-replace-pthread_mutexattr_setrobust_np-with-pthread_.patch \
file://minicoredumper.service \
file://minicoredumper.init \
+ file://0001-minicoredumper-retry-elf-parsing-as-long-as-needed.patch \
"
S = "${WORKDIR}/git"