commit d9ffccb8966bbd6fd054db4ca9f4aa1e9af2fa20 Author: CentOS Sources Date: Tue May 7 08:58:15 2019 -0400 import satyr-0.26-2.el8 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f066e4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/satyr-0.26.tar.xz diff --git a/.satyr.metadata b/.satyr.metadata new file mode 100644 index 0000000..6a7a092 --- /dev/null +++ b/.satyr.metadata @@ -0,0 +1 @@ +145348dcc67ed925c2f1b3426c994cfdddd0279a SOURCES/satyr-0.26.tar.xz diff --git a/SOURCES/0001-Anonymize-paths-in-frames.patch b/SOURCES/0001-Anonymize-paths-in-frames.patch new file mode 100644 index 0000000..4b2ddb1 --- /dev/null +++ b/SOURCES/0001-Anonymize-paths-in-frames.patch @@ -0,0 +1,262 @@ +From 0a71b956f2a778860cc35c83b051272f3f80cefc Mon Sep 17 00:00:00 2001 +From: Matej Marusak +Date: Thu, 5 Apr 2018 11:06:43 +0200 +Subject: [PATCH] Anonymize paths in frames + +Fixes abrt/libreport#523 + +Signed-off-by: Matej Marusak +--- + include/utils.h | 3 +++ + lib/java_frame.c | 6 ++++++ + lib/js_frame.c | 1 + + lib/normalize.c | 9 +++++++++ + lib/python_frame.c | 2 ++ + lib/ruby_frame.c | 2 ++ + lib/utils.c | 23 +++++++++++++++++++++++ + tests/java_frame.at | 12 ++++++++++++ + tests/js_frame.at | 7 +++++++ + tests/python/python.py | 8 ++++---- + tests/python_stacktraces/python-01 | 2 +- + tests/ruby_frame.at | 2 +- + 12 files changed, 71 insertions(+), 6 deletions(-) + +diff --git a/include/utils.h b/include/utils.h +index 1c7984b..b36bc2c 100644 +--- a/include/utils.h ++++ b/include/utils.h +@@ -406,6 +406,9 @@ sr_parse_os_release(const char *input, + void (*callback)(char*, char*, void*), + void *data); + ++char* ++anonymize_path(char *file_name); ++ + /** + * Demangles C++ symbol. + * @returns +diff --git a/lib/java_frame.c b/lib/java_frame.c +index 8724b64..ea407bf 100644 +--- a/lib/java_frame.c ++++ b/lib/java_frame.c +@@ -468,7 +468,10 @@ const char *sr_java_frame_parse_frame_url(struct sr_java_frame *frame, const cha + sr_location_add(location, 0, sr_skip_char_cspan(&cursor, path_stop)); + + if (mark != cursor) ++ { + frame->class_path = sr_strndup(mark, cursor - mark); ++ frame->class_path = anonymize_path(frame->class_path); ++ } + } + + if (*cursor != ']' && *cursor != '\n') +@@ -522,8 +525,11 @@ sr_java_frame_parse(const char **input, + if (sr_java_frame_parse_is_native_method(mark)) + frame->is_native = true; + else if (!sr_java_frame_parse_is_unknown_source(mark)) ++ { + /* DO NOT set file_name if input says that source isn't known */ + frame->file_name = sr_strndup(mark, cursor - mark); ++ frame->file_name = anonymize_path(frame->file_name); ++ } + } + + if (*cursor == ':') +diff --git a/lib/js_frame.c b/lib/js_frame.c +index cb29bd6..e9b6514 100644 +--- a/lib/js_frame.c ++++ b/lib/js_frame.c +@@ -344,6 +344,7 @@ sr_js_frame_parse_v8(const char **input, + * ^^^^^^^^^^^^^^^^^ + */ + frame->file_name = sr_strndup(local_input, token - local_input); ++ frame->file_name = anonymize_path(frame->file_name); + + location->column += sr_skip_char_cspan(&local_input, "\n"); + +diff --git a/lib/normalize.c b/lib/normalize.c +index d23e8f5..3973b3b 100644 +--- a/lib/normalize.c ++++ b/lib/normalize.c +@@ -630,6 +630,15 @@ sr_normalize_core_thread(struct sr_core_thread *thread) + frame = next_frame; + } + ++ /* Anonymize file_name if contains /home//... ++ */ ++ frame = thread->frames; ++ while (frame) ++ { ++ frame->file_name = anonymize_path(frame->file_name); ++ frame = frame->next; ++ } ++ + /* If the first frame has address 0x0000 and its name is '??', it + * is a dereferenced null, and we remove it. This frame is not + * really invalid, but it affects stacktrace quality rating. See +diff --git a/lib/python_frame.c b/lib/python_frame.c +index 9287f3d..8453016 100644 +--- a/lib/python_frame.c ++++ b/lib/python_frame.c +@@ -237,6 +237,8 @@ sr_python_frame_parse(const char **input, + frame->file_name = inside; + } + ++ frame->file_name = anonymize_path(frame->file_name); ++ + location->column += strlen(frame->file_name); + + if (0 == sr_skip_string(&local_input, "\", line ")) +diff --git a/lib/ruby_frame.c b/lib/ruby_frame.c +index 4926c63..76f17fe 100644 +--- a/lib/ruby_frame.c ++++ b/lib/ruby_frame.c +@@ -258,6 +258,8 @@ sr_ruby_frame_parse(const char **input, + /* Everything before the colon is the file name. */ + *p = '\0'; + frame->file_name = filename_lineno_in; ++ frame->file_name = anonymize_path(frame->file_name); ++ + filename_lineno_in = NULL; + + if(!sr_skip_char(&local_input, '`')) +diff --git a/lib/utils.c b/lib/utils.c +index 5bbbd19..415929c 100644 +--- a/lib/utils.c ++++ b/lib/utils.c +@@ -31,6 +31,9 @@ + #include + #include + ++#define ANONYMIZED_PATH "/home/anonymized" ++ ++ + /* The prototype is in C++ header cxxabi.h, let's just copypaste it here + * instead of fiddling with include directories */ + char* __cxa_demangle(const char* mangled_name, char* output_buffer, +@@ -849,3 +852,23 @@ sr_demangle_symbol(const char *sym) + + return demangled; + } ++ ++char* ++anonymize_path(char *orig_path) ++{ ++ if (!orig_path) ++ return orig_path; ++ char* new_path = orig_path; ++ if (strncmp(orig_path, "/home/", strlen("/home/")) == 0) ++ { ++ new_path = strchr(new_path + strlen("/home/"), '/'); ++ if (new_path) ++ { ++ // Join /home/anonymized/ and ^ ++ new_path = sr_asprintf("%s%s", ANONYMIZED_PATH, new_path); ++ free(orig_path); ++ return new_path; ++ } ++ } ++ return orig_path; ++} +diff --git a/tests/java_frame.at b/tests/java_frame.at +index 00738be..2c6a7de 100644 +--- a/tests/java_frame.at ++++ b/tests/java_frame.at +@@ -459,6 +459,18 @@ main(void) + location.column = 0; + check(c, &frame, c + strlen(c), &location); + ++ /** next frame **/ ++ sr_java_frame_init(&frame); ++ frame.name = sr_strdup("com.redhat.abrt.duke.nuke"); ++ frame.file_name = sr_strdup("duke.java"); ++ frame.class_path = sr_strdup("/home/anonymized/lib/java/foo.class"); ++ ++ c = " at com.redhat.abrt.duke.nuke(duke.java:-1) [file:/home/user/lib/java/foo.class]\n"; ++ sr_location_init(&location); ++ location.line = 2; ++ location.column = 0; ++ check(c, &frame, c + strlen(c), &location); ++ + /** next frame **/ + sr_java_frame_init(&frame); + frame.name = sr_strdup("com.redhat.abrt.duke.nuke"); +diff --git a/tests/js_frame.at b/tests/js_frame.at +index d17dd69..a3cc5d5 100644 +--- a/tests/js_frame.at ++++ b/tests/js_frame.at +@@ -102,6 +102,13 @@ main(void) + 33, + 63); + ++ check_valid("at ContextifyScript.Script.runInThisContext (/home/user/vm.js:25:33)", ++ "ContextifyScript.Script.runInThisContext", ++ "/home/anonymized/vm.js", ++ 25, ++ 33, ++ 74); ++ + check_valid("at ContextifyScript.Script.runInThisContext (vm.js:25:33) ", + "ContextifyScript.Script.runInThisContext", + "vm.js", +diff --git a/tests/python/python.py b/tests/python/python.py +index 9044200..77a9e59 100755 +--- a/tests/python/python.py ++++ b/tests/python/python.py +@@ -6,7 +6,7 @@ from test_helpers import * + path = '../python_stacktraces/python-01' + contents = load_input_contents(path) + frames_expected = 11 +-expected_short_text = '''#1 _getPackage in /usr/share/PackageKit/helpers/yum/yumBackend.py:2534 ++expected_short_text = '''#1 _getPackage in /home/anonymized/PackageKit/helpers/yum/yumBackend.py:2534 + #2 updateProgress in /usr/share/PackageKit/helpers/yum/yumBackend.py:2593 + #3 _do_start in /usr/share/PackageKit/helpers/yum/yumBackend.py:2551 + #4 start in /usr/lib/python2.6/site-packages/urlgrabber/progress.py:129 +@@ -76,16 +76,16 @@ class TestPythonStacktrace(BindingsTestCase): + self.assertEqual(self.trace.to_short_text(6), expected_short_text) + + def test_bthash(self): +- self.assertEqual(self.trace.get_bthash(), 'fa0a7ff4b65f18661a6ce102eb787ff0d77ff12f') ++ self.assertEqual(self.trace.get_bthash(), 'eabeeae89433bb3b3d9eb8190659dcf057ab3cd1') + + def test_duphash(self): + expected_plain = '''Thread +-/usr/share/PackageKit/helpers/yum/yumBackend.py:2534 ++/home/anonymized/PackageKit/helpers/yum/yumBackend.py:2534 + /usr/share/PackageKit/helpers/yum/yumBackend.py:2593 + /usr/share/PackageKit/helpers/yum/yumBackend.py:2551 + ''' + self.assertEqual(self.trace.get_duphash(flags=satyr.DUPHASH_NOHASH, frames=3), expected_plain) +- self.assertEqual(self.trace.get_duphash(), '2c8e509a33966a08df1dd8b2348e850d1bc5b776') ++ self.assertEqual(self.trace.get_duphash(), '8c8273cddf94e10fc0349284afcff8970056d9e5') + + def test_crash_thread(self): + self.assertTrue(self.trace.crash_thread is self.trace) +diff --git a/tests/python_stacktraces/python-01 b/tests/python_stacktraces/python-01 +index 58abbfc..ae5e72c 100644 +--- a/tests/python_stacktraces/python-01 ++++ b/tests/python_stacktraces/python-01 +@@ -19,6 +19,6 @@ Traceback (most recent call last): + self.updateProgress(name, 0.0, "", "") + File "/usr/share/PackageKit/helpers/yum/yumBackend.py", line 2593, in updateProgress + pkg = self._getPackage(name) +- File "/usr/share/PackageKit/helpers/yum/yumBackend.py", line 2534, in _getPackage ++ File "/home/user/PackageKit/helpers/yum/yumBackend.py", line 2534, in _getPackage + sections = name.rsplit('-', 2) + AttributeError: 'NoneType' object has no attribute 'rsplit' +diff --git a/tests/ruby_frame.at b/tests/ruby_frame.at +index 1b1b9d0..cef5603 100644 +--- a/tests/ruby_frame.at ++++ b/tests/ruby_frame.at +@@ -38,7 +38,7 @@ main(void) + "/usr/share/ruby/vendor_ruby/will_crash.rb", 13, "func", false, 2, 1); + + check("/home/u/work/will:crash/will_crash.rb:30:in `block in '", +- "/home/u/work/will:crash/will_crash.rb", 30, "class:WillClass", true, 1, 0); ++ "/home/anonymized/work/will:crash/will_crash.rb", 30, "class:WillClass", true, 1, 0); + + check("./will_ruby_raise:8:in `
'", + "./will_ruby_raise", 8, "main", true, 0, 0); +-- +2.17.1 + diff --git a/SOURCES/0002-testsuite-Correct-syntax-for-gdb-backtrace-command.patch b/SOURCES/0002-testsuite-Correct-syntax-for-gdb-backtrace-command.patch new file mode 100644 index 0000000..c429de4 --- /dev/null +++ b/SOURCES/0002-testsuite-Correct-syntax-for-gdb-backtrace-command.patch @@ -0,0 +1,34 @@ +From 91e3bc23a654e3daf1bf6546b06b9de7d00dbd59 Mon Sep 17 00:00:00 2001 +From: Martin Kutlak +Date: Fri, 29 Jun 2018 10:52:48 +0200 +Subject: [PATCH] testsuite: Correct syntax for gdb backtrace command + +The test failed on rawhide (gdb v8.1.50) with error message: +"A syntax error in expression, near `full'." + +According to the GDB documentation the correct syntax for backtrace +command is `backtrace [full] n`. + +- https://sourceware.org/gdb/onlinedocs/gdb/Backtrace.html + +Signed-off-by: Martin Kutlak +--- + tests/core_stacktrace.at | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/core_stacktrace.at b/tests/core_stacktrace.at +index 7f6198e..13678c8 100644 +--- a/tests/core_stacktrace.at ++++ b/tests/core_stacktrace.at +@@ -281,7 +281,7 @@ get_backtrace(const char *core_file, const char *executable) + args[i++] = (char*)"-ex"; + args[i++] = sr_asprintf("core-file %s", core_file); + args[i++] = (char*)"-ex"; +- args[i++] = (char*)"thread apply all -ascending backtrace 1024 full"; ++ args[i++] = (char*)"thread apply all -ascending backtrace full 1024"; + args[i++] = (char*)"-ex"; + args[i++] = (char*)"info sharedlib"; + args[i++] = (char*)"-ex"; +-- +2.17.1 + diff --git a/SPECS/satyr.spec b/SPECS/satyr.spec new file mode 100644 index 0000000..86d67a1 --- /dev/null +++ b/SPECS/satyr.spec @@ -0,0 +1,222 @@ +%{!?python2_sitearch: %global python2_sitearch %(%{__python2} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")} + +%if 0%{?fedora} || 0%{?rhel} > 7 +# Enable python3 build by default +%bcond_without python3 +%else +%bcond_with python3 +%endif + +%if 0%{?rhel} > 7 || 0%{?fedora} > 28 +# Disable python2 build by default +%bcond_with python2 +%else +%bcond_without python2 +%endif + +%if 0%{?suse_version} + %define python2_sitearch %{python_sitearch} + %define python2_devel python-devel + %define libdw_devel libdw-devel + %define libelf_devel libelf-devel +%else + %define python2_devel python2-devel + %define libdw_devel elfutils-devel + %define libelf_devel elfutils-libelf-devel +%endif + +Name: satyr +Version: 0.26 +Release: 2%{?dist} +Summary: Tools to create anonymous, machine-friendly problem reports +License: GPLv2+ +URL: https://github.com/abrt/satyr +Source0: https://github.com/abrt/%{name}/archive/%{version}/%{name}-%{version}.tar.xz +%if %{with python2} +BuildRequires: %{python2_devel} +%endif # with python2 +%if %{with python3} +BuildRequires: python3-devel +%endif # with python3 +BuildRequires: %{libdw_devel} +BuildRequires: %{libelf_devel} +BuildRequires: binutils-devel +BuildRequires: rpm-devel +BuildRequires: libtool +BuildRequires: doxygen +BuildRequires: pkgconfig +BuildRequires: automake +BuildRequires: gcc-c++ +BuildRequires: gdb +%if %{with python2} +BuildRequires: python2-sphinx +%endif # with python2 +%if %{with python3} +BuildRequires: python3-sphinx +%endif # with python3 + +# git is need for '%%autosetup -S git' which automatically applies all the +# patches above. Please, be aware that the patches must be generated +# by 'git format-patch' +BuildRequires: git + +Patch0001: 0001-Anonymize-paths-in-frames.patch +Patch0002: 0002-testsuite-Correct-syntax-for-gdb-backtrace-command.patch + + +%description +Satyr is a library that can be used to create and process microreports. +Microreports consist of structured data suitable to be analyzed in a fully +automated manner, though they do not necessarily contain sufficient information +to fix the underlying problem. The reports are designed not to contain any +potentially sensitive data to eliminate the need for review before submission. +Included is a tool that can create microreports and perform some basic +operations on them. + +%package devel +Summary: Development libraries for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +Development libraries and headers for %{name}. + +%if %{with python2} +%package -n python2-satyr +%{?python_provide:%python_provide python2-satyr} +# Remove before F30 +Provides: %{name}-python = %{version}-%{release} +Provides: %{name}-python%{?_isa} = %{version}-%{release} +Obsoletes: %{name}-python < 0.24 +Summary: Python bindings for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description -n python2-satyr +Python bindings for %{name}. +%endif #with python2 + +%if %{with python3} +%package -n python3-satyr +%{?python_provide:%python_provide python3-satyr} +# Remove before F30 +Provides: %{name}-python3 = %{version}-%{release} +Provides: %{name}-python3%{?_isa} = %{version}-%{release} +Obsoletes: %{name}-python3 < 0.24 +Summary: Python 3 bindings for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description -n python3-satyr +Python 3 bindings for %{name}. +%endif # if with python3 + +%prep +# http://www.rpm.org/wiki/PackagerDocs/Autosetup +# Default '__scm_apply_git' is 'git apply && git commit' but this workflow +# doesn't allow us to create a new file within a patch, so we have to use +# 'git am' (see /usr/lib/rpm/macros for more details) +%define __scm_apply_git(qp:m:) %{__git} am +%autosetup -S git + +%build +%configure \ +%if %{without python2} + --without-python2 \ +%endif # with python2 +%if %{without python3} + --without-python3 \ +%endif # with python3 +%{?_without_python2} \ + --disable-static \ + --enable-doxygen-docs + +make %{?_smp_mflags} + +%install +make install DESTDIR=%{buildroot} + +# Remove all libtool archives (*.la) from modules directory. +find %{buildroot} -name "*.la" | xargs rm -- + +%check +make check|| { + # find and print the logs of failed test + # do not cat tests/testsuite.log because it contains a lot of bloat + find tests/testsuite.dir -name "testsuite.log" -print -exec cat '{}' \; + exit 1 +} + +%if 0%{?fedora} > 27 +# ldconfig is not needed +%else +%post -p /sbin/ldconfig +%postun -p /sbin/ldconfig +%endif + +%files +%doc README NEWS +%license COPYING +%{_bindir}/satyr +%{_mandir}/man1/%{name}.1* +%{_libdir}/lib*.so.* + +%files devel +# The complex pattern below (instead of simlpy *) excludes Makefile{.am,.in}: +%doc apidoc/html/*.{html,png,css,js} +%{_includedir}/* +%{_libdir}/lib*.so +%{_libdir}/pkgconfig/* + +%if %{with python2} +%files -n python2-satyr +%dir %{python2_sitearch}/%{name} +%{python2_sitearch}/%{name}/* +%{_mandir}/man3/satyr-python.3* +%endif # with python2 + +%if 0%{?with_python3} +%files -n python3-satyr +%dir %{python3_sitearch}/%{name} +%{python3_sitearch}/%{name}/* +%endif + +%changelog +* Fri Jun 29 2018 Matej Habrnal 0.26-2 +- Anonymize paths in frames +- Test fix: correct syntax for gdb backtrace command + +* Tue Apr 17 2018 Matej Habrnal 0.26-1 +- spec: fix Allow python2 to be optional at build time +- Allow python2 to be optional at build time +- normalization: actualize list of functions +- Append Python interpreter as related package +- makefile: create .tar.xz with make release + +* Thu Jan 18 2018 Martin Kutlak 0.25-1 +- New upstream version + - Normalization: actualize list of functions + - Fix some compilation warnings + - Allow to build python3 for rhel8 + - Makefile: add make release-* subcommands + - Elfutils: Add missing stubs from earlier commit + +* Wed Nov 1 2017 Julius Milan 0.24-1 +- New upstream version + - Allow to report unpackaged problems + - apidoc: generate html docs using doxygen + - Fix parsing of subset of arm kernel oopses + +* Mon Mar 13 2017 Matej Habrnal 0.23-1 +- New upstream version + - Allow rpm to be optional at build time + - Do not use deprecated fedorahosted.org + +* Thu Dec 1 2016 Jakub Filak 0.22-1 +- New upstream version + - Added support fof JavaScript (V8) stack traces + - Most parts of the in-hook core unwinder callable under unprivileged user + - GDB core unwinder limits number of unwound frames + - Fixed a pair of compile warnings - Chris Redmon + +* Wed May 18 2016 Matej Habrnal 0.21-1 +- New upstream version + - Introduce 'serial' field in uReport + - normalization: actualize list of functions