From 67fc6c54b15ec52dbdbf8f335245825ad5df4af8 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Wed, 15 Jul 2020 01:24:56 -0700 Subject: [PATCH] Addressed IOActive issues --- meshcore/agentcore.c | 18 ++++---- meshcore/meshinfo.c | 49 ++++++++++++++-------- meshservice/MeshService.vcxproj | 2 - meshservice/MeshService.vcxproj.filters | 6 --- meshservice/ServiceMain.c | 29 +------------ microscript/ILibDuktape_Debugger.c | 2 +- microscript/ILibDuktape_EncryptionStream.c | 4 +- microscript/ILibDuktape_GenericMarshal.c | 2 +- microscript/ILibDuktape_HttpStream.c | 2 +- microscript/ILibDuktape_Polyfills.c | 4 +- microscript/ILibDuktape_ScriptContainer.c | 4 +- microstack/ILibParsers.c | 10 ++--- microstack/ILibParsers.h | 4 +- microstack/ILibSimpleDataStore.c | 9 +++- 14 files changed, 65 insertions(+), 80 deletions(-) diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index f4ea110..ae024ce 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -75,6 +75,7 @@ int gRemoteMouseRenderDefault = 0; #define EXE_IDENTIFIER (unsigned int)778401893 #define MSH_IDENTIFIER (unsigned int)778924904 #define SCRIPT_ENGINE_PIPE_BUFFER_SIZE 65535 +#define SERVER_DISCOVERY_BUFFER_SIZE 1024 #define MESH_AGENT_PORT 16990 //!< Default Mesh Agent Port #define MESH_MCASTv4_GROUP "239.255.255.235" @@ -586,6 +587,7 @@ void UDPSocket_OnData(ILibAsyncUDPSocket_SocketModule socketModule, char* buffer { //int isLoopback; MeshAgentHostContainer *agentHost = (MeshAgentHostContainer*)user; + if (!bufferLength < SERVER_DISCOVERY_BUFFER_SIZE) { return; } UNREFERENCED_PARAMETER(socketModule); UNREFERENCED_PARAMETER(user); @@ -1478,7 +1480,7 @@ void ILibDuktape_MeshAgent_dumpCoreModuleEx(void *chain, void *user) printf("CoreModule was manually dumped %d times, restarting!\n", ++dumpcount); int CoreModuleLen = ILibSimpleDataStore_Get(agentHost->masterDb, "CoreModule", NULL, 0); - if (CoreModuleLen > 0) + if (CoreModuleLen > 4) { // There is a core module, launch it now. CoreModule = (char*)ILibMemory_Allocate(CoreModuleLen, 0, NULL, NULL); @@ -2257,7 +2259,7 @@ int GenerateSHA384FileHash(char *filePath, char *fileHash) unsigned int NTHeaderIndex = 0; fseek(tmpFile, 0, SEEK_SET); ignore_result(fread(ILibScratchPad, 1, 2, tmpFile)); - if (ntohs(((unsigned int*)ILibScratchPad)[0]) == 19802) // 5A4D + if (ntohs(((uint16_t*)ILibScratchPad)[0]) == 19802) // 5A4D { fseek(tmpFile, 60, SEEK_SET); ignore_result(fread((void*)&NTHeaderIndex, 1, 4, tmpFile)); @@ -2876,7 +2878,7 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge agent->coreTimeout = NULL; int CoreModuleLen = ILibSimpleDataStore_Get(agent->masterDb, "CoreModule", NULL, 0); - if (CoreModuleLen <= 0) + if (CoreModuleLen <= 4) { printf(" meshcore not found...\n"); } @@ -3898,7 +3900,7 @@ void MeshAgent_AgentMode_Core_ServerTimeout(duk_context *ctx, void ** args, int agentHost->coreTimeout = NULL; printf("Timeout waiting for Server, launching cached meshcore...\n"); - if (CoreModuleLen <= 0) + if (CoreModuleLen <= 4) { printf(" No meshcore found in db...\n"); } @@ -4501,7 +4503,7 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** { char tmp[16]; int tmpLen = ILibSimpleDataStore_Get(agentHost->masterDb, "jsDebugPort", tmp, 16); - if (tmpLen > 0) + if (tmpLen > 0 && tmpLen < 16) { tmp[tmpLen] = 0; agentHost->jsDebugPort = atoi(tmp); @@ -4531,7 +4533,7 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** duk_eval_string_noresult(agentHost->meshCoreCtx, "process.coreDumpLocation = process.platform=='win32'?(process.execPath.replace('.exe', '.dmp')):(process.execPath + '.dmp');"); } - if (CoreModuleLen > 0) + if (CoreModuleLen > 4) { if (ILibSimpleDataStore_Get(agentHost->masterDb, "noUpdateCoreModule", NULL, 0) != 0) { @@ -4609,11 +4611,11 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** ILibInet_pton(AF_INET, MESH_MCASTv4_GROUP, &(multicastAddr4.sin_addr)); // Multicast socket on fixed port, will receive multicast from the server. - agentHost->multicastDiscovery = ILibMulticastSocket_Create(agentHost->chain, 1024, MESH_AGENT_PORT, &multicastAddr4, &multicastAddr6, UDPSocket_OnData, agentHost, 1); + agentHost->multicastDiscovery = ILibMulticastSocket_Create(agentHost->chain, SERVER_DISCOVERY_BUFFER_SIZE, MESH_AGENT_PORT, &multicastAddr4, &multicastAddr6, UDPSocket_OnData, agentHost, 1); if (agentHost->multicastDiscovery == NULL) { ILIBMARKPOSITION(219); return 1; } // Multicast socket on a random port, used to multicast to the server and receive server unicast responses. - agentHost->multicastDiscovery2 = ILibMulticastSocket_Create(agentHost->chain, 1024, 0, &multicastAddr4, &multicastAddr6, UDPSocket_OnData, agentHost, 1); + agentHost->multicastDiscovery2 = ILibMulticastSocket_Create(agentHost->chain, SERVER_DISCOVERY_BUFFER_SIZE, 0, &multicastAddr4, &multicastAddr6, UDPSocket_OnData, agentHost, 1); if (agentHost->multicastDiscovery2 == NULL) { ILIBMARKPOSITION(219); return 1; } } diff --git a/meshcore/meshinfo.c b/meshcore/meshinfo.c index 2e913da..03b484d 100644 --- a/meshcore/meshinfo.c +++ b/meshcore/meshinfo.c @@ -108,6 +108,7 @@ int info_GetLocalInterfaces(char* data, int maxdata) // Get the list of all local interfaces if ((dwRetVal = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_GATEWAYS | GAA_FLAG_INCLUDE_PREFIX, NULL, pAdapterAddresses, &ulOutBufLen)) != ERROR_SUCCESS || ulOutBufLen == 0) { free(pAdapterInfo); free(pAdapterAddresses); return 0; } + int r = 0; j = 0; pAdapter = pAdapterInfo; while (pAdapter) @@ -117,47 +118,47 @@ int info_GetLocalInterfaces(char* data, int maxdata) while (pAdapterAddr != NULL && pAdapterAddr->IfIndex != pAdapter->Index) { pAdapterAddr = pAdapterAddr->Next; } if (pAdapterAddr == NULL) { free(pAdapterInfo); free(pAdapterAddresses); return 0; } - if (j > 0) { ptr += snprintf(data + ptr, maxdata - ptr, ","); } - ptr += snprintf(data + ptr, maxdata - ptr, "{"); + if (j > 0) { ptr += (r=sprintf_s(data + ptr, maxdata - ptr, ",")); } + ptr += (r = sprintf_s(data + ptr, maxdata - ptr, "{")); // Interface type - ptr += snprintf(data + ptr, maxdata - ptr, "\"type\":%d", pAdapter->Type); + ptr += (r = sprintf_s(data + ptr, maxdata - ptr, "\"type\":%d", pAdapter->Type)); // Interface name if (wcslen(pAdapterAddr->FriendlyName) > 0) { wcstombs_s(&templen, temp, 1023, pAdapterAddr->FriendlyName, wcslen(pAdapterAddr->FriendlyName)); - ptr += snprintf(data + ptr, maxdata - ptr, ",\"name\":\"%s\"", temp); + ptr += (r = sprintf_s(data + ptr, maxdata - ptr, ",\"name\":\"%s\"", temp)); } // Interface description if (wcslen(pAdapterAddr->Description) > 0) { wcstombs_s(&templen, temp, 1023, pAdapterAddr->Description, wcslen(pAdapterAddr->Description)); - ptr += snprintf(data + ptr, maxdata - ptr, ",\"desc\":\"%s\"", temp); + ptr += (r = sprintf_s(data + ptr, maxdata - ptr, ",\"desc\":\"%s\"", temp)); } // Interface MAC address if (pAdapter->AddressLength == 6) { - ptr += snprintf(data + ptr, maxdata - ptr, ",\"mac\":\"%02x%02x%02x%02x%02x%02x\"", pAdapter->Address[0], pAdapter->Address[1], pAdapter->Address[2], pAdapter->Address[3], pAdapter->Address[4], pAdapter->Address[5]); + ptr += (r = sprintf_s(data + ptr, maxdata - ptr, ",\"mac\":\"%02x%02x%02x%02x%02x%02x\"", pAdapter->Address[0], pAdapter->Address[1], pAdapter->Address[2], pAdapter->Address[3], pAdapter->Address[4], pAdapter->Address[5])); } // Interface DNS suffix if (wcslen(pAdapterAddr->DnsSuffix) > 0) { wcstombs_s(&templen, temp, 1023, pAdapterAddr->DnsSuffix, wcslen(pAdapterAddr->DnsSuffix)); - ptr += snprintf(data + ptr, maxdata - ptr, ",\"dnssuffix\":\"%s\"", temp); + ptr += (r = sprintf_s(data + ptr, maxdata - ptr, ",\"dnssuffix\":\"%s\"", temp)); } // IPv4 address and subnet mask - ptr += snprintf(data + ptr, maxdata - ptr, ",\"v4addr\":\"%s\"", pAdapter->IpAddressList.IpAddress.String); - ptr += snprintf(data + ptr, maxdata - ptr, ",\"v4mask\":\"%s\"", pAdapter->IpAddressList.IpMask.String); - ptr += snprintf(data + ptr, maxdata - ptr, ",\"v4gateway\":\"%s\"", pAdapter->GatewayList.IpAddress.String); + ptr += (r = sprintf_s(data + ptr, maxdata - ptr, ",\"v4addr\":\"%s\"", pAdapter->IpAddressList.IpAddress.String)); + ptr += (r = sprintf_s(data + ptr, maxdata - ptr, ",\"v4mask\":\"%s\"", pAdapter->IpAddressList.IpMask.String)); + ptr += (r = sprintf_s(data + ptr, maxdata - ptr, ",\"v4gateway\":\"%s\"", pAdapter->GatewayList.IpAddress.String)); // Get the gateway MAC address ILibInet_pton(AF_INET, pAdapter->IpAddressList.IpAddress.String, &ip1); ILibInet_pton(AF_INET, pAdapter->GatewayList.IpAddress.String, &ip2); SendARP(ip2, ip1, pa, &palen); - if (palen == 6) { ptr += snprintf(data + ptr, maxdata - ptr, ",\"gatewaymac\":\"%02x%02x%02x%02x%02x%02x\"", pa[0], pa[1], pa[2], pa[3], pa[4], pa[5]); } + if (palen == 6) { ptr += (r = sprintf_s(data + ptr, maxdata - ptr, ",\"gatewaymac\":\"%02x%02x%02x%02x%02x%02x\"", pa[0], pa[1], pa[2], pa[3], pa[4], pa[5])); } - ptr += snprintf(data + ptr, maxdata - ptr, "}"); + ptr += (r = sprintf_s(data + ptr, maxdata - ptr, "}")); j++; pAdapter = pAdapter->Next; @@ -167,7 +168,7 @@ int info_GetLocalInterfaces(char* data, int maxdata) free(pAdapterInfo); free(pAdapterAddresses); - return ptr; + return (r < 0 ? 0 : ptr); #endif } #endif @@ -424,13 +425,22 @@ int MeshInfo_GetSystemInformation(char** data) // Setup the response if ((*data = (char*)malloc(65536)) == NULL) { ILIBCRITICALEXIT(254); } - ptr += snprintf(*data + ptr, 65536 - ptr, "{\"netif\":["); + ptr += sprintf_s(*data + ptr, 65536 - ptr, "{\"netif\":["); ptr += info_GetLocalInterfaces(*data + ptr, 65536 - ptr); - ptr += snprintf(*data + ptr, 65536 - ptr, "]}"); - (*data)[ptr] = 0; - if ((*data = realloc(*data, ptr + 1)) == NULL) { ILIBCRITICALEXIT(254); } + ptr += sprintf_s(*data + ptr, 65536 - ptr, "]}"); + if (ptr < 65535) + { + (*data)[ptr] = 0; + if ((*data = realloc(*data, ptr + 1)) == NULL) { ILIBCRITICALEXIT(254); } - return ptr; + return ptr; + } + else + { + free(*data); + *data = NULL; + return(0); + } } @@ -542,6 +552,7 @@ int MeshInfo_PowerState(enum AgentPowerStateActions flg, int force) #elif defined(NACL) //do nothing #else + sync(); syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_POWER_OFF, 0); #endif return 1; @@ -551,6 +562,7 @@ int MeshInfo_PowerState(enum AgentPowerStateActions flg, int force) #elif defined(NACL) //do nothing #else + sync(); syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART, 0); #endif return 1; @@ -568,6 +580,7 @@ int MeshInfo_PowerState(enum AgentPowerStateActions flg, int force) #if defined(_ANDROID) || defined(__APPLE__) // TODO #else + sync(); syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_SW_SUSPEND, 0); #endif return 1; diff --git a/meshservice/MeshService.vcxproj b/meshservice/MeshService.vcxproj index 66b2cf4..2923e3b 100644 --- a/meshservice/MeshService.vcxproj +++ b/meshservice/MeshService.vcxproj @@ -560,7 +560,6 @@ - @@ -617,7 +616,6 @@ - diff --git a/meshservice/MeshService.vcxproj.filters b/meshservice/MeshService.vcxproj.filters index 3420c37..22b2a96 100644 --- a/meshservice/MeshService.vcxproj.filters +++ b/meshservice/MeshService.vcxproj.filters @@ -97,9 +97,6 @@ Meshcore - - Meshcore - Microscript @@ -261,9 +258,6 @@ Meshcore - - Meshcore - Microscript diff --git a/meshservice/ServiceMain.c b/meshservice/ServiceMain.c index f6b5249..95fcb05 100644 --- a/meshservice/ServiceMain.c +++ b/meshservice/ServiceMain.c @@ -409,7 +409,6 @@ int wmain(int argc, char* wargv[]) int i; size_t str2len = 0;// , proxylen = 0, taglen = 0; wchar_t str[_MAX_PATH]; - char str2[_MAX_PATH]; ILib_DumpEnabledContext winException; int retCode = 0; @@ -646,19 +645,7 @@ int wmain(int argc, char* wargv[]) wmain_free(argv); return 0; } - #endif - -#ifdef _MINCORE - if (argc > 1 && strcasecmp(argv[1], "-signcheck") == 0) - { - // Check the signature of out own executable - util_openssl_init(); - printf("%d", signcheck_verifysign(argv[0], 0)); - util_openssl_uninit(); - return 0; - } -#else - + #endif if (integratedJavaScript != NULL || (argc > 0 && strcasecmp(argv[0], "--slave") == 0) || (argc > 1 && ((strcasecmp(argv[1], "run") == 0) || (strcasecmp(argv[1], "connect") == 0) || (strcasecmp(argv[1], "--slave") == 0)))) { // Run the mesh agent in console mode, since the agent is compiled for windows service, the KVM will not work right. This is only good for testing. @@ -706,20 +693,6 @@ int wmain(int argc, char* wargv[]) wmain_free(argv); return serviceState; } - else if (argc > 1 && strcasecmp(argv[1], "-signcheck") == 0 && GetModuleFileNameA(NULL, str2, _MAX_PATH) > 5) - { - // Check the signature of out own executable -#ifndef MICROSTACK_NOTLS - util_openssl_init(); - printf("%d", signcheck_verifysign(str2, 0)); - util_openssl_uninit(); -#else - printf("Cannot verify without OpenSSL support"); -#endif - wmain_free(argv); - return 0; - } -#endif else if (argc > 1 && (strcasecmp(argv[1], "start") == 0 || strcasecmp(argv[1], "-start") == 0)) { // Ask the service manager to launch the service diff --git a/microscript/ILibDuktape_Debugger.c b/microscript/ILibDuktape_Debugger.c index e374449..9a9d890 100644 --- a/microscript/ILibDuktape_Debugger.c +++ b/microscript/ILibDuktape_Debugger.c @@ -565,7 +565,7 @@ void ILibDuktape_Debugger_JSAttach_PopulateSource(duk_context *ctx, char *source { int CoreModuleLen = 0; ILibSimpleDataStore *db = (ILibSimpleDataStore*)Duktape_GetPointerProperty(ctx, -1, "\xFF_MasterDB"); - if (db == NULL || (CoreModuleLen = ILibSimpleDataStore_Get(db, "CoreModule", NULL, 0)) <= 0) + if (db == NULL || (CoreModuleLen = ILibSimpleDataStore_Get(db, "CoreModule", NULL, 0)) <= 4) { ILibDuktape_Error(ctx, "Could Not retrive CoreModule from MeshAgent"); return; } diff --git a/microscript/ILibDuktape_EncryptionStream.c b/microscript/ILibDuktape_EncryptionStream.c index 59e4f4c..e613d99 100644 --- a/microscript/ILibDuktape_EncryptionStream.c +++ b/microscript/ILibDuktape_EncryptionStream.c @@ -143,7 +143,7 @@ duk_ret_t ILibDuktape_EncryptionStream_CreateEncryption(duk_context *ctx) duk_size_t tmpLen; char *tmp = (char*)duk_get_lstring(ctx, -1, &tmpLen); duk_push_object(ctx); // [key][stream] - duk_push_fixed_buffer(ctx, ILibBase64DecodeLength((int)tmpLen));// [key][stream][buffer] + duk_push_fixed_buffer(ctx, ILibBase64DecodeLength(tmpLen));// [key][stream][buffer] key = (char*)Duktape_GetBuffer(ctx, -1, NULL); ILibBase64Decode((unsigned char*)tmp, (int)tmpLen, (unsigned char**)&key); duk_put_prop_string(ctx, -2, "\xFF_key"); // [key][stream] @@ -162,7 +162,7 @@ duk_ret_t ILibDuktape_EncryptionStream_CreateEncryption(duk_context *ctx) { duk_size_t tmpLen; char *tmp = (char*)duk_get_lstring(ctx, -1, &tmpLen); - duk_push_fixed_buffer(ctx, ILibBase64DecodeLength((int)tmpLen)); // [stream][iv][buffer] + duk_push_fixed_buffer(ctx, ILibBase64DecodeLength(tmpLen)); // [stream][iv][buffer] duk_swap_top(ctx, -2); // [stream][buffer][iv] iv = (char*)Duktape_GetBuffer(ctx, -2, NULL); ILibBase64Decode((unsigned char*)tmp, (int)tmpLen, (unsigned char**)&iv); diff --git a/microscript/ILibDuktape_GenericMarshal.c b/microscript/ILibDuktape_GenericMarshal.c index 2052bac..f352b3c 100644 --- a/microscript/ILibDuktape_GenericMarshal.c +++ b/microscript/ILibDuktape_GenericMarshal.c @@ -160,7 +160,7 @@ duk_ret_t ILibDuktape_GenericMarshal_Variable_Val_HSTRING2(duk_context *ctx) { void *ptr; int size; - char hexString[255]; + char hexString[3*255]; duk_push_this(ctx); // [var] duk_get_prop_string(ctx, -1, "_ptr"); // [var][ptr] diff --git a/microscript/ILibDuktape_HttpStream.c b/microscript/ILibDuktape_HttpStream.c index 402ccaf..5f7832b 100644 --- a/microscript/ILibDuktape_HttpStream.c +++ b/microscript/ILibDuktape_HttpStream.c @@ -2786,7 +2786,7 @@ duk_ret_t ILibDuktape_HttpStream_IncomingMessage_Digest_ValidatePassword(duk_con ILibGetEntryEx(DigestTable, "response", 8, (void**)&response, &responseLen); ILibGetEntryEx(DigestTable, "opaque", 6, (void**)&opaque, &opaqueLen); - if (username == NULL || uri == NULL || password == NULL || passwordLen == 0 || response == NULL) + if (username == NULL || uri == NULL || password == NULL || passwordLen == 0 || response == NULL || opaqueLen != 16) { duk_push_false(ctx); return(1); diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index bb055c0..2b82e1e 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -145,7 +145,7 @@ duk_ret_t ILibDuktape_Polyfills_Buffer_toString(duk_context *ctx) cType = (char*)duk_require_string(ctx, 0); if (strcmp(cType, "base64") == 0) { - duk_push_fixed_buffer(ctx, ILibBase64EncodeLength((int)bufferLen)); + duk_push_fixed_buffer(ctx, ILibBase64EncodeLength(bufferLen)); tmpBuffer = Duktape_GetBuffer(ctx, -1, NULL); ILibBase64Encode((unsigned char*)buffer, (int)bufferLen, (unsigned char**)&tmpBuffer); duk_push_string(ctx, tmpBuffer); @@ -208,7 +208,7 @@ duk_ret_t ILibDuktape_Polyfills_Buffer_from(duk_context *ctx) if (strcmp(encoding, "base64") == 0) { // Base64 - buffer = duk_push_fixed_buffer(ctx, ILibBase64DecodeLength((int)strlength)); + buffer = duk_push_fixed_buffer(ctx, ILibBase64DecodeLength(strlength)); bufferLen = ILibBase64Decode((unsigned char*)str, (int)strlength, (unsigned char**)&buffer); duk_push_buffer_object(ctx, -1, 0, bufferLen, DUK_BUFOBJ_NODEJS_BUFFER); } diff --git a/microscript/ILibDuktape_ScriptContainer.c b/microscript/ILibDuktape_ScriptContainer.c index e842945..8f1dc1b 100644 --- a/microscript/ILibDuktape_ScriptContainer.c +++ b/microscript/ILibDuktape_ScriptContainer.c @@ -3156,8 +3156,8 @@ duk_ret_t ILibDuktape_ScriptContainer_ExecuteString(duk_context *ctx) char *payload; duk_size_t payloadLen; payload = (char*)duk_get_lstring(ctx, 0, &payloadLen); - int encodedPayloadLen = ILibBase64EncodeLength((int)payloadLen); - ILibDuktape_ScriptContainer_NonIsolated_Command *cmd = (ILibDuktape_ScriptContainer_NonIsolated_Command*)ILibMemory_Allocate(sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command) + encodedPayloadLen + sizeof(json), 0, NULL, NULL); + size_t encodedPayloadLen = ILibBase64EncodeLength(payloadLen); + ILibDuktape_ScriptContainer_NonIsolated_Command *cmd = (ILibDuktape_ScriptContainer_NonIsolated_Command*)ILibMemory_Allocate((int)(sizeof(ILibDuktape_ScriptContainer_NonIsolated_Command) + encodedPayloadLen + sizeof(json)), 0, NULL, NULL); cmd->container.slave = (ILibDuktape_ScriptContainer_Slave*)((void**)ILibMemory_GetExtraMemory(master->PeerChain, ILibMemory_CHAIN_CONTAINERSIZE))[1]; int i = sprintf_s(cmd->json, sizeof(json) + encodedPayloadLen, json); diff --git a/microstack/ILibParsers.c b/microstack/ILibParsers.c index 850e668..5292c7c 100644 --- a/microstack/ILibParsers.c +++ b/microstack/ILibParsers.c @@ -6779,13 +6779,13 @@ void ILibencodeblock( unsigned char in[3], unsigned char out[4], int len ) out[3] = (unsigned char) (len > 2 ? cb64[ in[2] & 0x3f ] : '='); } -/*! \fn int ILibBase64EncodeLength(const int inputLen) +/*! \fn size_t ILibBase64EncodeLength(size_t inputLen) \brief Returns the length the ILibBase64Encode function would use a stream adding padding and line breaks as per spec. \par \param input The length of the en-encoded data \return The length of the encoded stream */ -int ILibBase64EncodeLength(const int inputLen) +size_t ILibBase64EncodeLength(size_t inputLen) { return ((inputLen * 4) / 3) + 5; } @@ -6841,15 +6841,15 @@ void ILibdecodeblock( unsigned char in[4], unsigned char out[3] ) out[ 2 ] = (unsigned char ) (((in[2] << 6) & 0xc0) | in[3]); } -/*! \fn int ILibBase64DecodeLength(const int inputLen) +/*! \fn size_t ILibBase64DecodeLength(size_t inputLen) \brief Returns the length the ILibBase64Decode function would use to store the decoded string value \par \param input The length of the en-encoded data \return The length of the decoded stream */ -int ILibBase64DecodeLength(const int inputLen) +size_t ILibBase64DecodeLength(size_t inputLen) { - return ((inputLen * 3) / 4) + 4; + return(((inputLen * 3) / 4) + 4); } int ILibBase64DecodeEx(unsigned char* input, const int inputlen, unsigned char* output) diff --git a/microstack/ILibParsers.h b/microstack/ILibParsers.h index ffa3903..e1fb81b 100644 --- a/microstack/ILibParsers.h +++ b/microstack/ILibParsers.h @@ -1392,8 +1392,8 @@ int ILibIsRunningOnChainThread(void* chain); /* Base64 handling methods */ - int ILibBase64EncodeLength(const int inputLen); - int ILibBase64DecodeLength(const int inputLen); + size_t ILibBase64EncodeLength(size_t inputLen); + size_t ILibBase64DecodeLength(size_t inputLen); int ILibBase64Encode(unsigned char* input, const int inputlen, unsigned char** output); int ILibBase64Decode(unsigned char* input, const int inputlen, unsigned char** output); int ILibBase64DecodeEx(unsigned char* input, const int inputlen, unsigned char* output); diff --git a/microstack/ILibSimpleDataStore.c b/microstack/ILibSimpleDataStore.c index 435e185..5776aa5 100644 --- a/microstack/ILibSimpleDataStore.c +++ b/microstack/ILibSimpleDataStore.c @@ -814,10 +814,14 @@ __EXPORT_TYPE int ILibSimpleDataStore_GetEx(ILibSimpleDataStore dataStore, char* return(centry->valueLength); } - else + else if(buffer == NULL) { return(centry->valueLength); } + else + { + return(0); + } } } @@ -869,7 +873,8 @@ __EXPORT_TYPE int ILibSimpleDataStore_GetEx(ILibSimpleDataStore dataStore, char* return(0); } } - return entry->valueLength; + + return(buffer == NULL ? entry->valueLength : 0); } // Get the reference to the SHA384 hash value from the datastore for a given a key.