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