X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc%2B%2B.so_src%2Fnew.cc;h=f1ebc453143f88b2dc990e1ba52b1fce743d364b;hb=5cab4c07bc13888dc7956194ef9595508072a4eb;hp=1d09fbc3dc1f09facd291503d1a6752befc8a831;hpb=b7d9f86f7a1c23be18b50d5c647fd5d3c08369c3;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc++.so_src/new.cc b/Usermode/Libraries/libc++.so_src/new.cc index 1d09fbc3..f1ebc453 100644 --- a/Usermode/Libraries/libc++.so_src/new.cc +++ b/Usermode/Libraries/libc++.so_src/new.cc @@ -7,25 +7,51 @@ */ #include #include +#include +#include + +// === IMPORTS === +extern "C" bool _libc_free(void *mem); // from libc.so, actual free. // === CODE === void *operator new( size_t size ) { + //_SysDebug("libc++ - operator new(%i)", size); return malloc( size ); } void *operator new[]( size_t size ) { + //_SysDebug("libc++ - operator new[](%i)", size); return malloc( size ); } void operator delete(void *ptr) { - free(ptr); + if( !_libc_free(ptr) ) { + _SysDebug("delete of invalid by %p", __builtin_return_address(0)); + throw ::std::bad_alloc(); + } } void operator delete[](void *ptr) { - free(ptr); + if( !_libc_free(ptr) ) { + _SysDebug("delete[] of invalid by %p", __builtin_return_address(0)); + throw ::std::bad_alloc(); + } +} + + +::std::bad_alloc::bad_alloc() noexcept +{ +} +::std::bad_alloc::~bad_alloc() noexcept +{ +} + +const char *::std::bad_alloc::what() const noexcept +{ + return "allocation failure"; }