From f2bfb9da36e8aa3f5991ca59a1c832121a3b25e9 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 24 Mar 2020 04:50:06 +0000
Subject: [PATCH] Handle getstats() failure with an error exception in the
 system.stats "getter". Don't call getstats() when querying properties that
 aren't actually stats (e.g. total_users) - performance optimization.

---
 src/sbbs3/js_system.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/sbbs3/js_system.c b/src/sbbs3/js_system.c
index b523603b6f..c3ef9f57c9 100644
--- a/src/sbbs3/js_system.c
+++ b/src/sbbs3/js_system.c
@@ -577,19 +577,24 @@ static JSBool js_sysstats_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
 	jsrefcount	rc;
 
 	js_system_private_t* sys;
-	if((sys = (js_system_private_t*)JS_GetPrivate(cx,obj))==NULL)
+	if((sys = (js_system_private_t*)JS_GetPrivate(cx,obj))==NULL) {
+		JS_ReportError(cx, "JS_GetPrivate failure in %s", __FUNCTION__);
 		return JS_FALSE;
+	}
 	scfg_t* cfg = sys->cfg;
 
     JS_IdToValue(cx, id, &idval);
     tiny = JSVAL_TO_INT(idval);
 
-	rc=JS_SUSPENDREQUEST(cx);
-	if(!getstats(cfg, 0, &stats)) {
+	if(tiny < SYSSTAT_PROP_TOTALUSERS) {
+		rc=JS_SUSPENDREQUEST(cx);
+		if(!getstats(cfg, 0, &stats)) {
+			JS_RESUMEREQUEST(cx, rc);
+			JS_ReportError(cx, "getstats failure in %s", __FUNCTION__);
+			return JS_FALSE;
+		}
 		JS_RESUMEREQUEST(cx, rc);
-		return(FALSE);
 	}
-	JS_RESUMEREQUEST(cx, rc);
 
 	switch(tiny) {
 		case SYSSTAT_PROP_LOGONS:
-- 
GitLab