Skip to content
Snippets Groups Projects
Commit 9bd552ed authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Improve JavaScript-related error messages and fix potential JS runtime leak

If a new JS context could not be created for any reason, a JS runtime would
still be allocated (and leaked), potentially leading to out of memory
situations which had been seen (before this change) on vert.synchro.net.
parent f9c949a5
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
...@@ -773,8 +773,10 @@ js_initcx(JSRuntime* js_runtime, SOCKET sock, service_client_t* service_client, ...@@ -773,8 +773,10 @@ js_initcx(JSRuntime* js_runtime, SOCKET sock, service_client_t* service_client,
BOOL success=FALSE; BOOL success=FALSE;
BOOL rooted=FALSE; BOOL rooted=FALSE;
if((js_cx = JS_NewContext(js_runtime, JAVASCRIPT_CONTEXT_STACK))==NULL) if((js_cx = JS_NewContext(js_runtime, JAVASCRIPT_CONTEXT_STACK))==NULL) {
lprintf(LOG_CRIT, "%04d %s JavaScript: Failed to create new context", sock, service_client->client->protocol);
return(NULL); return(NULL);
}
JS_SetOptions(js_cx, startup->js.options); JS_SetOptions(js_cx, startup->js.options);
JS_BEGINREQUEST(js_cx); JS_BEGINREQUEST(js_cx);
...@@ -881,6 +883,8 @@ js_initcx(JSRuntime* js_runtime, SOCKET sock, service_client_t* service_client, ...@@ -881,6 +883,8 @@ js_initcx(JSRuntime* js_runtime, SOCKET sock, service_client_t* service_client,
if(!success) { if(!success) {
lprintf(LOG_CRIT, "%04d %s JavaScript: Failed to create global objects and classes"
,sock, service_client->client->protocol);
if(rooted) if(rooted)
JS_RemoveObjectRoot(js_cx, glob); JS_RemoveObjectRoot(js_cx, glob);
JS_ENDREQUEST(js_cx); JS_ENDREQUEST(js_cx);
...@@ -1117,14 +1121,16 @@ static void js_service_thread(void* arg) ...@@ -1117,14 +1121,16 @@ static void js_service_thread(void* arg)
if((js_runtime=jsrt_GetNew(service->js.max_bytes, 5000, __FILE__, __LINE__))==NULL if((js_runtime=jsrt_GetNew(service->js.max_bytes, 5000, __FILE__, __LINE__))==NULL
|| (js_cx=js_initcx(js_runtime,socket,&service_client,&js_glob))==NULL) { || (js_cx=js_initcx(js_runtime,socket,&service_client,&js_glob))==NULL) {
if(service->log_level >= LOG_ERR) if(service->log_level >= LOG_WARNING)
lprintf(LOG_ERR,"%04d %s !ERROR initializing JavaScript context" lprintf(LOG_WARNING,"%04d %s !JavaScript ERROR %s"
,socket,service->protocol); ,socket, js_runtime == NULL ? "creating runtime" : "initializing context", service->protocol);
if (service_client.tls_sess != -1) if (service_client.tls_sess != -1)
cryptDestroySession(service_client.tls_sess); cryptDestroySession(service_client.tls_sess);
client_off(socket); client_off(socket);
close_socket(socket); close_socket(socket);
protected_uint32_adjust(&service->clients, -1); protected_uint32_adjust(&service->clients, -1);
if(js_runtime != NULL)
jsrt_Release(js_runtime);
thread_down(); thread_down();
return; return;
} }
...@@ -1257,7 +1263,7 @@ static void js_static_service_thread(void* arg) ...@@ -1257,7 +1263,7 @@ static void js_static_service_thread(void* arg)
if((js_runtime=jsrt_GetNew(service->js.max_bytes, 5000, __FILE__, __LINE__))==NULL) { if((js_runtime=jsrt_GetNew(service->js.max_bytes, 5000, __FILE__, __LINE__))==NULL) {
if(service->log_level >= LOG_ERR) if(service->log_level >= LOG_ERR)
lprintf(LOG_ERR,"%s !ERROR initializing JavaScript runtime" lprintf(LOG_ERR,"%s !JavaScript ERROR creating runtime"
,service->protocol); ,service->protocol);
xpms_destroy(service->set, close_socket_cb, service); xpms_destroy(service->set, close_socket_cb, service);
service->set = NULL; service->set = NULL;
...@@ -1273,8 +1279,8 @@ static void js_static_service_thread(void* arg) ...@@ -1273,8 +1279,8 @@ static void js_static_service_thread(void* arg)
do { do {
if((js_cx=js_initcx(js_runtime,INVALID_SOCKET,&service_client,&js_glob))==NULL) { if((js_cx=js_initcx(js_runtime,INVALID_SOCKET,&service_client,&js_glob))==NULL) {
if(service->log_level >= LOG_ERR) if(service->log_level >= LOG_WARNING)
lprintf(LOG_ERR,"%s !ERROR initializing JavaScript context" lprintf(LOG_WARNING,"%s !JavaScript ERROR initializing context"
,service->protocol); ,service->protocol);
break; break;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment