From ca34d393f9df801633f2794cea99d06f6c2ec061 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Thu, 7 Sep 2006 00:28:43 +0000
Subject: [PATCH] Added work-arounds for SpiderMonkey (JS library) 1.5 bug in
 JS_ValueToInt32 when passed a NaN value (Mozilla bug 284032) - using
 JSVAL_IS_NUM().

---
 src/sbbs3/js_bbs.cpp | 77 +++++++++++++++++++++++---------------------
 1 file changed, 41 insertions(+), 36 deletions(-)

diff --git a/src/sbbs3/js_bbs.cpp b/src/sbbs3/js_bbs.cpp
index 508adaaaf8..1e01c06155 100644
--- a/src/sbbs3/js_bbs.cpp
+++ b/src/sbbs3/js_bbs.cpp
@@ -628,7 +628,7 @@ static JSBool js_bbs_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
 
     tiny = JSVAL_TO_INT(id);
 
-	if(JSVAL_IS_NUMBER(*vp) || JSVAL_IS_BOOLEAN(*vp))
+	if(JSVAL_IS_NUM(*vp) || JSVAL_IS_BOOLEAN(*vp))
 		JS_ValueToInt32(cx, *vp, &val);
 	else if(JSVAL_IS_STRING(*vp)) {
 		if((js_str = JS_ValueToString(cx, *vp))==NULL)
@@ -899,7 +899,7 @@ static uint get_subnum(JSContext* cx, sbbs_t* sbbs, jsval val)
 		for(subnum=0;subnum<sbbs->cfg.total_subs;subnum++)
 			if(!stricmp(sbbs->cfg.sub[subnum]->code,p))
 				break;
-	} else if(JSVAL_IS_NUMBER(val))
+	} else if(JSVAL_IS_NUM(val))
 		JS_ValueToInt32(cx,val,(int32*)&subnum);
 	else if(sbbs->usrgrps>0)
 		subnum=sbbs->usrsub[sbbs->curgrp][sbbs->cursub[sbbs->curgrp]];
@@ -916,7 +916,7 @@ static uint get_dirnum(JSContext* cx, sbbs_t* sbbs, jsval val)
 		for(dirnum=0;dirnum<sbbs->cfg.total_dirs;dirnum++)
 			if(!stricmp(sbbs->cfg.dir[dirnum]->code,p))
 				break;
-	} else if(JSVAL_IS_NUMBER(val))
+	} else if(JSVAL_IS_NUM(val))
 		JS_ValueToInt32(cx,val,(int32*)&dirnum);
 	else if(sbbs->usrlibs>0)
 		dirnum=sbbs->usrdir[sbbs->curlib][sbbs->curdir[sbbs->curlib]];
@@ -990,7 +990,7 @@ js_exec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		return(JS_FALSE);
 
 	for(i=1;i<argc;i++) {
-		if(JSVAL_IS_NUMBER(argv[i]))
+		if(JSVAL_IS_NUM(argv[i]))
 			JS_ValueToInt32(cx,argv[i],(int32*)&mode);
 		else if(JSVAL_IS_STRING(argv[i]))
 			startup_dir=JS_ValueToString(cx,argv[i]);
@@ -1025,7 +1025,7 @@ js_exec_xtrn(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		for(i=0;i<sbbs->cfg.total_xtrns;i++)
 			if(!stricmp(sbbs->cfg.xtrn[i]->code,code))
 				break;
-	} else
+	} else if(JSVAL_IS_NUM(argv[0]))
 		JS_ValueToInt32(cx,argv[0],&i);
 
 	if(i>=sbbs->cfg.total_xtrns) {
@@ -1046,7 +1046,8 @@ js_user_event(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	JS_ValueToInt32(cx,argv[0],&i);
+	if(JSVAL_IS_NUM(argv[0]))
+		JS_ValueToInt32(cx,argv[0],&i);
 	*rval = BOOLEAN_TO_JSVAL(sbbs->user_event((user_event_t)i));
 	return(JS_TRUE);
 }
@@ -1087,7 +1088,8 @@ js_text(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	JS_ValueToInt32(cx,argv[0],&i);
+	if(JSVAL_IS_NUM(argv[0]))
+		JS_ValueToInt32(cx,argv[0],&i);
 	i--;
 
 	if(i<0 || i>=TOTAL_TEXT)
@@ -1116,7 +1118,8 @@ js_replace_text(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	JS_ValueToInt32(cx,argv[0],&i);
+	if(JSVAL_IS_NUM(argv[0]))
+		JS_ValueToInt32(cx,argv[0],&i);
 	i--;
 
 	if(i<0 || i>=TOTAL_TEXT)
@@ -1157,7 +1160,8 @@ js_revert_text(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	JS_ValueToInt32(cx,argv[0],&i);
+	if(JSVAL_IS_NUM(argv[0]))
+		JS_ValueToInt32(cx,argv[0],&i);
 	i--;
 
 	if(i<0 || i>=TOTAL_TEXT) {
@@ -1746,7 +1750,7 @@ js_node_stats(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	if(argc>0)
+	if(argc>0 && JSVAL_IS_NUM(argv[0]))
 		JS_ValueToInt32(cx,argv[0],&node_num);
 
 	sbbs->node_stats(node_num);
@@ -1763,7 +1767,7 @@ js_userlist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	if(argc>0)
+	if(argc>0 && JSVAL_IS_NUM(argv[0]))
 		JS_ValueToInt32(cx,argv[0],&mode);
 
 	sbbs->userlist(mode);
@@ -1780,7 +1784,7 @@ js_useredit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	if(argc>0)
+	if(argc>0 && JSVAL_IS_NUM(argv[0]))
 		JS_ValueToInt32(cx,argv[0],&usernumber);
 
 	sbbs->useredit(usernumber);
@@ -1849,10 +1853,8 @@ js_spy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	if(argc) {
-		if(!JS_ValueToInt32(cx,argv[0],&node_num))
-			node_num=0;
-	}
+	if(argc && JSVAL_IS_NUM(argv[0]))
+		JS_ValueToInt32(cx,argv[0],&node_num);
 	sbbs->spy(node_num);
 
 	return(JS_TRUE);
@@ -1869,9 +1871,9 @@ js_readmail(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		return(JS_FALSE);
 
 	usernumber=sbbs->useron.number;
-	if(argc>0)
+	if(argc>0 && JSVAL_IS_NUM(argv[0]))
 		JS_ValueToInt32(cx,argv[0],&readwhich);
-	if(argc>1)
+	if(argc>1 && JSVAL_IS_NUM(argv[1]))
 		JS_ValueToInt32(cx,argv[1],&usernumber);
 
 	sbbs->readmail(usernumber,readwhich);
@@ -1893,9 +1895,10 @@ js_email(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	JS_ValueToInt32(cx,argv[0],&usernumber);
+	if(JSVAL_IS_NUM(argv[0]))
+		JS_ValueToInt32(cx,argv[0],&usernumber);
 	for(uintN i=1;i<argc;i++) {
-		if(JSVAL_IS_NUMBER(argv[i]))
+		if(JSVAL_IS_NUM(argv[i]))
 			JS_ValueToInt32(cx,argv[i],(int32*)&mode);
 		else if(JSVAL_IS_STRING(argv[i]) && js_top==NULL)
 			js_top=JS_ValueToString(cx,argv[i]);
@@ -1927,7 +1930,7 @@ js_netmail(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		return(JS_FALSE);
 
 	for(uintN i=1;i<argc;i++) {
-		if(JSVAL_IS_NUMBER(argv[i]))
+		if(JSVAL_IS_NUM(argv[i]))
 			JS_ValueToInt32(cx,argv[i],(int32*)&mode);
 		else if(JSVAL_IS_STRING(argv[i]))
 			js_subj=JS_ValueToString(cx,argv[i]);
@@ -2043,7 +2046,7 @@ js_telnet_gate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 	if((addr=JS_GetStringBytes(js_addr))==NULL) 
 		return(JS_FALSE);
 
-	if(argc>1)
+	if(argc>1 && JSVAL_IS_NUM(argv[1]))
 		JS_ValueToInt32(cx,argv[1],&mode);
 
 	sbbs->telnet_gate(addr,mode);
@@ -2084,7 +2087,7 @@ js_multinode_chat(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	if(argc>1)
+	if(argc>1 && JSVAL_IS_NUM(argv[1]))
 		JS_ValueToInt32(cx,argv[1],&channel);
 
 	sbbs->multinodechat(channel);
@@ -2146,7 +2149,8 @@ js_put_node_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	JS_ValueToInt32(cx,argv[0],&node);
+	if(JSVAL_IS_NUM(argv[0]))
+		JS_ValueToInt32(cx,argv[0],&node);
 	if(node<1)
 		node=1;
 
@@ -2171,7 +2175,7 @@ js_get_telegram(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 		return(JS_FALSE);
 
 	usernumber=sbbs->useron.number;
-	if(argc)
+	if(argc && JSVAL_IS_NUM(argv[0]))
 		JS_ValueToInt32(cx,argv[0],&usernumber);
 
 	sbbs->getsmsg(usernumber);
@@ -2190,7 +2194,8 @@ js_put_telegram(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	JS_ValueToInt32(cx,argv[0],&usernumber);
+	if(JSVAL_IS_NUM(argv[0]))
+		JS_ValueToInt32(cx,argv[0],&usernumber);
 	if(usernumber<1)
 		usernumber=1;
 
@@ -2285,7 +2290,7 @@ js_listfiles(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	}
 
 	for(uintN i=1;i<argc;i++) {
-		if(JSVAL_IS_NUMBER(argv[i]))
+		if(JSVAL_IS_NUM(argv[i]))
 			JS_ValueToInt32(cx,argv[i],(int32*)&mode);
 		else if(JSVAL_IS_STRING(argv[i])) {
 			js_str = JS_ValueToString(cx, argv[i]);
@@ -2322,7 +2327,7 @@ js_listfileinfo(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 	}
 
 	for(uintN i=1;i<argc;i++) {
-		if(JSVAL_IS_NUMBER(argv[i]))
+		if(JSVAL_IS_NUM(argv[i]))
 			JS_ValueToInt32(cx,argv[i],(int32*)&mode);
 		else if(JSVAL_IS_STRING(argv[i])) {
 			js_str = JS_ValueToString(cx, argv[i]);
@@ -2358,7 +2363,7 @@ js_postmsg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	ZERO_VAR(msg);
 
 	for(n=1; n<argc; n++) {
-		if(JSVAL_IS_NUMBER(argv[n]))
+		if(JSVAL_IS_NUM(argv[n]))
 			JS_ValueToInt32(cx,argv[n],(int32*)&mode);
 		else if(JSVAL_IS_OBJECT(argv[n])) {
 			if((hdrobj=JSVAL_TO_OBJECT(argv[n]))==NULL)
@@ -2384,7 +2389,7 @@ js_msgscan_cfg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	if(argc && JSVAL_IS_NUMBER(argv[0]))
+	if(argc && JSVAL_IS_NUM(argv[0]))
 		JS_ValueToInt32(cx,argv[0],(int32*)&mode);
 
 	sbbs->new_scan_cfg(mode);
@@ -2434,7 +2439,7 @@ js_scansubs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		return(JS_FALSE);
 
 	for(uintN i=0;i<argc;i++) {
-		if(JSVAL_IS_NUMBER(argv[i]))
+		if(JSVAL_IS_NUM(argv[i]))
 			JS_ValueToInt32(cx,argv[i],(int32*)&mode);
 		else if(JSVAL_IS_BOOLEAN(argv[i]))
 			all=JSVAL_TO_BOOLEAN(argv[i]);
@@ -2459,7 +2464,7 @@ js_scandirs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		return(JS_FALSE);
 
 	for(uintN i=0;i<argc;i++) {
-		if(JSVAL_IS_NUMBER(argv[i]))
+		if(JSVAL_IS_NUM(argv[i]))
 			JS_ValueToInt32(cx,argv[i],(int32*)&mode);
 		else if(JSVAL_IS_BOOLEAN(argv[i]))
 			all=JSVAL_TO_BOOLEAN(argv[i]);
@@ -2492,7 +2497,7 @@ js_scanposts(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	}
 
 	for(uintN i=1;i<argc;i++) {
-		if(JSVAL_IS_NUMBER(argv[i]))
+		if(JSVAL_IS_NUM(argv[i]))
 			JS_ValueToInt32(cx,argv[i],(int32*)&mode);
 		else if(JSVAL_IS_STRING(argv[i]))
 			find=JS_GetStringBytes(JS_ValueToString(cx,argv[i]));
@@ -2525,9 +2530,9 @@ js_listmsgs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if(subnum>=sbbs->cfg.total_subs) 	// invalid sub-board
 		return(JS_TRUE);
 
-	if(JSVAL_IS_NUMBER(argv[argn]))
+	if(JSVAL_IS_NUM(argv[argn]))
 		JS_ValueToInt32(cx,argv[argn++],(int32*)&mode);
-	if(JSVAL_IS_NUMBER(argv[argn]))
+	if(JSVAL_IS_NUM(argv[argn]))
 		JS_ValueToInt32(cx,argv[argn++],(int32*)&start);
 	if(JSVAL_IS_STRING(argv[argn]))
 		find=JS_GetStringBytes(JS_ValueToString(cx,argv[argn++]));
@@ -2547,7 +2552,7 @@ js_getnstime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	if(argc)
+	if(argc && JSVAL_IS_NUM(argv[0]))
 		JS_ValueToInt32(cx,argv[0],(int32*)&t);
 
 	if(sbbs->inputnstime(&t)==true)
-- 
GitLab