Blame SOURCES/rhbz1643997.0013-bpf-translate.cxx-fix-segfault-with-malformed-regist.patch

e4e640
From 99ee8b19901f4908e2a2942731c34e03aadd9549 Mon Sep 17 00:00:00 2001
e4e640
From: Serhei Makarov <smakarov@redhat.com>
e4e640
Date: Tue, 30 Oct 2018 17:10:53 -0400
e4e640
Subject: [PATCH 13/32] bpf-translate.cxx :: fix segfault with malformed
e4e640
 register
e4e640
e4e640
---
e4e640
 bpf-translate.cxx                                  | 9 +++++++--
e4e640
 testsuite/systemtap.bpf/asm_tests/err-regparse.stp | 9 +++++++++
e4e640
 2 files changed, 16 insertions(+), 2 deletions(-)
e4e640
 create mode 100644 testsuite/systemtap.bpf/asm_tests/err-regparse.stp
e4e640
e4e640
diff --git a/bpf-translate.cxx b/bpf-translate.cxx
e4e640
index bb133bae5..d46dae44a 100644
e4e640
--- a/bpf-translate.cxx
e4e640
+++ b/bpf-translate.cxx
e4e640
@@ -952,8 +952,13 @@ bpf_unparser::emit_asm_arg (const asm_stmt &stmt, const std::string &arg,
e4e640
     {
e4e640
       /* arg is a register number */
e4e640
       std::string reg = arg[0] == 'r' ? arg.substr(1) : arg;
e4e640
-      unsigned long num = stoul(reg, 0, 0);
e4e640
-      if (num > 10)
e4e640
+      unsigned long num;
e4e640
+      bool parsed = false;
e4e640
+      try {
e4e640
+        num = stoul(reg, 0, 0);
e4e640
+        parsed = true;
e4e640
+      } catch (std::exception &e) {} // XXX: invalid_argument, out_of_range
e4e640
+      if (!parsed || num > 10)
e4e640
 	throw SEMANTIC_ERROR (_F("invalid bpf register '%s'",
e4e640
                                  arg.c_str()), stmt.tok);
e4e640
       return this_prog.lookup_reg(num);
e4e640
diff --git a/testsuite/systemtap.bpf/asm_tests/err-regparse.stp b/testsuite/systemtap.bpf/asm_tests/err-regparse.stp
e4e640
new file mode 100644
e4e640
index 000000000..ba66800e6
e4e640
--- /dev/null
e4e640
+++ b/testsuite/systemtap.bpf/asm_tests/err-regparse.stp
e4e640
@@ -0,0 +1,9 @@
e4e640
+function foo:long () %{ /* bpf */ /* pure */
e4e640
+  0xb7, $rc, -, -, 50; /* mov $rc, 50 */
e4e640
+  0xbf, $$, rc, -, -; /* mov $$, $rc -- TYPO */
e4e640
+%}
e4e640
+
e4e640
+probe begin {
e4e640
+  printf("foo()=%d should be fifty\n", foo())
e4e640
+  exit()
e4e640
+}
e4e640
-- 
e4e640
2.14.5
e4e640