/* * Creation Date: <2002/10/19 21:05:07 samuel> * Time-stamp: <2002/10/22 22:29:18 samuel> * * * * Miscellaneous * * Copyright (C) 2002, 2003 Samuel Rydh (samuel@ibrium.se) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation * */ #include "config.h" #include "libc/string.h" int errno_int; void qsort( void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void*) ) { unsigned int worked, i, j; /* even more inefficient than the glibc variant :-) */ do { char *p = base; worked = 0; for( i=0; i 0 ) { worked = 1; for( j=0; j= base || n < 0 ) break; sum *= base; sum += n; } if( endptr ) *endptr = (char*)nptr; return sum * sign; } long long int strtoll( const char *nptr, char **endptr, int base ) { long long int sum; int n, sign=1; while( isspace(*nptr) ) nptr++; if( *nptr == '-' || *nptr == '+' ) sign = (*nptr++ == '-') ? -1 : 1; if( base == 16 || base == 0) { if( !base ) base = (nptr[0] == '0')? 8 : 10; if( nptr[0] == '0' && nptr[1] == 'x' ) { nptr += 2; base = 16; } } for( sum=0 ;; nptr++ ) { char ch = *nptr; if( !isalnum(ch) ) break; n = isdigit(ch) ? ch - '0' : toupper(ch) - 'A' + 10; if( n >= base || n < 0 ) break; sum *= base; sum += n; } if( endptr ) *endptr = (char*)nptr; return sum * sign; } // Propolice support long __guard[8] = { #ifdef CONFIG_BIG_ENDIAN (0 << 24) | (0 << 16) | ('\n' << 8) | 255, #else (255 << 24) | ('\n' << 16) | (0 << 8) | 0, #endif 0, 0, 0, 0, 0, 0, 0 }; static void freeze(void) { // Freeze // XXX: Disable interrupts? for(;;) ; } void __stack_smash_handler(const char *func, int damaged) { printk("Propolice detected a stack smashing attack %x at function %s," " freezing\n", damaged, func); freeze(); } void __stack_chk_fail(void) { printk("Propolice detected a stack smashing attack, freezing\n"); freeze(); }