From a83bc82c1220a0652178bde922d0af03a2e2036e Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Sat, 10 Aug 2002 08:17:26 +0000
Subject: [PATCH] js_Create*Object functions return existing object if it's
 already been created.

---
 src/sbbs3/js_file_area.c |  4 ++++
 src/sbbs3/js_msg_area.c  |  4 ++++
 src/sbbs3/js_user.c      | 23 ++++++++++++++++-------
 3 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/src/sbbs3/js_file_area.c b/src/sbbs3/js_file_area.c
index e8e1ef0643..7fd3a81c6c 100644
--- a/src/sbbs3/js_file_area.c
+++ b/src/sbbs3/js_file_area.c
@@ -77,6 +77,10 @@ JSObject* DLLCALL js_CreateFileAreaObject(JSContext* cx, JSObject* parent, scfg_
 	uint		l,d;
 	JSBool		found;
 
+	/* Return existing object if it's already been created */
+	if(JS_GetProperty(cx,parent,"file_area",&val))
+		return(JSVAL_TO_OBJECT(val));
+
 	areaobj = JS_DefineObject(cx, parent, "file_area", &js_file_area_class, NULL, 0);
 
 	if(areaobj==NULL)
diff --git a/src/sbbs3/js_msg_area.c b/src/sbbs3/js_msg_area.c
index 2cfcf25d55..18ba32c2c0 100644
--- a/src/sbbs3/js_msg_area.c
+++ b/src/sbbs3/js_msg_area.c
@@ -129,6 +129,10 @@ JSObject* DLLCALL js_CreateMsgAreaObject(JSContext* cx, JSObject* parent, scfg_t
 	uint		c,l,d;
 	JSBool		found;
 
+	/* Return existing object if it's already been created */
+	if(JS_GetProperty(cx,parent,"msg_area",&val))
+		return(JSVAL_TO_OBJECT(val));
+
 	areaobj = JS_DefineObject(cx, parent, "msg_area", &js_msg_area_class, NULL, 0);
 
 	if(areaobj==NULL)
diff --git a/src/sbbs3/js_user.c b/src/sbbs3/js_user.c
index a5125f442b..1da4e854a7 100644
--- a/src/sbbs3/js_user.c
+++ b/src/sbbs3/js_user.c
@@ -747,18 +747,23 @@ JSObject* DLLCALL js_CreateUserObject(JSContext* cx, JSObject* parent, scfg_t* c
 	JSObject*	statsobj;
 	JSObject*	securityobj;
 	private_t*	p;
+	jsval		val;
 
-	if((p=(private_t*)malloc(sizeof(private_t)))==NULL)
-		return(NULL);
-
-	p->cfg = cfg;
-	p->usernumber = usernumber;
+	/* Return existing user object if it's already been created */
+	if(JS_GetProperty(cx,parent,name,&val))
+		return(JSVAL_TO_OBJECT(val));
 
 	userobj = JS_DefineObject(cx, parent, name, &js_user_class, NULL, 0);
 
 	if(userobj==NULL)
 		return(NULL);
 
+	if((p=(private_t*)malloc(sizeof(private_t)))==NULL)
+		return(NULL);
+
+	p->cfg = cfg;
+	p->usernumber = usernumber;
+
 	JS_SetPrivate(cx, userobj, p);	
 
 	JS_DefineProperties(cx, userobj, js_user_properties);
@@ -769,8 +774,10 @@ JSObject* DLLCALL js_CreateUserObject(JSContext* cx, JSObject* parent, scfg_t* c
 	statsobj = JS_DefineObject(cx, userobj, "stats"
 		,&js_user_stats_class, NULL, 0);
 
-	if(statsobj==NULL)
+	if(statsobj==NULL) {
+		free(p);
 		return(NULL);
+	}
 
 	JS_SetPrivate(cx, statsobj, p);
 
@@ -780,8 +787,10 @@ JSObject* DLLCALL js_CreateUserObject(JSContext* cx, JSObject* parent, scfg_t* c
 	securityobj = JS_DefineObject(cx, userobj, "security"
 		,&js_user_security_class, NULL, 0);
 
-	if(securityobj==NULL)
+	if(securityobj==NULL) {
+		free(p);
 		return(NULL);
+	}
 
 	JS_SetPrivate(cx, securityobj, p);
 
-- 
GitLab