def runTest(self): config = ProgramConfiguration("test", "x86-64", "linux") crashSignature1 = '{ "symptoms" : [ { "type" : "stackSize", "size" : 8 } ] }' crashSignature1Neg = '{ "symptoms" : [ { "type" : "stackSize", "size" : 9 } ] }' crashSignature2 = '{ "symptoms" : [ { "type" : "stackSize", "size" : "< 10" } ] }' crashSignature2Neg = '{ "symptoms" : [ { "type" : "stackSize", "size" : "> 10" } ] }' stackSizeSig1 = CrashSignature(crashSignature1) stackSizeSig1Neg = CrashSignature(crashSignature1Neg) stackSizeSig2 = CrashSignature(crashSignature2) stackSizeSig2Neg = CrashSignature(crashSignature2Neg) crashInfo1 = CrashInfo.fromRawCrashData( [], [], config, auxCrashData=gdbSampleTrace1.splitlines()) self.assertIsInstance(crashInfo1, GDBCrashInfo) self.assert_(stackSizeSig1.matches(crashInfo1)) self.assertFalse(stackSizeSig1Neg.matches(crashInfo1)) self.assert_(stackSizeSig2.matches(crashInfo1)) self.assertFalse(stackSizeSig2Neg.matches(crashInfo1))
def runTest(self): config = ProgramConfiguration("test", "x86-64", "linux") crashSignature1 = '{ "symptoms" : [ { "type" : "stackFrame", "functionName" : "internalAppend" } ] }' crashSignature1Neg = '{ "symptoms" : [ { "type" : "stackFrame", "functionName" : "foobar" } ] }' crashSignature2 = '{ "symptoms" : [ { "type" : "stackFrame", "functionName" : "js::ion::MBasicBlock::setBackedge", "frameNumber" : "<= 4" } ] }' crashSignature2Neg = '{ "symptoms" : [ { "type" : "stackFrame", "functionName" : "js::ion::MBasicBlock::setBackedge", "frameNumber" : "> 4" } ] }' stackFrameSig1 = CrashSignature(crashSignature1) stackFrameSig1Neg = CrashSignature(crashSignature1Neg) stackFrameSig2 = CrashSignature(crashSignature2) stackFrameSig2Neg = CrashSignature(crashSignature2Neg) crashInfo1 = CrashInfo.fromRawCrashData( [], [], config, auxCrashData=gdbSampleTrace1.splitlines()) self.assertIsInstance(crashInfo1, GDBCrashInfo) self.assert_(stackFrameSig1.matches(crashInfo1)) self.assertFalse(stackFrameSig1Neg.matches(crashInfo1)) self.assert_(stackFrameSig2.matches(crashInfo1)) self.assertFalse(stackFrameSig2Neg.matches(crashInfo1))
def runTest(self): config = ProgramConfiguration("test", "x86", "linux") crashInfoNeg = CrashInfo.fromRawCrashData([], [], config, auxCrashData=testTraceHeapWithCrashAddress.splitlines()) crashInfoPos = CrashInfo.fromRawCrashData([], [], config, auxCrashData=testTraceHeapWithoutCrashAddress.splitlines()) testSigEmptyCrashAddress = CrashSignature(testSignatureEmptyCrashAddress) self.assertTrue(testSigEmptyCrashAddress.matches(crashInfoPos)) self.assertFalse(testSigEmptyCrashAddress.matches(crashInfoNeg))
def runTest(self): config = ProgramConfiguration("test", "x86", "linux") crashInfo = CrashInfo.fromRawCrashData([], [], config, auxCrashData=testTrace1.splitlines()) testSig1 = CrashSignature(testSignaturePCREShort1) testSig2 = CrashSignature(testSignaturePCREShort2) self.assertTrue(testSig1.matches(crashInfo)) self.assertFalse(testSig2.matches(crashInfo))
def test_SignaturePCREShortTest(): config = ProgramConfiguration("test", "x86", "linux") crashInfo = CrashInfo.fromRawCrashData([], [], config, auxCrashData=testTrace1.splitlines()) testSig1 = CrashSignature(testSignaturePCREShort1) testSig2 = CrashSignature(testSignaturePCREShort2) assert testSig1.matches(crashInfo) assert not testSig2.matches(crashInfo)
def test_SignatureStackFramesRegressionTest(): config = ProgramConfiguration("test", "x86", "linux") crashInfoNeg = CrashInfo.fromRawCrashData([], [], config, auxCrashData=testTraceHeapWithCrashAddress.splitlines()) crashInfoPos = CrashInfo.fromRawCrashData([], [], config, auxCrashData=testTraceHeapWithoutCrashAddress.splitlines()) testSigEmptyCrashAddress = CrashSignature(testSignatureEmptyCrashAddress) assert testSigEmptyCrashAddress.matches(crashInfoPos) assert not testSigEmptyCrashAddress.matches(crashInfoNeg)
def search(self, crashInfo): ''' Searches within the local signature cache directory for a signature matching the given crash. @type crashInfo: CrashInfo @param crashInfo: CrashInfo instance obtained from L{CrashInfo.fromRawCrashData} @rtype: tuple @return: Tuple containing filename of the signature and metadata matching, or None if no match. ''' cachedSigFiles = os.listdir(self.sigCacheDir) for sigFile in cachedSigFiles: if not sigFile.endswith('.signature'): continue sigFile = os.path.join(self.sigCacheDir, sigFile) if not os.path.isdir(sigFile): with open(sigFile) as f: sigData = f.read() crashSig = CrashSignature(sigData) if crashSig.matches(crashInfo): metadataFile = sigFile.replace('.signature', '.metadata') metadata = None if os.path.exists(metadataFile): with open(metadataFile) as m: metadata = json.loads(m.read()) return (sigFile, metadata) return (None, None)
def search(self, crashInfo): ''' Searches within the local signature cache directory for a signature matching the given crash. @type crashInfo: CrashInfo @param crashInfo: CrashInfo instance obtained from L{CrashInfo.fromRawCrashData} @rtype: tuple @return: Tuple containing filename of the signature and metadata matching, or None if no match. ''' cachedSigFiles = os.listdir(self.sigCacheDir) for sigFile in cachedSigFiles: if not sigFile.endswith('.signature'): continue sigFile = os.path.join(self.sigCacheDir, sigFile) if not os.path.isdir(sigFile): with open(sigFile) as f: sigData = f.read() crashSig = CrashSignature(sigData) if crashSig.matches(crashInfo): metadataFile = sigFile.replace('.signature', '.metadata') metadata = None if os.path.exists(metadataFile): with open(metadataFile) as m: metadata = json.loads(m.read()) return (sigFile, metadata) return (None, None)
def test_SignatureMatchWithUnicode(): config = ProgramConfiguration('test', 'x86-64', 'linux') crashInfo = CrashInfo.fromRawCrashData( ["(«f => (generator.throw(f))», «undefined»)"], [], config) testSignature = CrashSignature( '{"symptoms": [{"src": "stdout", "type": "output", "value": "x"}]}') assert not testSignature.matches(crashInfo)
def runTest(self): config = ProgramConfiguration("test", "x86", "linux") crashInfo = CrashInfo.fromRawCrashData([], [], config, auxCrashData=testTrace1.splitlines()) testSig1 = CrashSignature(testSignatureStackFrames1) testSig2 = CrashSignature(testSignatureStackFrames2) testSig3 = CrashSignature(testSignatureStackFrames3) testSig4 = CrashSignature(testSignatureStackFrames4) testSig5 = CrashSignature(testSignatureStackFrames5) self.assertTrue(testSig1.matches(crashInfo)) self.assertTrue(testSig2.matches(crashInfo)) self.assertTrue(testSig3.matches(crashInfo)) self.assertTrue(testSig4.matches(crashInfo)) self.assertFalse(testSig5.matches(crashInfo))
def runTest(self): config = ProgramConfiguration("test", "x86-64", "linux") crashInfoPos = CrashInfo.fromRawCrashData([], [], config, auxCrashData=testAsanLongTrace.splitlines()) # The test signature uses > 15 which was previously interpreted as 0x15 # while the test crash data has 16 frames. testSig = CrashSignature(testSignatureStackSize) self.assertTrue(testSig.matches(crashInfoPos))
def runTest(self): config = ProgramConfiguration('test', 'x86-64', 'linux') crashInfo = CrashInfo.fromRawCrashData( ["(«f => (generator.throw(f))», «undefined»)"], [], config) testSignature = CrashSignature( '{"symptoms": [{"src": "stdout", "type": "output", "value": "x"}]}' ) self.assertFalse(testSignature.matches(crashInfo))
def test_SignatureStackSizeTest(): config = ProgramConfiguration("test", "x86-64", "linux") crashInfoPos = CrashInfo.fromRawCrashData([], [], config, auxCrashData=testAsanLongTrace.splitlines()) # The test signature uses > 15 which was previously interpreted as 0x15 # while the test crash data has 16 frames. testSig = CrashSignature(testSignatureStackSize) assert testSig.matches(crashInfoPos)
def runTest(self): config = ProgramConfiguration("test", "x86-64", "linux") crashSignature1 = '{ "symptoms" : [ { "type" : "crashAddress", "address" : "< 0x1000" } ] }' crashSignature1Neg = '{ "symptoms" : [ { "type" : "crashAddress", "address" : "0x1000" } ] }' addressSig1 = CrashSignature(crashSignature1) addressSig1Neg = CrashSignature(crashSignature1Neg) crashInfo1 = CrashInfo.fromRawCrashData([], [], config, auxCrashData=gdbSampleTrace1.splitlines()) crashInfo3 = CrashInfo.fromRawCrashData([], [], config, auxCrashData=gdbSampleTrace3.splitlines()) self.assertIsInstance(crashInfo1, GDBCrashInfo) self.assert_(addressSig1.matches(crashInfo1)) self.assertFalse(addressSig1Neg.matches(crashInfo1)) # For crashInfo3, we don't have a crash address. Ensure we don't match self.assertFalse(addressSig1.matches(crashInfo3)) self.assertFalse(addressSig1Neg.matches(crashInfo3))
def runTest(self): config = ProgramConfiguration("test", "x86-64", "linux") crashSignature1 = '{ "symptoms" : [ { "type" : "output", "value" : "test" } ] }' crashSignature1Neg = '{ "symptoms" : [ { "type" : "output", "src" : "stderr", "value" : "test" } ] }' crashSignature2 = '{ "symptoms" : [ { "type" : "output", "src" : "stderr", "value" : { "value" : "^fest$", "matchType" : "pcre" } } ] }' outputSignature1 = CrashSignature(crashSignature1) outputSignature1Neg = CrashSignature(crashSignature1Neg) outputSignature2 = CrashSignature(crashSignature2) gdbOutput = [] stdout = [] stderr = [] stdout.append("Foo") stdout.append("Bartester") stdout.append("Baz") stderr.append("hackfest") crashInfo = CrashInfo.fromRawCrashData(stdout, stderr, config, auxCrashData=gdbOutput) self.assertIsInstance(crashInfo, NoCrashInfo) # Ensure we match on stdout/err if nothing is specified self.assert_(outputSignature1.matches(crashInfo)) # Don't match stdout if stderr is specified self.assertFalse(outputSignature1Neg.matches(crashInfo)) # Check that we're really using PCRE self.assertFalse(outputSignature2.matches(crashInfo)) # Add something the PCRE should match, then retry stderr.append("fest") crashInfo = CrashInfo.fromRawCrashData(stdout, stderr, config, auxCrashData=gdbOutput) self.assert_(outputSignature2.matches(crashInfo))
def test_SignatureTestCaseMatchTest(): config = ProgramConfiguration("test", "x86", "linux") crashInfo = CrashInfo.fromRawCrashData( [], [], config, auxCrashData=testTrace1.splitlines()) testSig3 = CrashSignature(testSignature3) testSig4 = CrashSignature(testSignature4) testSig5 = CrashSignature(testSignature5) testSig6 = CrashSignature(testSignature6) assert not testSig3.matchRequiresTest() assert testSig4.matchRequiresTest() assert testSig5.matchRequiresTest() # Must not match without testcase provided assert not testSig4.matches(crashInfo) assert not testSig5.matches(crashInfo) assert not testSig6.matches(crashInfo) # Attach testcase crashInfo.testcase = testCase1 # Must match with testcase provided assert testSig4.matches(crashInfo) assert testSig5.matches(crashInfo) # This one does not match at all assert not testSig6.matches(crashInfo)
def runTest(self): config = ProgramConfiguration("test", "x86", "linux") crashInfo = CrashInfo.fromRawCrashData([], [], config, auxCrashData=testTrace1.splitlines()) testSig3 = CrashSignature(testSignature3) testSig4 = CrashSignature(testSignature4) testSig5 = CrashSignature(testSignature5) testSig6 = CrashSignature(testSignature6) self.assertFalse(testSig3.matchRequiresTest()) self.assertTrue(testSig4.matchRequiresTest()) self.assertTrue(testSig5.matchRequiresTest()) # Must not match without testcase provided self.assertFalse(testSig4.matches(crashInfo)) self.assertFalse(testSig5.matches(crashInfo)) self.assertFalse(testSig6.matches(crashInfo)) # Attach testcase crashInfo.testcase = testCase1 # Must match with testcase provided self.assertTrue(testSig4.matches(crashInfo)) self.assertTrue(testSig5.matches(crashInfo)) # This one does not match at all self.assertFalse(testSig6.matches(crashInfo))
def runTest(self): config = ProgramConfiguration("test", "x86-64", "linux") crashSignature1 = '{ "symptoms" : [ { "type" : "output", "value" : "test" } ] }' crashSignature1Neg = '{ "symptoms" : [ { "type" : "output", "src" : "stderr", "value" : "test" } ] }' crashSignature2 = '{ "symptoms" : [ { "type" : "output", "src" : "stderr", "value" : { "value" : "^fest$", "matchType" : "pcre" } } ] }' outputSignature1 = CrashSignature(crashSignature1) outputSignature1Neg = CrashSignature(crashSignature1Neg) outputSignature2 = CrashSignature(crashSignature2) gdbOutput = [] stdout = [] stderr = [] stdout.append("Foo") stdout.append("Bartester") stdout.append("Baz") stderr.append("hackfest") crashInfo = CrashInfo.fromRawCrashData(stdout, stderr, config, auxCrashData=gdbOutput) self.assertIsInstance(crashInfo, NoCrashInfo) # Ensure we match on stdout/err if nothing is specified self.assert_(outputSignature1.matches(crashInfo)) # Don't match stdout if stderr is specified self.assertFalse(outputSignature1Neg.matches(crashInfo)) # Check that we're really using PCRE self.assertFalse(outputSignature2.matches(crashInfo)) # Add something the PCRE should match, then retry stderr.append("fest") crashInfo = CrashInfo.fromRawCrashData(stdout, stderr, config, auxCrashData=gdbOutput) self.assert_(outputSignature2.matches(crashInfo))
def runTest(self): config = ProgramConfiguration("test", "x86-64", "linux") crashSignature1 = '{ "symptoms" : [ { "type" : "stackFrame", "functionName" : "internalAppend" } ] }' crashSignature1Neg = '{ "symptoms" : [ { "type" : "stackFrame", "functionName" : "foobar" } ] }' crashSignature2 = '{ "symptoms" : [ { "type" : "stackFrame", "functionName" : "js::ion::MBasicBlock::setBackedge", "frameNumber" : "<= 4" } ] }' crashSignature2Neg = '{ "symptoms" : [ { "type" : "stackFrame", "functionName" : "js::ion::MBasicBlock::setBackedge", "frameNumber" : "> 4" } ] }' stackFrameSig1 = CrashSignature(crashSignature1) stackFrameSig1Neg = CrashSignature(crashSignature1Neg) stackFrameSig2 = CrashSignature(crashSignature2) stackFrameSig2Neg = CrashSignature(crashSignature2Neg) crashInfo1 = CrashInfo.fromRawCrashData([], [], config, auxCrashData=gdbSampleTrace1.splitlines()) self.assertIsInstance(crashInfo1, GDBCrashInfo) self.assert_(stackFrameSig1.matches(crashInfo1)) self.assertFalse(stackFrameSig1Neg.matches(crashInfo1)) self.assert_(stackFrameSig2.matches(crashInfo1)) self.assertFalse(stackFrameSig2Neg.matches(crashInfo1))
def runTest(self): config = ProgramConfiguration("test", "x86-64", "linux") crashSignature1 = '{ "symptoms" : [ { "type" : "stackSize", "size" : 8 } ] }' crashSignature1Neg = '{ "symptoms" : [ { "type" : "stackSize", "size" : 9 } ] }' crashSignature2 = '{ "symptoms" : [ { "type" : "stackSize", "size" : "< 10" } ] }' crashSignature2Neg = '{ "symptoms" : [ { "type" : "stackSize", "size" : "> 10" } ] }' stackSizeSig1 = CrashSignature(crashSignature1) stackSizeSig1Neg = CrashSignature(crashSignature1Neg) stackSizeSig2 = CrashSignature(crashSignature2) stackSizeSig2Neg = CrashSignature(crashSignature2Neg) crashInfo1 = CrashInfo.fromRawCrashData([], [], config, auxCrashData=gdbSampleTrace1.splitlines()) self.assertIsInstance(crashInfo1, GDBCrashInfo) self.assert_(stackSizeSig1.matches(crashInfo1)) self.assertFalse(stackSizeSig1Neg.matches(crashInfo1)) self.assert_(stackSizeSig2.matches(crashInfo1)) self.assertFalse(stackSizeSig2Neg.matches(crashInfo1))
def runTest(self): config = ProgramConfiguration("test", "x86-64", "linux") crashSignature1 = '{ "symptoms" : [ { "type" : "instruction", "registerNames" : ["r14"] } ] }' crashSignature1Neg = '{ "symptoms" : [ { "type" : "instruction", "registerNames" : ["r14", "rax"] } ] }' crashSignature2 = '{ "symptoms" : [ { "type" : "instruction", "instructionName" : "mov" } ] }' crashSignature2Neg = '{ "symptoms" : [ { "type" : "instruction", "instructionName" : "cmp" } ] }' crashSignature3 = '{ "symptoms" : [ { "type" : "instruction", "instructionName" : "mov", "registerNames" : ["r14", "rbx"] } ] }' crashSignature3Neg = '{ "symptoms" : [ { "type" : "instruction", "instructionName" : "mov", "registerNames" : ["r14", "rax"] } ] }' instructionSig1 = CrashSignature(crashSignature1) instructionSig1Neg = CrashSignature(crashSignature1Neg) instructionSig2 = CrashSignature(crashSignature2) instructionSig2Neg = CrashSignature(crashSignature2Neg) instructionSig3 = CrashSignature(crashSignature3) instructionSig3Neg = CrashSignature(crashSignature3Neg) crashInfo2 = CrashInfo.fromRawCrashData( [], [], config, auxCrashData=gdbSampleTrace2.splitlines()) crashInfo3 = CrashInfo.fromRawCrashData( [], [], config, auxCrashData=gdbSampleTrace3.splitlines()) self.assertIsInstance(crashInfo2, GDBCrashInfo) self.assertIsInstance(crashInfo3, GDBCrashInfo) self.assert_(instructionSig1.matches(crashInfo2)) self.assertFalse(instructionSig1Neg.matches(crashInfo2)) self.assert_(instructionSig2.matches(crashInfo2)) self.assertFalse(instructionSig2Neg.matches(crashInfo2)) self.assert_(instructionSig3.matches(crashInfo2)) self.assertFalse(instructionSig3Neg.matches(crashInfo2)) # Crash info3 doesn't have register information, ensure we don't match any self.assertFalse(instructionSig1.matches(crashInfo3)) self.assertFalse(instructionSig2.matches(crashInfo3)) self.assertFalse(instructionSig3.matches(crashInfo3))
def runTest(self): config = ProgramConfiguration("test", "x86-64", "linux") crashSignature1 = '{ "symptoms" : [ { "type" : "instruction", "registerNames" : ["r14"] } ] }' crashSignature1Neg = '{ "symptoms" : [ { "type" : "instruction", "registerNames" : ["r14", "rax"] } ] }' crashSignature2 = '{ "symptoms" : [ { "type" : "instruction", "instructionName" : "mov" } ] }' crashSignature2Neg = '{ "symptoms" : [ { "type" : "instruction", "instructionName" : "cmp" } ] }' crashSignature3 = '{ "symptoms" : [ { "type" : "instruction", "instructionName" : "mov", "registerNames" : ["r14", "rbx"] } ] }' crashSignature3Neg = '{ "symptoms" : [ { "type" : "instruction", "instructionName" : "mov", "registerNames" : ["r14", "rax"] } ] }' instructionSig1 = CrashSignature(crashSignature1) instructionSig1Neg = CrashSignature(crashSignature1Neg) instructionSig2 = CrashSignature(crashSignature2) instructionSig2Neg = CrashSignature(crashSignature2Neg) instructionSig3 = CrashSignature(crashSignature3) instructionSig3Neg = CrashSignature(crashSignature3Neg) crashInfo2 = CrashInfo.fromRawCrashData([], [], config, auxCrashData=gdbSampleTrace2.splitlines()) crashInfo3 = CrashInfo.fromRawCrashData([], [], config, auxCrashData=gdbSampleTrace3.splitlines()) self.assertIsInstance(crashInfo2, GDBCrashInfo) self.assertIsInstance(crashInfo3, GDBCrashInfo) self.assert_(instructionSig1.matches(crashInfo2)) self.assertFalse(instructionSig1Neg.matches(crashInfo2)) self.assert_(instructionSig2.matches(crashInfo2)) self.assertFalse(instructionSig2Neg.matches(crashInfo2)) self.assert_(instructionSig3.matches(crashInfo2)) self.assertFalse(instructionSig3Neg.matches(crashInfo2)) # Crash info3 doesn't have register information, ensure we don't match any self.assertFalse(instructionSig1.matches(crashInfo3)) self.assertFalse(instructionSig2.matches(crashInfo3)) self.assertFalse(instructionSig3.matches(crashInfo3))
def runTest(self): config = ProgramConfiguration('test', 'x86-64', 'linux') crashInfo = CrashInfo.fromRawCrashData(["(«f => (generator.throw(f))», «undefined»)"], [], config) testSignature = CrashSignature('{"symptoms": [{"src": "stdout", "type": "output", "value": "x"}]}') self.assertFalse(testSignature.matches(crashInfo))