static void koops_append_bthash_text(struct sr_koops_stacktrace *stacktrace, enum sr_bthash_flags flags, struct sr_strbuf *strbuf) { sr_strbuf_append_strf(strbuf, "Version: %s\n", OR_UNKNOWN(stacktrace->version)); sr_strbuf_append_str(strbuf, "Flags: "); for (struct sr_taint_flag *f = sr_flags; f->letter; f++) { bool val = *(bool *)((void *)stacktrace + f->member_offset); if (val == false) continue; } sr_strbuf_append_char(strbuf, '\n'); sr_strbuf_append_str(strbuf, "Modules: "); for (char **mod = stacktrace->modules; mod && *mod; mod++) { sr_strbuf_append_str(strbuf, *mod); if (*(mod+1)) sr_strbuf_append_str(strbuf, ", "); } sr_strbuf_append_char(strbuf, '\n'); sr_strbuf_append_char(strbuf, '\n'); }
static void python_append_bthash_text(struct sr_python_stacktrace *stacktrace, enum sr_bthash_flags flags, struct sr_strbuf *strbuf) { sr_strbuf_append_strf(strbuf, "Exception: %s\n", OR_UNKNOWN(stacktrace->exception_name)); sr_strbuf_append_char(strbuf, '\n'); }
static void core_append_bthash_text(struct sr_core_stacktrace *stacktrace, enum sr_bthash_flags flags, struct sr_strbuf *strbuf) { sr_strbuf_append_strf(strbuf, "Executable: %s\n", OR_UNKNOWN(stacktrace->executable)); sr_strbuf_append_strf(strbuf, "Signal: %"PRIu16"\n", stacktrace->signal); sr_strbuf_append_char(strbuf, '\n'); }
char * sr_python_stacktrace_to_json(struct sr_python_stacktrace *stacktrace) { struct sr_strbuf *strbuf = sr_strbuf_new(); /* Exception class name. */ if (stacktrace->exception_name) { sr_strbuf_append_str(strbuf, ", \"exception_name\": "); sr_json_append_escaped(strbuf, stacktrace->exception_name); sr_strbuf_append_str(strbuf, "\n"); } /* Frames. */ if (stacktrace->frames) { struct sr_python_frame *frame = stacktrace->frames; sr_strbuf_append_str(strbuf, ", \"stacktrace\":\n"); while (frame) { if (frame == stacktrace->frames) sr_strbuf_append_str(strbuf, " [ "); else sr_strbuf_append_str(strbuf, " , "); char *frame_json = sr_python_frame_to_json(frame); char *indented_frame_json = sr_indent_except_first_line(frame_json, 8); sr_strbuf_append_str(strbuf, indented_frame_json); free(indented_frame_json); free(frame_json); frame = frame->next; if (frame) sr_strbuf_append_str(strbuf, "\n"); } sr_strbuf_append_str(strbuf, " ]\n"); } if (strbuf->len > 0) strbuf->buf[0] = '{'; else sr_strbuf_append_char(strbuf, '{'); sr_strbuf_append_char(strbuf, '}'); return sr_strbuf_free_nobuf(strbuf); }
char * sr_ruby_frame_to_json(struct sr_ruby_frame *frame) { struct sr_strbuf *strbuf = sr_strbuf_new(); /* Source file name. */ if (frame->file_name) { sr_strbuf_append_str(strbuf, ", \"file_name\": "); sr_json_append_escaped(strbuf, frame->file_name); sr_strbuf_append_str(strbuf, "\n"); } /* Source file line. */ if (frame->file_line) { sr_strbuf_append_strf(strbuf, ", \"file_line\": %"PRIu32"\n", frame->file_line); } /* Function name / special function. */ if (frame->function_name) { if (frame->special_function) sr_strbuf_append_str(strbuf, ", \"special_function\": "); else sr_strbuf_append_str(strbuf, ", \"function_name\": "); sr_json_append_escaped(strbuf, frame->function_name); sr_strbuf_append_str(strbuf, "\n"); } /* Block level. */ if (frame->block_level > 0) { sr_strbuf_append_strf(strbuf, ", \"block_level\": %"PRIu32"\n", frame->block_level); } /* Rescue level. */ if (frame->rescue_level > 0) { sr_strbuf_append_strf(strbuf, ", \"rescue_level\": %"PRIu32"\n", frame->rescue_level); } strbuf->buf[0] = '{'; sr_strbuf_append_char(strbuf, '}'); return sr_strbuf_free_nobuf(strbuf); }
char * sr_disasm_instructions_to_text(char **instructions) { struct sr_strbuf *strbuf = sr_strbuf_new(); while (*instructions) { sr_strbuf_append_str(strbuf, *instructions); sr_strbuf_append_char(strbuf, '\n'); ++instructions; } return sr_strbuf_free_nobuf(strbuf); }
char * sr_python_frame_to_json(struct sr_python_frame *frame) { struct sr_strbuf *strbuf = sr_strbuf_new(); /* Source file name / special file. */ if (frame->file_name) { if (frame->special_file) sr_strbuf_append_str(strbuf, ", \"special_file\": "); else sr_strbuf_append_str(strbuf, ", \"file_name\": "); sr_json_append_escaped(strbuf, frame->file_name); sr_strbuf_append_str(strbuf, "\n"); } /* Source file line. */ if (frame->file_line) { sr_strbuf_append_strf(strbuf, ", \"file_line\": %"PRIu32"\n", frame->file_line); } /* Function name / special function. */ if (frame->function_name) { if (frame->special_function) sr_strbuf_append_str(strbuf, ", \"special_function\": "); else sr_strbuf_append_str(strbuf, ", \"function_name\": "); sr_json_append_escaped(strbuf, frame->function_name); sr_strbuf_append_str(strbuf, "\n"); } /* Line contents. */ if (frame->line_contents) { sr_strbuf_append_str(strbuf, ", \"line_contents\": "); sr_json_append_escaped(strbuf, frame->line_contents); sr_strbuf_append_str(strbuf, "\n"); } strbuf->buf[0] = '{'; sr_strbuf_append_char(strbuf, '}'); return sr_strbuf_free_nobuf(strbuf); }
char * sr_core_stacktrace_to_json(struct sr_core_stacktrace *stacktrace) { struct sr_strbuf *strbuf = sr_strbuf_new(); sr_strbuf_append_strf(strbuf, "{ \"signal\": %"PRIu16"\n", stacktrace->signal); if (stacktrace->executable) { sr_strbuf_append_str(strbuf, ", \"executable\": "); sr_json_append_escaped(strbuf, stacktrace->executable); sr_strbuf_append_str(strbuf, "\n"); } if (stacktrace->only_crash_thread) sr_strbuf_append_str(strbuf, ", \"only_crash_thread\": true\n"); sr_strbuf_append_str(strbuf, ", \"stacktrace\":\n"); struct sr_core_thread *thread = stacktrace->threads; while (thread) { if (thread == stacktrace->threads) sr_strbuf_append_str(strbuf, " [ "); else sr_strbuf_append_str(strbuf, " , "); bool crash_thread = (thread == stacktrace->crash_thread); /* If we don't know the crash thread, just take the first one. */ crash_thread |= (stacktrace->crash_thread == NULL && thread == stacktrace->threads); char *thread_json = sr_core_thread_to_json(thread, crash_thread); char *indented_thread_json = sr_indent_except_first_line(thread_json, 8); sr_strbuf_append_str(strbuf, indented_thread_json); free(indented_thread_json); free(thread_json); thread = thread->next; if (thread) sr_strbuf_append_str(strbuf, "\n"); } sr_strbuf_append_str(strbuf, " ]\n"); sr_strbuf_append_char(strbuf, '}'); return sr_strbuf_free_nobuf(strbuf); }
char * sr_disasm_binary_to_text(struct sr_disasm_state *state, uint64_t start_offset, uint64_t size, char **error_message) { #if HAVE_LIBOPCODES asection *section = state->info.section; if (start_offset < section->vma || (start_offset + size) > section->vma + section->size) { *error_message = sr_asprintf( "Invalid function range: 0x%"PRIx64" - 0x%"PRIx64, start_offset, start_offset + size); return NULL; } char *code = sr_malloc(size); bool success = bfd_get_section_contents(state->bfd_file, state->info.section, code, start_offset - section->vma, size); if (!success) { *error_message = sr_strdup("Failed to get section contents."); return NULL; } struct sr_strbuf *strbuf = sr_strbuf_new(); for (int i = 0; i < size; ++i) { sr_strbuf_append_strf(strbuf, "0x%02x ", (unsigned)code[i]); if ((i + 1) % 12 == 0) sr_strbuf_append_char(strbuf, '\n'); } free(code); return sr_strbuf_free_nobuf(strbuf); #else // HAVE_LIBOPCODES *error_message = sr_asprintf("satyr compiled without libopcodes"); return NULL; #endif // HAVE_LIBOPCODES }
static char * taint_flags_to_json(struct sr_koops_stacktrace *stacktrace) { struct sr_strbuf *strbuf = sr_strbuf_new(); struct sr_taint_flag *f; for (f = sr_flags; f->letter; f++) { bool val = *(bool *)((void *)stacktrace + f->member_offset); if (val == true) { sr_strbuf_append_strf(strbuf, ", \"%s\"\n", f->name); } } if (strbuf->len == 0) return sr_strdup("[]"); sr_strbuf_append_char(strbuf, ']'); char *result = sr_strbuf_free_nobuf(strbuf); result[0] = '['; result[strlen(result) - 2] = ' '; /* erase the last newline */ return result; }
char * sr_koops_stacktrace_to_json(struct sr_koops_stacktrace *stacktrace) { struct sr_strbuf *strbuf = sr_strbuf_new(); /* Raw oops. */ if (stacktrace->raw_oops) { sr_strbuf_append_str(strbuf, ", \"raw_oops\": "); sr_json_append_escaped(strbuf, stacktrace->raw_oops); sr_strbuf_append_str(strbuf, "\n"); } /* Kernel version. */ if (stacktrace->version) { sr_strbuf_append_str(strbuf, ", \"version\": "); sr_json_append_escaped(strbuf, stacktrace->version); sr_strbuf_append_str(strbuf, "\n"); } /* Kernel taint flags. */ char *taint_flags = taint_flags_to_json(stacktrace); char *indented_taint_flags = sr_indent_except_first_line(taint_flags, strlen(", \"taint_flags\": ")); free(taint_flags); sr_strbuf_append_strf(strbuf, ", \"taint_flags\": %s\n", indented_taint_flags); free(indented_taint_flags); /* Modules. */ if (stacktrace->modules) { sr_strbuf_append_strf(strbuf, ", \"modules\":\n"); sr_strbuf_append_str(strbuf, " [ "); char **module = stacktrace->modules; while (*module) { if (module != stacktrace->modules) sr_strbuf_append_str(strbuf, " , "); sr_json_append_escaped(strbuf, *module); ++module; if (*module) sr_strbuf_append_str(strbuf, "\n"); } sr_strbuf_append_str(strbuf, " ]\n"); } /* Frames. */ if (stacktrace->frames) { struct sr_koops_frame *frame = stacktrace->frames; sr_strbuf_append_str(strbuf, ", \"frames\":\n"); while (frame) { if (frame == stacktrace->frames) sr_strbuf_append_str(strbuf, " [ "); else sr_strbuf_append_str(strbuf, " , "); char *frame_json = sr_koops_frame_to_json(frame); char *indented_frame_json = sr_indent_except_first_line(frame_json, 8); sr_strbuf_append_str(strbuf, indented_frame_json); free(indented_frame_json); free(frame_json); frame = frame->next; if (frame) sr_strbuf_append_str(strbuf, "\n"); } sr_strbuf_append_str(strbuf, " ]\n"); } if (strbuf->len > 0) strbuf->buf[0] = '{'; else sr_strbuf_append_char(strbuf, '{'); sr_strbuf_append_char(strbuf, '}'); return sr_strbuf_free_nobuf(strbuf); }
char * sr_operating_system_to_json(struct sr_operating_system *operating_system) { struct sr_strbuf *strbuf = sr_strbuf_new(); if (operating_system->name) { sr_strbuf_append_str(strbuf, ", \"name\": "); sr_json_append_escaped(strbuf, operating_system->name); sr_strbuf_append_str(strbuf, "\n"); } if (operating_system->version) { sr_strbuf_append_str(strbuf, ", \"version\": "); sr_json_append_escaped(strbuf, operating_system->version); sr_strbuf_append_str(strbuf, "\n"); } if (operating_system->architecture) { sr_strbuf_append_str(strbuf, ", \"architecture\": "); sr_json_append_escaped(strbuf, operating_system->architecture); sr_strbuf_append_str(strbuf, "\n"); } if (operating_system->cpe) { sr_strbuf_append_str(strbuf, ", \"cpe\": "); sr_json_append_escaped(strbuf, operating_system->cpe); sr_strbuf_append_str(strbuf, "\n"); } if (operating_system->desktop) { sr_strbuf_append_str(strbuf, ", \"desktop\": "); sr_json_append_escaped(strbuf, operating_system->desktop); sr_strbuf_append_str(strbuf, "\n"); } if (operating_system->variant) { sr_strbuf_append_str(strbuf, ", \"variant\": "); sr_json_append_escaped(strbuf, operating_system->variant); sr_strbuf_append_str(strbuf, "\n"); } if (operating_system->uptime > 0) { sr_strbuf_append_strf(strbuf, ", \"uptime\": %"PRIu64"\n", operating_system->uptime); } if (strbuf->len > 0) strbuf->buf[0] = '{'; else sr_strbuf_append_char(strbuf, '{'); sr_strbuf_append_char(strbuf, '}'); return sr_strbuf_free_nobuf(strbuf); }