From 11baa827967c37c324106d365cfcc55e5b938963 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Sat, 20 Dec 2008 07:17:30 +0000
Subject: [PATCH] Fix more JS suspend/resume request bugs, optimize some
 others, and add some requests for clarification from Deuce.

---
 src/sbbs3/ftpsrvr.c   |  1 +
 src/sbbs3/js_bbs.cpp  |  1 +
 src/sbbs3/js_file.c   |  5 +++--
 src/sbbs3/js_global.c |  4 +++-
 src/sbbs3/js_socket.c |  5 +++--
 src/sbbs3/js_system.c | 21 +++++++++------------
 src/sbbs3/jsexec.c    |  6 ++++--
 7 files changed, 24 insertions(+), 19 deletions(-)

diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index b77f09a184..8254cfb716 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -680,6 +680,7 @@ BOOL js_generate_index(JSContext* js_cx, JSObject* parent,
 			strcat(spath,".js");
 
 		if(!fexist(spath)) {
+			JS_RESUMEREQUEST(js_cx, rc);
 			lprintf(LOG_ERR,"%04d !HTML JavaScript (%s) doesn't exist",sock,spath);
 			break;
 		}
diff --git a/src/sbbs3/js_bbs.cpp b/src/sbbs3/js_bbs.cpp
index d2ca7d2bbe..73a77223b9 100644
--- a/src/sbbs3/js_bbs.cpp
+++ b/src/sbbs3/js_bbs.cpp
@@ -1755,6 +1755,7 @@ js_recvfile(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	char*		p;
 	char*		cstr;
 	jsrefcount	rc;
+	/* Deuce: please explain the next 2 lines: */
 	rc=JS_SUSPENDREQUEST(cx);
 	JS_RESUMEREQUEST(cx, rc);
 
diff --git a/src/sbbs3/js_file.c b/src/sbbs3/js_file.c
index c076602fad..6612bba553 100644
--- a/src/sbbs3/js_file.c
+++ b/src/sbbs3/js_file.c
@@ -403,9 +403,9 @@ js_readln(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		JS_RESUMEREQUEST(cx, rc);
 		if((js_str=JS_NewStringCopyZ(cx,buf))!=NULL)	/* exception here Feb-12-2005 */
 			*rval = STRING_TO_JSVAL(js_str);			/* _CrtDbgBreak from _heap_alloc_dbg */
-		rc=JS_SUSPENDREQUEST(cx);
+	} else {
+		JS_RESUMEREQUEST(cx, rc);
 	}
-	JS_RESUMEREQUEST(cx, rc);
 
 	return(JS_TRUE);
 }
@@ -1174,6 +1174,7 @@ js_write(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		if(tlen>len) {
 			len=tlen-len;
 			if((cp=malloc(len))==NULL) {
+				JS_RESUMEREQUEST(cx, rc);
 				FREE_AND_NULL(uubuf);
 				dbprintf(TRUE, p, "malloc failure of %u bytes", len);
 				return(JS_TRUE);
diff --git a/src/sbbs3/js_global.c b/src/sbbs3/js_global.c
index 55d4c6fd0a..70306b4942 100644
--- a/src/sbbs3/js_global.c
+++ b/src/sbbs3/js_global.c
@@ -499,6 +499,7 @@ js_crc32(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	size_t		len;
 	uint32_t	cs;
 	jsrefcount	rc;
+	/* Deuce: please explain the next 2 lines: */
 	rc=JS_SUSPENDREQUEST(cx);
 	JS_RESUMEREQUEST(cx, rc);
 
@@ -529,7 +530,7 @@ js_chksum(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((p=js_ValueToStringBytes(cx, argv[0], &len))==NULL)
 		return(JS_FALSE);
 
-	rc=JS_SUSPENDREQUEST(cx);
+	rc=JS_SUSPENDREQUEST(cx);	/* Deuce: Is this really necessary? */
 	while(len--) sum+=*(p++);
 	JS_RESUMEREQUEST(cx, rc);
 
@@ -2567,6 +2568,7 @@ js_cfgfname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	char		result[MAX_PATH+1];
 	char*		cstr;
 	jsrefcount	rc;
+	/* Deuce: please explain next 2 lines: */
 	rc=JS_SUSPENDREQUEST(cx);
 	JS_RESUMEREQUEST(cx, rc);
 
diff --git a/src/sbbs3/js_socket.c b/src/sbbs3/js_socket.c
index f6cbf167e0..6e596446bc 100644
--- a/src/sbbs3/js_socket.c
+++ b/src/sbbs3/js_socket.c
@@ -710,6 +710,8 @@ js_recvfrom(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 				break;
 		}
 
+		JS_RESUMEREQUEST(cx, rc);
+
 		if(rd!=len) {
 			p->last_error=ERROR_VALUE;
 			return(JS_TRUE);
@@ -724,12 +726,11 @@ js_recvfrom(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 
 		rc=JS_SUSPENDREQUEST(cx);
 		len = recvfrom(p->sock,buf,len,0,(SOCKADDR*)&addr,&addrlen);
+		JS_RESUMEREQUEST(cx, rc);
 		if(len<0) {
 			p->last_error=ERROR_VALUE;
-			JS_RESUMEREQUEST(cx, rc);
 			return(JS_TRUE);
 		}
-		JS_RESUMEREQUEST(cx, rc);
 		buf[len]=0;
 
 		str = JS_NewStringCopyN(cx, buf, len);
diff --git a/src/sbbs3/js_system.c b/src/sbbs3/js_system.c
index 6409389538..3c9715d75d 100644
--- a/src/sbbs3/js_system.c
+++ b/src/sbbs3/js_system.c
@@ -818,11 +818,10 @@ js_matchuserdata(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
 
 	JS_ValueToInt32(cx,argv[0],&offset);
 	rc=JS_SUSPENDREQUEST(cx);
-	if((len=user_rec_len(offset))<0) {
-		JS_RESUMEREQUEST(cx, rc);
-		return(JS_FALSE);
-	}
+	len=user_rec_len(offset);
 	JS_RESUMEREQUEST(cx, rc);
+	if(len<0)
+		return(JS_FALSE);
 
 	if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
 		*rval = INT_TO_JSVAL(0);
@@ -1183,11 +1182,10 @@ js_get_node_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval
 		node_num=1;
 
 	rc=JS_SUSPENDREQUEST(cx);
-	if((buf=getnmsg(cfg,node_num))==NULL) {
-		JS_RESUMEREQUEST(cx, rc);
-		return(JS_TRUE);
-	}
+	buf=getnmsg(cfg,node_num);
 	JS_RESUMEREQUEST(cx, rc);
+	if(buf==NULL)
+		return(JS_TRUE);
 
 	js_str=JS_NewStringCopyZ(cx, buf);
 	free(buf);
@@ -1247,11 +1245,10 @@ js_get_telegram(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 		usernumber=1;
 
 	rc=JS_SUSPENDREQUEST(cx);
-	if((buf=getsmsg(cfg,usernumber))==NULL) {
-		JS_RESUMEREQUEST(cx, rc);
-		return(JS_TRUE);
-	}
+	buf=getsmsg(cfg,usernumber);
 	JS_RESUMEREQUEST(cx, rc);
+	if(buf==NULL)
+		return(JS_TRUE);
 
 	js_str=JS_NewStringCopyZ(cx, buf);
 	free(buf);
diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c
index f449336478..ee3aee82e4 100644
--- a/src/sbbs3/jsexec.c
+++ b/src/sbbs3/jsexec.c
@@ -8,7 +8,7 @@
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
  * @format.use-tabs true	(see http://www.synchro.net/ptsc_hdr.html)		*
  *																			*
- * Copyright 2007 Rob Swindell - http://www.synchro.net/copyright.html		*
+ * Copyright 2008 Rob Swindell - http://www.synchro.net/copyright.html		*
  *																			*
  * This program is free software; you can redistribute it and/or			*
  * modify it under the terms of the GNU General Public License				*
@@ -473,8 +473,10 @@ js_prompt(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		instr[0]=0;
 
 	rc=JS_SUSPENDREQUEST(cx);
-	if(!fgets(instr,sizeof(instr),stdin))
+	if(!fgets(instr,sizeof(instr),stdin)) {
+		JS_RESUMEREQUEST(cx, rc);
 		return(JS_TRUE);
+	}
 	JS_RESUMEREQUEST(cx, rc);
 
 	if((str=JS_NewStringCopyZ(cx, truncnl(instr)))==NULL)
-- 
GitLab