From 4be310f8090aeadf7bae525916e72e5dc78ae3e4 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Sat, 23 Jan 2021 00:44:52 -0800 Subject: [PATCH] Added tracker --- makefile | 4 ++++ microscript/ILibDuktape_Polyfills.c | 14 +++++++++++++ microstack/ILibParsers.c | 32 +++++++++++++++++++++++++++++ microstack/ILibParsers.h | 11 ++++++++-- 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/makefile b/makefile index 5803346..048f4e1 100644 --- a/makefile +++ b/makefile @@ -562,6 +562,10 @@ ifeq ($(FIPS),1) CFLAGS += -DFIPSMODE endif +ifeq ($(MEMTRACK),1) +CFLAGS += -DILIBMEMTRACK +endif + GCCTEST := $(shell $(CC) meshcore/dummy.c -o /dev/null -no-pie > /dev/null 2>&1 ; echo $$? ) ifeq ($(GCCTEST),0) LDFLAGS += -no-pie diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 69e72e0..b4b7fc1 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -3113,6 +3113,17 @@ duk_ret_t ILibDuktape_Polyfills_MSH(duk_context *ctx) duk_pop(ctx); // [msh] return(1); } +#if defined(ILIBMEMTRACK) && !defined(ILIBCHAIN_GLOBAL_LOCK) +extern size_t ILib_NativeAllocSize; +extern ILibSpinLock ILib_MemoryTrackLock; +duk_ret_t ILibDuktape_Polyfills_NativeAllocSize(duk_context *ctx) +{ + ILibSpinLock_Lock(&ILib_MemoryTrackLock); + duk_push_uint(ctx, ILib_NativeAllocSize); + ILibSpinLock_UnLock(&ILib_MemoryTrackLock); + return(1); +} +#endif void ILibDuktape_Polyfills_Init(duk_context *ctx) { @@ -3160,6 +3171,9 @@ void ILibDuktape_Polyfills_Init(duk_context *ctx) ILibDuktape_CreateInstanceMethod(ctx, "_ipv4From", ILibDuktape_Polyfills_ipv4From, 1); ILibDuktape_CreateInstanceMethod(ctx, "_isBuffer", ILibDuktape_Polyfills_isBuffer, 1); ILibDuktape_CreateInstanceMethod(ctx, "_MSH", ILibDuktape_Polyfills_MSH, 0); +#if defined(ILIBMEMTRACK) && !defined(ILIBCHAIN_GLOBAL_LOCK) + ILibDuktape_CreateInstanceMethod(ctx, "_NativeAllocSize", ILibDuktape_Polyfills_NativeAllocSize, 0); +#endif #ifndef MICROSTACK_NOTLS ILibDuktape_CreateInstanceMethod(ctx, "crc32c", ILibDuktape_Polyfills_crc32c, DUK_VARARGS); diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index a70f740..27b8459 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -997,6 +997,18 @@ typedef struct ILibBaseChain int lastDescriptorCount; }ILibBaseChain; +#if defined(ILIBMEMTRACK) && !defined(ILIBCHAIN_GLOBAL_LOCK) +size_t ILib_NativeAllocSize = 0; +ILibSpinLock ILib_MemoryTrackLock = 0; +void* ILibMemory_InitEx(void *ptr, size_t primarySize, size_t extraSize, ILibMemory_Types memType) +{ + ILibSpinLock_Lock(&ILib_MemoryTrackLock); + ILib_NativeAllocSize += (primarySize + extraSize); + ILibSpinLock_UnLock(&ILib_MemoryTrackLock); + + return(ILibMemory_Init(ptr, primarySize, extraSize, memType)); +} +#endif void* ILibMemory_AllocateA_Init(void *buffer) { @@ -1031,6 +1043,19 @@ void* ILibMemory_SmartReAllocate(void *ptr, size_t len) memmove_s(ILibMemory_Extra(ret) - sizeof(ILibMemory_Header) + offset, originalExtraSize + sizeof(ILibMemory_Header), ILibMemory_Extra(ret) - sizeof(ILibMemory_Header), originalExtraSize + sizeof(ILibMemory_Header)); } +#if defined(ILIBMEMTRACK) && !defined(ILIBCHAIN_GLOBAL_LOCK) + ILibSpinLock_Lock(&ILib_MemoryTrackLock); + if (newRawSize > originalRawSize) + { + ILib_NativeAllocSize += (newRawSize - originalRawSize); + } + else + { + ILib_NativeAllocSize -= (originalRawSize - newRawSize); + } + ILibSpinLock_UnLock(&ILib_MemoryTrackLock); +#endif + ILibMemory_Size(ret) = len; return(ret); } @@ -1076,6 +1101,7 @@ void* ILibMemory_Init(void *ptr, size_t primarySize, size_t extraSize, ILibMemor return(primary); } + void ILibMemory_SecureZero(void *ptr, size_t len) { #if !defined(MICROSTACK_NOTLS) @@ -1102,6 +1128,12 @@ void ILibMemory_Free(void *ptr) { if (ILibMemory_CanaryOK(ptr) && ILibMemory_MemType(ptr) == ILibMemory_Types_HEAP) { +#if defined(ILIBMEMTRACK) && !defined(ILIBCHAIN_GLOBAL_LOCK) + ILibSpinLock_Lock(&ILib_MemoryTrackLock); + ILib_NativeAllocSize -= (ILibMemory_Size(ptr) + ILibMemory_ExtraSize(ptr)); + ILibSpinLock_UnLock(&ILib_MemoryTrackLock); +#endif + if (ILibMemory_ExtraSize(ptr) > 0) { ILibMemory_SecureZero(ILibMemory_RawPtr(ILibMemory_Extra(ptr)), sizeof(ILibMemory_Header)); diff --git a/microstack/ILibParsers.h b/microstack/ILibParsers.h index 40dc3ce..0e7ef4d 100644 --- a/microstack/ILibParsers.h +++ b/microstack/ILibParsers.h @@ -450,6 +450,13 @@ int ILibIsRunningOnChainThread(void* chain); ILibMemory_Types memoryType; }ILibMemory_Header; +#if defined(ILIBMEMTRACK) && !defined(ILIBCHAIN_GLOBAL_LOCK) + void* ILibMemory_InitEx(void *ptr, size_t primarySize, size_t extraSize, ILibMemory_Types memType); +#else + #define ILibMemory_InitEx(ptr, primarySize, extraSize, memType) ILibMemory_Init(ptr, primarySize, extraSize, memType) +#endif + + #define ILibChain_Link_SetMetadata(chainLink, value) if((chainLink)!=NULL) { ILibMemory_Free(((ILibChain_Link*)chainLink)->MetaData); ((ILibChain_Link*)chainLink)->MetaData = value; } #define ILibChain_Link_GetMetadata(chainLink) ((chainLink)==NULL?"":(((ILibChain_Link*)chainLink)->MetaData)) #define ILibMemory_Canary (((int*)((char*)(const char*)"broe"))[0]) @@ -471,8 +478,8 @@ int ILibIsRunningOnChainThread(void* chain); #define ILibMemory_Size_Validate(primaryLen, extraLen) (((size_t)(primaryLen)<(UINT32_MAX - (size_t)(extraLen)))&&((size_t)(extraLen)<(UINT32_MAX-(size_t)(primaryLen)))&&((size_t)((primaryLen) + (extraLen))<(UINT32_MAX - sizeof(ILibMemory_Header)))&&((extraLen)==0 || ((size_t)((primaryLen)+(extraLen)+sizeof(ILibMemory_Header))<(UINT32_MAX-sizeof(ILibMemory_Header))))) #define ILibMemory_Init_Size(primaryLen, extraLen) (primaryLen + extraLen + sizeof(ILibMemory_Header) + (extraLen>0?sizeof(ILibMemory_Header):0)) void* ILibMemory_Init(void *ptr, size_t primarySize, size_t extraSize, ILibMemory_Types memType); - #define ILibMemory_SmartAllocate(len) ILibMemory_Init(ILibMemory_Size_Validate(len,0)?malloc(ILibMemory_Init_Size(len, 0)):NULL, (int)len, 0, ILibMemory_Types_HEAP) - #define ILibMemory_SmartAllocateEx(primaryLen, extraLen) ILibMemory_Init(ILibMemory_Size_Validate(primaryLen,extraLen)?malloc(ILibMemory_Init_Size(primaryLen, extraLen)):NULL, (int)primaryLen, (int)extraLen, ILibMemory_Types_HEAP) + #define ILibMemory_SmartAllocate(len) ILibMemory_InitEx(ILibMemory_Size_Validate(len,0)?malloc(ILibMemory_Init_Size(len, 0)):NULL, (int)len, 0, ILibMemory_Types_HEAP) + #define ILibMemory_SmartAllocateEx(primaryLen, extraLen) ILibMemory_InitEx(ILibMemory_Size_Validate(primaryLen,extraLen)?malloc(ILibMemory_Init_Size(primaryLen, extraLen)):NULL, (int)primaryLen, (int)extraLen, ILibMemory_Types_HEAP) void* ILibMemory_SmartReAllocate(void *ptr, size_t len); void* ILibMemory_SmartAllocateEx_ResizeExtra(void *ptr, size_t extraSize);