From 20eca7a69e334180bb5e3a9e621583de59284331 Mon Sep 17 00:00:00 2001 From: Michael Wu Date: Tue, 15 Mar 2011 18:00:58 -0700 Subject: [PATCH] Bug 632253 - Move magic check to JS_XDRScript, r=igor --- js/src/jsfun.cpp | 2 +- js/src/jsscript.cpp | 24 +++--------------------- js/src/jsscript.h | 7 +------ js/src/jsxdrapi.cpp | 15 +++++++++++++-- 4 files changed, 18 insertions(+), 30 deletions(-) diff --git a/js/src/jsfun.cpp b/js/src/jsfun.cpp index f9fb5e60711e..a8cba532702c 100644 --- a/js/src/jsfun.cpp +++ b/js/src/jsfun.cpp @@ -1903,7 +1903,7 @@ js_XDRFunctionObject(JSXDRState *xdr, JSObject **objp) fun->u.i.wrapper = JSPackedBool((firstword >> 1) & 1); } - if (!js_XDRScript(xdr, &fun->u.i.script, NULL)) + if (!js_XDRScript(xdr, &fun->u.i.script)) return false; if (xdr->mode == JSXDR_DECODE) { diff --git a/js/src/jsscript.cpp b/js/src/jsscript.cpp index b039f52feb3b..d64a08c47afe 100644 --- a/js/src/jsscript.cpp +++ b/js/src/jsscript.cpp @@ -308,7 +308,7 @@ enum ScriptBits { }; JSBool -js_XDRScript(JSXDRState *xdr, JSScript **scriptp, JSBool *hasMagic) +js_XDRScript(JSXDRState *xdr, JSScript **scriptp) { JSScript *oldscript; JSBool ok; @@ -333,24 +333,6 @@ js_XDRScript(JSXDRState *xdr, JSScript **scriptp, JSBool *hasMagic) /* Should not XDR scripts optimized for a single global object. */ JS_ASSERT_IF(script, !JSScript::isValidOffset(script->globalsOffset)); - uint32 magic; - if (xdr->mode == JSXDR_ENCODE) - magic = JSXDR_MAGIC_SCRIPT_CURRENT; - if (!JS_XDRUint32(xdr, &magic)) - return JS_FALSE; - if (magic != JSXDR_MAGIC_SCRIPT_CURRENT) { - /* We do not provide binary compatibility with older scripts. */ - if (!hasMagic) { - JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, - JSMSG_BAD_SCRIPT_MAGIC); - return JS_FALSE; - } - *hasMagic = JS_FALSE; - return JS_TRUE; - } - if (hasMagic) - *hasMagic = JS_TRUE; - /* XDR arguments, local vars, and upvars. */ uint16 nargs, nvars, nupvars; #if defined(DEBUG) || defined(__GNUC__) /* quell GCC overwarning */ @@ -1983,7 +1965,7 @@ js_CloneScript(JSContext *cx, JSScript *script) // we don't want gecko to transcribe our principals for us DisablePrincipalsTranscoding disable(cx); - if (!js_XDRScript(w, &script, NULL)) { + if (!js_XDRScript(w, &script)) { JS_XDRDestroy(w); return NULL; } @@ -2007,7 +1989,7 @@ js_CloneScript(JSContext *cx, JSScript *script) JS_XDRMemSetData(r, p, nbytes); JS_XDRMemSetData(w, NULL, 0); - if (!js_XDRScript(r, &script, NULL)) + if (!js_XDRScript(r, &script)) return NULL; JS_XDRDestroy(r); diff --git a/js/src/jsscript.h b/js/src/jsscript.h index 2fc9625b318f..6868868f89d8 100644 --- a/js/src/jsscript.h +++ b/js/src/jsscript.h @@ -771,17 +771,12 @@ extern JSScript * js_CloneScript(JSContext *cx, JSScript *script); /* - * If magic is non-null, js_XDRScript succeeds on magic number mismatch but - * returns false in *magic; it reflects a match via a true *magic out param. - * If magic is null, js_XDRScript returns false on bad magic number errors, - * which it reports. - * * NB: after a successful JSXDR_DECODE, js_XDRScript callers must do any * required subsequent set-up of owning function or script object and then call * js_CallNewScriptHook. */ extern JSBool -js_XDRScript(JSXDRState *xdr, JSScript **scriptp, JSBool *hasMagic); +js_XDRScript(JSXDRState *xdr, JSScript **scriptp); inline bool JSObject::isScript() const diff --git a/js/src/jsxdrapi.cpp b/js/src/jsxdrapi.cpp index e0fd36c078bf..2fae06a3ccb8 100644 --- a/js/src/jsxdrapi.cpp +++ b/js/src/jsxdrapi.cpp @@ -666,14 +666,25 @@ JS_PUBLIC_API(JSBool) JS_XDRScriptObject(JSXDRState *xdr, JSObject **scriptObjp) { JSScript *script; + uint32 magic; if (xdr->mode == JSXDR_DECODE) { script = NULL; *scriptObjp = NULL; } else { script = (*scriptObjp)->getScript(); + magic = JSXDR_MAGIC_SCRIPT_CURRENT; } - - if (!js_XDRScript(xdr, &script, NULL)) + + if (!JS_XDRUint32(xdr, &magic)) + return false; + + if (magic != JSXDR_MAGIC_SCRIPT_CURRENT) { + /* We do not provide binary compatibility with older scripts. */ + JS_ReportErrorNumber(xdr->cx, js_GetErrorMessage, NULL, JSMSG_BAD_SCRIPT_MAGIC); + return false; + } + + if (!js_XDRScript(xdr, &script)) return false; if (xdr->mode == JSXDR_DECODE) {