Remove __call__ and add a callback used to check f.caller access for any function object f (109113, r=jst, sr=jband, a=blizzard).
git-svn-id: svn://10.0.0.236/branches/MOZILLA_0_9_6_BRANCH@108268 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -2707,6 +2707,16 @@ JS_CheckAccess(JSContext *cx, JSObject *obj, jsid id, JSAccessMode mode,
|
||||
return OBJ_CHECK_ACCESS(cx, obj, id, mode, vp, attrsp);
|
||||
}
|
||||
|
||||
JS_PUBLIC_API(JSCheckAccessOp)
|
||||
JS_SetCheckObjectAccessCallback(JSRuntime *rt, JSCheckAccessOp acb)
|
||||
{
|
||||
JSCheckAccessOp oldacb;
|
||||
|
||||
oldacb = rt->checkObjectAccess;
|
||||
rt->checkObjectAccess = acb;
|
||||
return oldacb;
|
||||
}
|
||||
|
||||
JS_PUBLIC_API(JSBool)
|
||||
JS_GetReservedSlot(JSContext *cx, JSObject *obj, uint32 index, jsval *vp)
|
||||
{
|
||||
|
||||
@@ -1041,6 +1041,9 @@ extern JS_PUBLIC_API(JSBool)
|
||||
JS_CheckAccess(JSContext *cx, JSObject *obj, jsid id, JSAccessMode mode,
|
||||
jsval *vp, uintN *attrsp);
|
||||
|
||||
extern JS_PUBLIC_API(JSCheckAccessOp)
|
||||
JS_SetCheckObjectAccessCallback(JSRuntime *rt, JSCheckAccessOp acb);
|
||||
|
||||
extern JS_PUBLIC_API(JSBool)
|
||||
JS_GetReservedSlot(JSContext *cx, JSObject *obj, uint32 index, jsval *vp);
|
||||
|
||||
|
||||
@@ -184,6 +184,12 @@ struct JSRuntime {
|
||||
#define NO_SCOPE_SHARING_TODO ((JSScope *) 0xfeedbeef)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Check property accessibility for objects of arbitrary class. Used at
|
||||
* present to check f.caller accessibility for any function object f.
|
||||
*/
|
||||
JSCheckAccessOp checkObjectAccess;
|
||||
|
||||
/* Security principals serialization support. */
|
||||
JSPrincipalsTranscoder principalsTranscoder;
|
||||
|
||||
|
||||
@@ -67,8 +67,7 @@ enum {
|
||||
ARGS_CALLEE = -4, /* reference from arguments to active funobj */
|
||||
FUN_ARITY = -5, /* number of formal parameters; desired argc */
|
||||
FUN_NAME = -6, /* function name, "" if anonymous */
|
||||
FUN_CALL = -7, /* function's top Call object in this context */
|
||||
FUN_CALLER = -8 /* Function.prototype.caller, backward compat */
|
||||
FUN_CALLER = -7 /* Function.prototype.caller, backward compat */
|
||||
};
|
||||
|
||||
#if JSFRAME_OVERRIDE_BITS < 8
|
||||
@@ -626,7 +625,6 @@ Call(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
|
||||
static JSPropertySpec call_props[] = {
|
||||
{js_arguments_str, CALL_ARGUMENTS, JSPROP_PERMANENT,0,0},
|
||||
{"__callee__", CALL_CALLEE, 0,0,0},
|
||||
{"__call__", FUN_CALL, 0,0,0},
|
||||
{0,0,0,0,0}
|
||||
};
|
||||
|
||||
@@ -659,11 +657,6 @@ call_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
|
||||
*vp = fp->argv ? fp->argv[-2] : OBJECT_TO_JSVAL(fp->fun->object);
|
||||
break;
|
||||
|
||||
case FUN_CALL:
|
||||
if (!TEST_OVERRIDE_BIT(fp, slot))
|
||||
*vp = OBJECT_TO_JSVAL(obj);
|
||||
break;
|
||||
|
||||
default:
|
||||
if ((uintN)slot < JS_MAX(fp->argc, fp->fun->nargs))
|
||||
*vp = fp->argv[slot];
|
||||
@@ -689,7 +682,6 @@ call_setProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
|
||||
switch (slot) {
|
||||
case CALL_ARGUMENTS:
|
||||
case CALL_CALLEE:
|
||||
case FUN_CALL:
|
||||
SET_OVERRIDE_BIT(fp, slot);
|
||||
break;
|
||||
|
||||
@@ -870,7 +862,6 @@ static JSPropertySpec function_props[] = {
|
||||
{js_arity_str, FUN_ARITY, FUNCTION_PROP_ATTRS,0,0},
|
||||
{js_length_str, ARGS_LENGTH, FUNCTION_PROP_ATTRS,0,0},
|
||||
{js_name_str, FUN_NAME, FUNCTION_PROP_ATTRS,0,0},
|
||||
{"__call__", FUN_CALL, FUNCTION_PROP_ATTRS,0,0},
|
||||
{js_caller_str, FUN_CALLER, FUNCTION_PROP_ATTRS,0,0},
|
||||
{0,0,0,0,0}
|
||||
};
|
||||
@@ -939,22 +930,16 @@ fun_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
|
||||
: STRING_TO_JSVAL(cx->runtime->emptyString);
|
||||
break;
|
||||
|
||||
case FUN_CALL:
|
||||
if (fp && fp->fun) {
|
||||
JSObject *callobj = js_GetCallObject(cx, fp, NULL);
|
||||
if (!callobj)
|
||||
return JS_FALSE;
|
||||
*vp = OBJECT_TO_JSVAL(callobj);
|
||||
} else {
|
||||
*vp = JSVAL_NULL;
|
||||
}
|
||||
break;
|
||||
|
||||
case FUN_CALLER:
|
||||
if (fp && fp->down && fp->down->fun)
|
||||
*vp = fp->down->argv[-2];
|
||||
else
|
||||
*vp = JSVAL_NULL;
|
||||
if (cx->runtime->checkObjectAccess) {
|
||||
id = ATOM_KEY(cx->runtime->atomState.callerAtom);
|
||||
if (!cx->runtime->checkObjectAccess(cx, obj, id, JSACC_READ, vp))
|
||||
return JS_FALSE;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -78,10 +78,12 @@ typedef enum JSType {
|
||||
|
||||
/* JSObjectOps.checkAccess mode enumeration. */
|
||||
typedef enum JSAccessMode {
|
||||
JSACC_PROTO,
|
||||
JSACC_PARENT,
|
||||
JSACC_IMPORT,
|
||||
JSACC_WATCH,
|
||||
JSACC_PROTO, /* XXXbe redundant w.r.t. id */
|
||||
JSACC_PARENT, /* XXXbe redundant w.r.t. id */
|
||||
JSACC_IMPORT, /* import foo.bar */
|
||||
JSACC_WATCH, /* a watchpoint on object foo for id 'bar' */
|
||||
JSACC_READ, /* a "get" of foo.bar */
|
||||
JSACC_WRITE, /* a "set" of foo.bar = baz */
|
||||
JSACC_LIMIT
|
||||
} JSAccessMode;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user