X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc%2B%2B.so_src%2Fnew.cc;h=f1ebc453143f88b2dc990e1ba52b1fce743d364b;hb=0f68a84d600ae8c88e444552c07f04b0dbd67003;hp=9dae8536953132547d02fc801f36db17b02f7b80;hpb=e67fbecfc88b7a54d0f1fc7d0c06c9e2eeee8f96;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc++.so_src/new.cc b/Usermode/Libraries/libc++.so_src/new.cc index 9dae8536..f1ebc453 100644 --- a/Usermode/Libraries/libc++.so_src/new.cc +++ b/Usermode/Libraries/libc++.so_src/new.cc @@ -8,6 +8,10 @@ #include #include #include +#include + +// === IMPORTS === +extern "C" bool _libc_free(void *mem); // from libc.so, actual free. // === CODE === void *operator new( size_t size ) @@ -15,32 +19,39 @@ void *operator new( size_t size ) //_SysDebug("libc++ - operator new(%i)", size); return malloc( size ); } -void *operator new( size_t size, void* ptr ) -{ - //_SysDebug("libc++ - operator new(%i, %p)", size, ptr); - size = size; - return ptr; -} void *operator new[]( size_t size ) { //_SysDebug("libc++ - operator new[](%i)", size); return malloc( size ); } -void *operator new[]( size_t size, void* ptr ) -{ - //_SysDebug("libc++ - operator new[](%i, %p)", size, ptr); - size = size; - return ptr; -} 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"; }