зеркало из https://github.com/mozilla/gecko-dev.git
Bug 932315 - Throw a different error when this-unwrapping fails for security reasons. r=bz.
--HG-- extra : rebase_source : a92639be64d8d591ea4c97955bc04e6047e0d027
This commit is contained in:
Родитель
a6a084f359
Коммит
a4fe40c32e
|
@ -64,6 +64,27 @@ UnwrapArg(JSContext* cx, JS::Handle<JS::Value> v, Interface** ppArg,
|
|||
return rv;
|
||||
}
|
||||
|
||||
inline const ErrNum
|
||||
GetInvalidThisErrorForMethod(bool aSecurityError)
|
||||
{
|
||||
return aSecurityError ? MSG_METHOD_THIS_UNWRAPPING_DENIED :
|
||||
MSG_METHOD_THIS_DOES_NOT_IMPLEMENT_INTERFACE;
|
||||
}
|
||||
|
||||
inline const ErrNum
|
||||
GetInvalidThisErrorForGetter(bool aSecurityError)
|
||||
{
|
||||
return aSecurityError ? MSG_GETTER_THIS_UNWRAPPING_DENIED :
|
||||
MSG_GETTER_THIS_DOES_NOT_IMPLEMENT_INTERFACE;
|
||||
}
|
||||
|
||||
inline const ErrNum
|
||||
GetInvalidThisErrorForSetter(bool aSecurityError)
|
||||
{
|
||||
return aSecurityError ? MSG_SETTER_THIS_UNWRAPPING_DENIED :
|
||||
MSG_SETTER_THIS_DOES_NOT_IMPLEMENT_INTERFACE;
|
||||
}
|
||||
|
||||
bool
|
||||
ThrowInvalidThis(JSContext* aCx, const JS::CallArgs& aArgs,
|
||||
const ErrNum aErrorNumber,
|
||||
|
|
|
@ -2453,13 +2453,14 @@ class CastableObjectUnwrapper():
|
|||
CGGeneric(self.substitution["codeOnFailure"])).define()
|
||||
|
||||
def __str__(self):
|
||||
codeOnFailure = self.substitution["codeOnFailure"] % {'securityError': 'rv == NS_ERROR_XPC_SECURITY_MANAGER_VETO'}
|
||||
return string.Template(
|
||||
"""{
|
||||
nsresult rv = UnwrapObject<${protoID}, ${type}>(cx, ${source}, ${target});
|
||||
if (NS_FAILED(rv)) {
|
||||
${codeOnFailure}
|
||||
}
|
||||
}""").substitute(self.substitution)
|
||||
}""").substitute(self.substitution, codeOnFailure=codeOnFailure)
|
||||
|
||||
class FailureFatalCastableObjectUnwrapper(CastableObjectUnwrapper):
|
||||
"""
|
||||
|
@ -5453,7 +5454,8 @@ class CGAbstractBindingMethod(CGAbstractStaticMethod):
|
|||
else:
|
||||
ensureCondition = "!args.thisv().isObject()"
|
||||
getThisObj = "&args.thisv().toObject()"
|
||||
ensureThisObj = CGIfWrapper(CGGeneric(self.unwrapFailureCode),
|
||||
unwrapFailureCode = self.unwrapFailureCode % {'securityError': 'false'}
|
||||
ensureThisObj = CGIfWrapper(CGGeneric(unwrapFailureCode),
|
||||
ensureCondition)
|
||||
else:
|
||||
ensureThisObj = None
|
||||
|
@ -5520,7 +5522,7 @@ class CGGenericMethod(CGAbstractBindingMethod):
|
|||
args = [Argument('JSContext*', 'cx'), Argument('unsigned', 'argc'),
|
||||
Argument('JS::Value*', 'vp')]
|
||||
unwrapFailureCode = (
|
||||
'return ThrowInvalidThis(cx, args, MSG_METHOD_THIS_DOES_NOT_IMPLEMENT_INTERFACE, \"%s\");' %
|
||||
'return ThrowInvalidThis(cx, args, GetInvalidThisErrorForMethod(%%(securityError)s), "%s");' %
|
||||
descriptor.interface.identifier.name)
|
||||
CGAbstractBindingMethod.__init__(self, descriptor, 'genericMethod',
|
||||
args,
|
||||
|
@ -5720,7 +5722,7 @@ class CGGenericGetter(CGAbstractBindingMethod):
|
|||
else:
|
||||
name = "genericGetter"
|
||||
unwrapFailureCode = (
|
||||
'return ThrowInvalidThis(cx, args, MSG_GETTER_THIS_DOES_NOT_IMPLEMENT_INTERFACE, "%s");' %
|
||||
'return ThrowInvalidThis(cx, args, GetInvalidThisErrorForGetter(%%(securityError)s), "%s");' %
|
||||
descriptor.interface.identifier.name)
|
||||
CGAbstractBindingMethod.__init__(self, descriptor, name, args,
|
||||
unwrapFailureCode)
|
||||
|
@ -5800,7 +5802,7 @@ class CGGenericSetter(CGAbstractBindingMethod):
|
|||
else:
|
||||
name = "genericSetter"
|
||||
unwrapFailureCode = (
|
||||
'return ThrowInvalidThis(cx, args, MSG_SETTER_THIS_DOES_NOT_IMPLEMENT_INTERFACE, "%s");' %
|
||||
'return ThrowInvalidThis(cx, args, GetInvalidThisErrorForSetter(%%(securityError)s), "%s");' %
|
||||
descriptor.interface.identifier.name)
|
||||
|
||||
CGAbstractBindingMethod.__init__(self, descriptor, name, args,
|
||||
|
|
|
@ -25,8 +25,11 @@ MSG_DEF(MSG_NOT_OBJECT, 1, "{0} is not an object.")
|
|||
MSG_DEF(MSG_NOT_CALLABLE, 1, "{0} is not callable.")
|
||||
MSG_DEF(MSG_DOES_NOT_IMPLEMENT_INTERFACE, 2, "{0} does not implement interface {1}.")
|
||||
MSG_DEF(MSG_METHOD_THIS_DOES_NOT_IMPLEMENT_INTERFACE, 2, "'{0}' called on an object that does not implement interface {1}.")
|
||||
MSG_DEF(MSG_METHOD_THIS_UNWRAPPING_DENIED, 1, "Permission to call '{0}' denied.")
|
||||
MSG_DEF(MSG_GETTER_THIS_DOES_NOT_IMPLEMENT_INTERFACE, 2, "'{0}' getter called on an object that does not implement interface {1}.")
|
||||
MSG_DEF(MSG_GETTER_THIS_UNWRAPPING_DENIED, 1, "Permission to call '{0}' getter denied.")
|
||||
MSG_DEF(MSG_SETTER_THIS_DOES_NOT_IMPLEMENT_INTERFACE, 2, "'{0}' setter called on an object that does not implement interface {1}.")
|
||||
MSG_DEF(MSG_SETTER_THIS_UNWRAPPING_DENIED, 1, "Permission to call '{0}' setter denied.")
|
||||
MSG_DEF(MSG_THIS_DOES_NOT_IMPLEMENT_INTERFACE, 1, "\"this\" object does not implement interface {0}.")
|
||||
MSG_DEF(MSG_NOT_IN_UNION, 2, "{0} could not be converted to any of: {1}.")
|
||||
MSG_DEF(MSG_ILLEGAL_CONSTRUCTOR, 0, "Illegal constructor.")
|
||||
|
|
Загрузка…
Ссылка в новой задаче