func parseExploitable(raw []byte, ci *crash.Info, die func()) { scanner := bufio.NewScanner(bytes.NewReader(raw)) // Faulting frame: # 4 None at 0x7ffff6fad93b in /usr/lib/x86_64-linux-gnu/libcairo.so.2.11301.0 // Faulting frame: # 6 operator new(unsigned long) at 0x7ffff6d87698 in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20 // [ <---ignore---> ] [ symbol text until "at" ] [address] [ <-- module from here--> ] mustAdvanceTo("Faulting frame:", scanner, die) ff := strings.Fields(scanner.Text()) if len(ff) < 9 { die() } atIdx := 0 for i := 0; i < len(ff); i++ { if ff[i] == "at" { atIdx = i break } } if atIdx == 0 { die() } ci.FaultingFrame = crash.StackEntry{ Symbol: strings.Join(ff[4:atIdx], " "), Address: mustParseHex(ff[atIdx+1], die), // don't know if modules can ever contain spaces? Module: strings.Join(ff[atIdx+3:], " "), } // Description: Abort signal mustAddExtra("Description:", scanner, ci, die) // Short description: AbortSignal (20/22) mustAddExtra("Short description:", scanner, ci, die) // Hash: 71c14ffe39944b60af6fd47d1e505f97.0822ff5e99ce7ad4a1e6e98b273082a7 mustAdvanceTo("Hash:", scanner, die) ci.Hash = strings.Fields(scanner.Text())[1] // Exploitability Classification: UNKNOWN mustAdvanceTo("Exploitability", scanner, die) ci.Classification = strings.Fields(scanner.Text())[2] // Explanation: The target is stopped on a SIGABRT. [...] mustAddExtra("Explanation:", scanner, ci, die) return }