void cappend( char c ) { /* *+ * Name: * cappend * * Purpose: * Append a character to the preval string. * * Description: * This routine appends a single character to the preval string. * If the character is '<', '>' or '&', then it is replaced in the * preval string by the appropriate HTML entity reference. * * Authors: * MBT: Mark Taylor (STARLINK) * * History: * 10-DEC-1999 (MBT): * Initial revision. *- */ /* Switch on the value of the character. */ switch( c ) { /* If it needs to be replaced by an entity reference, do so via sappend. */ case '<': sappend( "<" ); break; case '>': sappend( ">" ); break; case '&': sappend( "&" ); break; /* Otherwise it's just a single character: extend allocation if necessary and add the new character. */ default: if ( preleng + 1 > prealloc ) { if ( prealloc == 0 ) preval = (char *) memok( malloc( BUFINC + 1 ) ); else preval = (char *) memok( realloc( preval, prealloc + BUFINC + 1 ) ); prealloc++; } preval[ preleng ] = c; preval[ ++preleng ] = '\0'; } }
static void traphandler(int sig, siginfo_t *si, void *UC) { ucontext_t *uc = UC; static void *frames[MAXFRAMES]; char buf[256]; int nframes = backtrace(frames, MAXFRAMES); int i; const char *reason = NULL; TRAPMSG("Signal: %d in %s ", sig, line1); switch(sig) { case SIGSEGV: switch(si->si_code) { case SEGV_MAPERR: reason = "Address not mapped"; break; case SEGV_ACCERR: reason = "Access error"; break; } break; case SIGFPE: switch(si->si_code) { case FPE_INTDIV: reason = "Integer division by zero"; break; } break; } addr2text(buf, sizeof(buf), si->si_addr); TRAPMSG("Fault address %s (%s)", buf, reason ?: "N/A"); TRAPMSG("Loaded libraries: %s ", libs); snprintf(tmpbuf, sizeof(tmpbuf), "Register dump [%d]: ", NGREG); for(i = 0; i < NGREG; i++) { #if __WORDSIZE == 64 sappend(tmpbuf, sizeof(tmpbuf), "%016llx ", uc->uc_mcontext.gregs[i]); #else sappend(tmpbuf, sizeof(tmpbuf), "%08x ", uc->uc_mcontext.gregs[i]); #endif } TRAPMSG("%s", tmpbuf); TRAPMSG("STACKTRACE"); for(i = 0; i < nframes; i++) { addr2text(buf, sizeof(buf), frames[i]); TRAPMSG("%s", buf); } }
static int callback(struct dl_phdr_info *info, size_t size, void *data) { if(info->dlpi_name[0]) sappend(libs, sizeof(libs), "%s ", info->dlpi_name); return 0; }
static void opt_root(struct block **b) { struct slist *tmp, *s; s = (*b)->stmts; (*b)->stmts = 0; while (BPF_CLASS((*b)->s.code) == BPF_JMP && JT(*b) == JF(*b)) *b = JT(*b); tmp = (*b)->stmts; if (tmp != 0) sappend(s, tmp); (*b)->stmts = s; /* * If the root node is a return, then there is no * point executing any statements (since the bpf machine * has no side effects). */ if (BPF_CLASS((*b)->s.code) == BPF_RET) (*b)->stmts = 0; }
static void traphandler(int sig, siginfo_t *si, void *UC) { ucontext_t *uc = UC; #if ENABLE_EXECINFO char buf[200]; static void *frames[MAXFRAMES]; int nframes = backtrace(frames, MAXFRAMES); Dl_info dli; #endif int i; const char *reason = NULL; tvhlog_spawn(LOG_ALERT, "CRASH", "Signal: %d in %s ", sig, line1); switch(sig) { case SIGSEGV: switch(si->si_code) { case SEGV_MAPERR: reason = "Address not mapped"; break; case SEGV_ACCERR: reason = "Access error"; break; } break; case SIGFPE: switch(si->si_code) { case FPE_INTDIV: reason = "Integer division by zero"; break; } break; } tvhlog_spawn(LOG_ALERT, "CRASH", "Fault address %p (%s)", si->si_addr, reason ?: "N/A"); tvhlog_spawn(LOG_ALERT, "CRASH", "Loaded libraries: %s ", libs); snprintf(tmpbuf, sizeof(tmpbuf), "Register dump [%d]: ", NGREG); for(i = 0; i < NGREG; i++) { #if __WORDSIZE == 64 sappend(tmpbuf, sizeof(tmpbuf), "%016llx ", uc->uc_mcontext.gregs[i]); #else sappend(tmpbuf, sizeof(tmpbuf), "%08x ", uc->uc_mcontext.gregs[i]); #endif } tvhlog_spawn(LOG_ALERT, "CRASH", "%s", tmpbuf); #if ENABLE_EXECINFO tvhlog_spawn(LOG_ALERT, "CRASH", "STACKTRACE"); for(i = 0; i < nframes; i++) { if(dladdr(frames[i], &dli)) { if(dli.dli_sname != NULL && dli.dli_saddr != NULL) { tvhlog_spawn(LOG_ALERT, "CRASH", "%s+0x%tx (%s)", dli.dli_sname, frames[i] - dli.dli_saddr, dli.dli_fname); continue; } if(self[0] && !add2lineresolve(self, frames[i], buf, sizeof(buf))) { tvhlog_spawn(LOG_ALERT, "CRASH", "%s %p", buf, frames[i]); continue; } if(dli.dli_fname != NULL && dli.dli_fbase != NULL) { tvhlog_spawn(LOG_ALERT, "CRASH", "%s %p", dli.dli_fname, frames[i]); continue; } tvhlog_spawn(LOG_ALERT, "CRASH", "%p", frames[i]); } } #endif }
static void traphandler(int sig, siginfo_t *si, void *UC) { ucontext_t *uc = UC; if(extra_traphandler != NULL && !extra_traphandler(sig, si, UC)) return; static void *frames[MAXFRAMES]; char buf[256]; int nframes = backtrace(frames, MAXFRAMES); const char *reason = NULL; TRAPMSG("Signal: %d in %s ", sig, line1); switch(sig) { case SIGSEGV: switch(si->si_code) { case SEGV_MAPERR: reason = "Address not mapped"; break; case SEGV_ACCERR: reason = "Access error"; break; } break; case SIGFPE: switch(si->si_code) { case FPE_INTDIV: reason = "Integer division by zero"; break; } break; } addr2text(buf, sizeof(buf), si->si_addr); TRAPMSG("Fault address %s (%s)", buf, reason ?: "N/A"); TRAPMSG("Loaded libraries: %s ", libs); #if defined(__arm__) TRAPMSG(" trap_no = %08lx", uc->uc_mcontext.trap_no); TRAPMSG("error_code = %08lx", uc->uc_mcontext.error_code); TRAPMSG(" oldmask = %08lx", uc->uc_mcontext.oldmask); TRAPMSG(" R0 = %08lx", uc->uc_mcontext.arm_r0); TRAPMSG(" R1 = %08lx", uc->uc_mcontext.arm_r1); TRAPMSG(" R2 = %08lx", uc->uc_mcontext.arm_r2); TRAPMSG(" R3 = %08lx", uc->uc_mcontext.arm_r3); TRAPMSG(" R4 = %08lx", uc->uc_mcontext.arm_r4); TRAPMSG(" R5 = %08lx", uc->uc_mcontext.arm_r5); TRAPMSG(" R6 = %08lx", uc->uc_mcontext.arm_r6); TRAPMSG(" R7 = %08lx", uc->uc_mcontext.arm_r7); TRAPMSG(" R8 = %08lx", uc->uc_mcontext.arm_r8); TRAPMSG(" R9 = %08lx", uc->uc_mcontext.arm_r9); TRAPMSG(" R10 = %08lx", uc->uc_mcontext.arm_r10); TRAPMSG(" FP = %08lx", uc->uc_mcontext.arm_fp); TRAPMSG(" IP = %08lx", uc->uc_mcontext.arm_ip); TRAPMSG(" SP = %08lx", uc->uc_mcontext.arm_sp); TRAPMSG(" LR = %08lx", uc->uc_mcontext.arm_lr); TRAPMSG(" PC = %08lx", uc->uc_mcontext.arm_pc); TRAPMSG(" CPSR = %08lx", uc->uc_mcontext.arm_cpsr); TRAPMSG("fault_addr = %08lx", uc->uc_mcontext.fault_address); #else char tmpbuf[1024]; snprintf(tmpbuf, sizeof(tmpbuf), "Register dump [%d]: ", NGREG); int i; for(i = 0; i < NGREG; i++) { #if __WORDSIZE == 64 sappend(tmpbuf, sizeof(tmpbuf), "%016llx ", uc->uc_mcontext.gregs[i]); #else sappend(tmpbuf, sizeof(tmpbuf), "%08x ", uc->uc_mcontext.gregs[i]); #endif } TRAPMSG("%s", tmpbuf); #endif dumpstack(frames, nframes); _exit(8); }