diff mbox series

[hardknott,meta-oe] minicoredumper: retry elf parsing as long as needed

Message ID 20220823175656.22556-1-sakib.sajal@windriver.com
State New
Headers show
Series [hardknott,meta-oe] minicoredumper: retry elf parsing as long as needed | expand

Commit Message

Sakib Sajal Aug. 23, 2022, 5:56 p.m. UTC
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>
---
 ...-retry-elf-parsing-as-long-as-needed.patch | 128 ++++++++++++++++++
 .../minicoredumper/minicoredumper_2.0.1.bb    |   1 +
 2 files changed, 129 insertions(+)
 create mode 100644 meta-oe/recipes-kernel/minicoredumper/files/0001-minicoredumper-retry-elf-parsing-as-long-as-needed.patch

Comments

Alexander Kanavin Aug. 24, 2022, 7:33 a.m. UTC | #1
Hello,

the correct list for the patch is openembedded-devel

Alex

On Tue, 23 Aug 2022 at 19:57, Sakib Sajal <sakib.sajal@windriver.com> wrote:
>
> 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>
> ---
>  ...-retry-elf-parsing-as-long-as-needed.patch | 128 ++++++++++++++++++
>  .../minicoredumper/minicoredumper_2.0.1.bb    |   1 +
>  2 files changed, 129 insertions(+)
>  create mode 100644 meta-oe/recipes-kernel/minicoredumper/files/0001-minicoredumper-retry-elf-parsing-as-long-as-needed.patch
>
> 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 000000000..8d5b8b6cb
> --- /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 8188ae599..5c5e0b241 100644
> --- a/meta-oe/recipes-kernel/minicoredumper/minicoredumper_2.0.1.bb
> +++ b/meta-oe/recipes-kernel/minicoredumper/minicoredumper_2.0.1.bb
> @@ -16,6 +16,7 @@ PR .= "+git${SRCPV}"
>  SRC_URI = "git://github.com/diamon/minicoredumper;protocol=https;branch=master \
>             file://minicoredumper.service \
>             file://minicoredumper.init \
> +           file://0001-minicoredumper-retry-elf-parsing-as-long-as-needed.patch \
>             "
>
>  S = "${WORKDIR}/git"
> --
> 2.33.0
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#169721): https://lists.openembedded.org/g/openembedded-core/message/169721
> Mute This Topic: https://lists.openembedded.org/mt/93210142/1686489
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alex.kanavin@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
diff mbox series

Patch

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 000000000..8d5b8b6cb
--- /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 8188ae599..5c5e0b241 100644
--- a/meta-oe/recipes-kernel/minicoredumper/minicoredumper_2.0.1.bb
+++ b/meta-oe/recipes-kernel/minicoredumper/minicoredumper_2.0.1.bb
@@ -16,6 +16,7 @@  PR .= "+git${SRCPV}"
 SRC_URI = "git://github.com/diamon/minicoredumper;protocol=https;branch=master \
            file://minicoredumper.service \
            file://minicoredumper.init \
+           file://0001-minicoredumper-retry-elf-parsing-as-long-as-needed.patch \
            "
 
 S = "${WORKDIR}/git"