From 89510c2b5fe25f194a2537aa0623eaeff0adce72 Mon Sep 17 00:00:00 2001 From: Will Kahn-Greene Date: Mon, 3 Feb 2025 12:28:10 -0500 Subject: [PATCH] Dest sha: a1e14a5677329b9a90431a0da1fa7d53b66d491d Source sha: bb0c9caf10fcb7341022f62383ff2eeb0b381766 dee7133a5 Bug 1943919 - Add TppRaiseInvalidParameter to the prefix list (#6875) (Gabriele Svelto) 10a4ed945 build(deps): bump ruff from 0.8.6 to 0.9.1 (#6860) (dependabot[bot]) 8d6449d2b Bug 1932405 - Improve signatures involving checked pointers (#6812) (Gabriele Svelto) c2e91175d Bug 1929829 - Ignore g_malloc when generating signatures (#6798) (Gabriele Svelto) 8bf7b5143 bug-1764633: remove non-printable/non-ascii characters from signature (#6782) (Will Kahn-Greene) --- siggen/cmd_doc.py | 2 +- siggen/generator.py | 2 ++ siggen/rules.py | 14 ++++++++++ siggen/siglists/irrelevant_signature_re.txt | 5 ++++ siggen/siglists/prefix_signature_re.txt | 3 ++- siggen/socorro_sha.txt | 2 +- siggen/tests/test_rules.py | 29 ++++++++++++++++++--- 7 files changed, 51 insertions(+), 6 deletions(-) diff --git a/siggen/cmd_doc.py b/siggen/cmd_doc.py index a12d6f1..e2f5d69 100644 --- a/siggen/cmd_doc.py +++ b/siggen/cmd_doc.py @@ -97,6 +97,6 @@ def main(argv=None): fp.write("\n") for i, rule in enumerate(rules): - li = f"{i+1}. " + li = f"{i + 1}. " fp.write("%s%s\n" % (li, indent(get_doc(rule), " " * len(li)))) fp.write("\n") diff --git a/siggen/generator.py b/siggen/generator.py index 258f3d9..84dd92d 100644 --- a/siggen/generator.py +++ b/siggen/generator.py @@ -18,6 +18,7 @@ SignatureIPCMessageName, SignatureRunWatchDog, SignatureShutdownTimeout, + SigPrintableCharsOnly, SigTruncate, StackOverflowSignature, StackwalkerErrorSignatureRule, @@ -37,6 +38,7 @@ StackOverflowSignature, HungProcess, # NOTE(willkg): These should always come last and in this order + SigPrintableCharsOnly, SigFixWhitespace, SigTruncate, ] diff --git a/siggen/rules.py b/siggen/rules.py index 007e23f..9fca7ae 100644 --- a/siggen/rules.py +++ b/siggen/rules.py @@ -918,6 +918,20 @@ def action(self, crash_data, result): return True +class SigPrintableCharsOnly(Rule): + """Remove non-printable characters from signature.""" + + def action(self, crash_data, result): + original_sig = result.signature + sig = "".join( + [c for c in original_sig.strip() if c.isascii() and c.isprintable()] + ) + if sig != original_sig: + result.set_signature(self.name, sig) + result.info(self.name, "unprintable characters removed") + return True + + class SigFixWhitespace(Rule): """Fix whitespace in signatures. diff --git a/siggen/siglists/irrelevant_signature_re.txt b/siggen/siglists/irrelevant_signature_re.txt index a8f7c4c..86d1bb8 100644 --- a/siggen/siglists/irrelevant_signature_re.txt +++ b/siggen/siglists/irrelevant_signature_re.txt @@ -86,6 +86,7 @@ __GI gkrust_shared::oom_hook::hook g_log _g_log_abort +g_malloc google_breakpad::CrashGenerationClient::RequestDumpForException google_breakpad::ExceptionHandler::SignalHandler google_breakpad::ExceptionHandler::WriteMinidumpWithException @@ -135,6 +136,8 @@ mozcrt19\.dll mozilla::AlignedBuffer::Data mozilla::ArrayIterator mozilla::Atomic +mozilla::CheckCheckedUnsafePtrs::Check +mozilla::CheckingPolicyAccess::NotifyCheckFailure mozilla::detail::Atomic mozilla::detail::BaseAutoLock mozilla::detail::BaseMonitorAutoLock @@ -144,6 +147,7 @@ mozilla::detail::IntrinsicMemoryOps mozilla::detail::MemoryOperations mozilla::detail::MutexImpl mozilla::detail::RunnableMethodImpl::RunnableMethodImpl +mozilla::detail::SupportCheckedUnsafePtrImpl mozilla::detail::ThreadLocalNativeStorage::get mozilla::detail::ThreadLocal::get mozilla::detail::VariantImplementation:: @@ -180,6 +184,7 @@ mozilla::SegmentedVector::SegmentImpl:: mozilla::Span mozilla::StringBuffer::AddRef mozilla::StringBuffer::Release +mozilla::SupportsCheckedUnsafePtr::~SupportsCheckedUnsafePtr mozilla::TaskController::GetRunnableForMTTask mozilla::TaskQueue:: mozilla::ThreadEventQueue diff --git a/siggen/siglists/prefix_signature_re.txt b/siggen/siglists/prefix_signature_re.txt index 41fe252..7ffa8f7 100644 --- a/siggen/siglists/prefix_signature_re.txt +++ b/siggen/siglists/prefix_signature_re.txt @@ -102,8 +102,8 @@ memset MessageLoop::PostTask_Helper MessageLoop::PostTask moz_malloc_size_of -mozilla::CheckCheckedUnsafePtrs::Check mozilla::CheckedInt +mozilla::CrashOnDanglingCheckedUnsafePtr::NotifyCheckFailure mozilla::detail::InvalidArrayIndex_CRASH mozilla::detail::nsTStringRepr:: mozilla::Variant:: @@ -238,6 +238,7 @@ strstr syscall SysFreeString TlsGetValue +TppRaiseInvalidParameter __ulock_wait __unlink unlink diff --git a/siggen/socorro_sha.txt b/siggen/socorro_sha.txt index 44c256e..4eb297f 100644 --- a/siggen/socorro_sha.txt +++ b/siggen/socorro_sha.txt @@ -1 +1 @@ -a1e14a5677329b9a90431a0da1fa7d53b66d491d \ No newline at end of file +bb0c9caf10fcb7341022f62383ff2eeb0b381766 \ No newline at end of file diff --git a/siggen/tests/test_rules.py b/siggen/tests/test_rules.py index 9a48175..8aee5b4 100644 --- a/siggen/tests/test_rules.py +++ b/siggen/tests/test_rules.py @@ -570,8 +570,7 @@ def test_long_exception_description_with_line_number(self): def test_no_description(self): j = rules.JavaSignatureTool() java_stack_trace = ( - " SomeJavaException\n" - "at org.mozilla.lars.myInvention(larsFile.java:1234)" + " SomeJavaException\nat org.mozilla.lars.myInvention(larsFile.java:1234)" ) sig, notes, debug_notes = j.generate(java_stack_trace, delimiter=": ") e = "SomeJavaException: at org.mozilla.lars.myInvention(larsFile.java)" @@ -1718,6 +1717,30 @@ def test_action_non_ascii_abort_message(self): assert result.signature == "Abort | unknown | hello" +class TestSigPrintableCharsOnly: + @pytest.mark.parametrize( + "signature, expected", + [ + ("everything | fine", "everything | fine"), + # Non-printable null character + ("libxul.so\x00 | frame2", "libxul.so | frame2"), + # Non-ascii emoji + ("libxul.so\U0001f600 | frame2", "libxul.so | frame2"), + ], + ) + def test_whitespace_fixing(self, signature, expected): + rule = rules.SigPrintableCharsOnly() + result = generator.Result() + result.signature = signature + action_result = rule.action({}, result) + assert action_result is True + assert result.signature == expected + if signature != expected: + assert result.notes == [ + "SigPrintableCharsOnly: unprintable characters removed" + ] + + class TestSigFixWhitespace: @pytest.mark.parametrize( "signature, expected", @@ -1828,7 +1851,7 @@ def test_action(self): assert sgr.action(crash_data, result) is True # Verify the signature has been re-generated based on thread 0. - expected = "shutdownhang | MsgWaitForMultipleObjects | " "F_1152915508_____" + expected = "shutdownhang | MsgWaitForMultipleObjects | F_1152915508_____" assert result.signature == expected assert result.notes == []