diff --git a/include/IJavaScriptContext.h b/include/IJavaScriptContext.h index 7c5ca76..bf82623 100644 --- a/include/IJavaScriptContext.h +++ b/include/IJavaScriptContext.h @@ -25,6 +25,7 @@ class IJavaScriptContext { public: + virtual ~IJavaScriptContext() = default; virtual bool runScript(const char *script, bool isModule=true, std::string name="", const char *args = nullptr, bool isApplication=false) = 0; virtual bool runFile(const char *file, const char* args, bool isApplication=false) = 0; virtual std::string getUrl() = 0; diff --git a/src/JSRuntimeServer.cpp b/src/JSRuntimeServer.cpp index 342f386..3a0793c 100644 --- a/src/JSRuntimeServer.cpp +++ b/src/JSRuntimeServer.cpp @@ -80,7 +80,7 @@ class JsonWrap uint32_t getUint32(const char *name, bool &err) { - uint32_t res; + uint32_t res = 0; cJSON *itm = cJSON_GetObjectItem(mPtr, name); if (!itm || !cJSON_IsNumber(itm)) { diff --git a/src/NativeJSRenderer.cpp b/src/NativeJSRenderer.cpp index bee81b9..b73f508 100644 --- a/src/NativeJSRenderer.cpp +++ b/src/NativeJSRenderer.cpp @@ -506,8 +506,9 @@ void NativeJSRenderer::run() if(!mTestFileName.empty()) { ModuleSettings settings; + uint32_t testId = createApplicationIdentifier(); settings.enableJSDOM = mEnableTestFileDOMSupport; - ApplicationRequest appRequest(id, RUN, mTestFileName, settings.enableHttp, settings.enableXHR, settings.enableWebSocket, settings.enableWebSocketEnhanced, settings.enableFetch, settings.enableJSDOM, settings.enableWindow, settings.enablePlayer); + ApplicationRequest appRequest(testId, RUN, mTestFileName, settings.enableHttp, settings.enableXHR, settings.enableWebSocket, settings.enableWebSocketEnhanced, settings.enableFetch, settings.enableJSDOM, settings.enableWindow, settings.enablePlayer); NativeJSRenderer::createApplicationInternal(appRequest); NativeJSRenderer::runApplicationInternal(appRequest); mTestFileName = ""; diff --git a/src/jsc/JavaScriptContext.cpp b/src/jsc/JavaScriptContext.cpp index a0af753..09ee2f4 100644 --- a/src/jsc/JavaScriptContext.cpp +++ b/src/jsc/JavaScriptContext.cpp @@ -121,6 +121,10 @@ if (mModuleSettings.enablePlayer) mPriv->releaseAllProtected(); JSGlobalContextRelease(mContext); JSContextGroupRelease(mContextGroup); + if (mNetworkMetricsData) { + delete mNetworkMetricsData; + mNetworkMetricsData = nullptr; + } rtLogInfo("%s end", __FUNCTION__); } diff --git a/src/jsc/JavaScriptUtils.cpp b/src/jsc/JavaScriptUtils.cpp index 5476746..4f1a50a 100644 --- a/src/jsc/JavaScriptUtils.cpp +++ b/src/jsc/JavaScriptUtils.cpp @@ -314,24 +314,61 @@ rtError rtSetVideoStartTimeBinding(int numArgs, const rtValue* args, rtValue* re rtError rtReadBinaryBinding(int numArgs, const rtValue* args, rtValue* result, void* context) { - char *buffer = nullptr; - FILE *ptr = nullptr; - ptr = fopen("hello.wasm","rb"); // r for read, b for binary + UNUSED_PARAM(context); + + // 1. Validate numArgs and use args for filename + if (numArgs < 1 || args[0].getType() != RT_stringType) { + rtLogError("%s: missing or invalid file path", __FUNCTION__); + return RT_ERROR_INVALID_ARG; + } - const char *fd = "hello.wasm"; + const char *fd = args[0].toString().cString(); + FILE *ptr = fopen(fd, "rb"); + + // 2. Check fopen + if (!ptr) { + rtLogError("Failed to open file: %s", fd); + return RT_ERROR; + } + + // 3. Check stat struct stat buf; + if (stat(fd, &buf) != 0) { + rtLogError("Failed to stat file: %s", fd); + fclose(ptr); + return RT_ERROR; + } - stat(fd, &buf); int size = buf.st_size; + if (size <= 0) { + rtLogError("Invalid file size: %d", size); + fclose(ptr); + return RT_ERROR; + } - buffer = (char*)malloc(size); - fread(buffer,size,1,ptr); // read 10 bytes to our buffer - fclose(ptr); + // 4. Check malloc + char *buffer = (char*)malloc(size); + if (!buffer) { + rtLogError("Failed to allocate memory for file: %s", fd); + fclose(ptr); + return RT_ERROR; + } - if (result) - { - result->setString(buffer); + // 5. Robust fread + size_t bytesRead = fread(buffer, 1, size, ptr); + if (bytesRead != (size_t)size) { + rtLogError("Failed to read complete file. Expected %d bytes, read %zu bytes", size, bytesRead); + free(buffer); + fclose(ptr); + return RT_ERROR; + } + + // 6. Set result only if buffer is valid + if (result) { + result->setString(buffer); } + free(buffer); + fclose(ptr); return RT_OK; } @@ -693,6 +730,7 @@ rtError rtJSRuntimeDownloadMetrics(int numArgs, const rtValue* args, rtValue* re rtValue keys; if (map->Get("allKeys", &keys) != RT_OK) { rtLogWarn("Could not retrieve url for network metrics data."); + delete netMetricsArray; return RT_FAIL; } rtObjectRef objRef = keys.toObject(); @@ -700,6 +738,7 @@ rtError rtJSRuntimeDownloadMetrics(int numArgs, const rtValue* args, rtValue* re if (!keysArray) { rtLogWarn("No url found in the network metrics data."); + delete netMetricsArray; return RT_FAIL; } @@ -715,6 +754,7 @@ rtError rtJSRuntimeDownloadMetrics(int numArgs, const rtValue* args, rtValue* re NetworkMetrics* metrics = (NetworkMetrics*)storedValue.toVoidPtr(); if (!metrics) { rtLogError("Failed to cast stored value to NetworkMetrics structure for url: %s.", key.cString()); + delete netMetricsArray; return RT_FAIL; } rtMapObject* metricsMap = new rtMapObject();