lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-Id: <20210203022507.677283-1-Jianlin.Lv@arm.com> Date: Wed, 3 Feb 2021 10:25:07 +0800 From: Jianlin Lv <Jianlin.Lv@....com> To: peterz@...radead.org, mingo@...hat.com, acme@...nel.org, mark.rutland@....com, alexander.shishkin@...ux.intel.com, jolsa@...hat.com, namhyung@...nel.org, mhiramat@...nel.org, srikar@...ux.vnet.ibm.com, adrian.hunter@...el.com Cc: Jianlin.Lv@....com, linux-kernel@...r.kernel.org Subject: [PATCH] perf probe: Added protection to avoid endless loop if dwarf_offdie() return NULL, the continue statement forces the next iteration of the loop without update variable off. It will cause an endless loop in the process of traversing the compilation unit. So added exception protection for loop CUs. Signed-off-by: Jianlin Lv <Jianlin.Lv@....com> --- tools/perf/util/probe-finder.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index 76dd349aa48d..887bffb1cc58 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c @@ -1156,7 +1156,7 @@ static int debuginfo__find_probe_location(struct debuginfo *dbg, Dwarf_Die *diep; int ret = 0; - off = 0; + noff = 0; pf->lcache = intlist__new(NULL); if (!pf->lcache) return -ENOMEM; @@ -1184,7 +1184,7 @@ static int debuginfo__find_probe_location(struct debuginfo *dbg, } /* Loop on CUs (Compilation Unit) */ - while (!dwarf_nextcu(dbg->dbg, off, &noff, &cuhl, NULL, NULL, NULL)) { + while (!dwarf_nextcu(dbg->dbg, off = noff, &noff, &cuhl, NULL, NULL, NULL)) { /* Get the DIE(Debugging Information Entry) of this CU */ diep = dwarf_offdie(dbg->dbg, off + cuhl, &pf->cu_die); if (!diep) @@ -1208,7 +1208,6 @@ static int debuginfo__find_probe_location(struct debuginfo *dbg, if (ret < 0) break; } - off = noff; } found: @@ -1919,7 +1918,7 @@ int debuginfo__find_line_range(struct debuginfo *dbg, struct line_range *lr) { struct line_finder lf = {.lr = lr, .found = 0}; int ret = 0; - Dwarf_Off off = 0, noff; + Dwarf_Off off = 0, noff = 0; size_t cuhl; Dwarf_Die *diep; const char *comp_dir; @@ -1943,6 +1942,7 @@ int debuginfo__find_line_range(struct debuginfo *dbg, struct line_range *lr) /* Loop on CUs (Compilation Unit) */ while (!lf.found && ret >= 0) { + off = noff; if (dwarf_nextcu(dbg->dbg, off, &noff, &cuhl, NULL, NULL, NULL) != 0) break; @@ -1967,7 +1967,6 @@ int debuginfo__find_line_range(struct debuginfo *dbg, struct line_range *lr) ret = find_line_range_by_line(NULL, &lf); } } - off = noff; } found: -- 2.25.1
Powered by blists - more mailing lists