History

Merge pull request #9065 from huffman/fix/script-engine-abuse

Fix deleteLater() vulnerability in scripts

Ryan Huffman committed 9 years ago

Commit 39070fe2 parents 30d5f70 601aa512 files · +10 −6Browse files

Showing the changes to libraries/script-engine/src/ScriptEngine.cpp (1 of 2 files). Show all

Unified · Split

libraries/script-engine/src/ScriptEngine.cpp+9−5
@@ -66,6 +66,8 @@ · 65 unmodified lines
6666 #include "MIDIEvent.h"
6767
6868 static const QString SCRIPT_EXCEPTION_FORMAT = "[UncaughtException] %1 in %2:%3";
69+static const QScriptEngine::QObjectWrapOptions DEFAULT_QOBJECT_WRAP_OPTIONS =
70+ QScriptEngine::ExcludeDeleteLater | QScriptEngine::ExcludeChildObjects;
6971
7072 Q_DECLARE_METATYPE(QScriptEngine::FunctionSignature)
7173 int functionSignatureMetaID = qRegisterMetaType<QScriptEngine::FunctionSignature>();
@@ -94,7 +96,7 @@ static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine){ · 22 unmodified lines
9496 }
9597
9698 QScriptValue avatarDataToScriptValue(QScriptEngine* engine, AvatarData* const &in) {
97− return engine->newQObject(in);
99+ return engine->newQObject(in, QScriptEngine::QtOwnership, DEFAULT_QOBJECT_WRAP_OPTIONS);
98100 }
99101
100102 void avatarDataFromScriptValue(const QScriptValue &object, AvatarData* &out) {
@@ -105,7 +107,7 @@ Q_DECLARE_METATYPE(controller::InputController*) · 4 unmodified lines
105107 //static int inputControllerPointerId = qRegisterMetaType<controller::InputController*>();
106108
107109 QScriptValue inputControllerToScriptValue(QScriptEngine *engine, controller::InputController* const &in) {
108− return engine->newQObject(in);
110+ return engine->newQObject(in, QScriptEngine::QtOwnership, DEFAULT_QOBJECT_WRAP_OPTIONS);
109111 }
110112
111113 void inputControllerFromScriptValue(const QScriptValue &object, controller::InputController* &out) {
@@ -459,7 +461,8 @@ static QScriptValue scriptableResourceToScriptValue(QScriptEngine* engine, const · 347 unmodified lines
459461
460462 auto object = engine->newQObject(
461463 const_cast<ScriptableResourceRawPtr>(resource),
462− QScriptEngine::ScriptOwnership);
464+ QScriptEngine::ScriptOwnership,
465+ DEFAULT_QOBJECT_WRAP_OPTIONS);
463466 return object;
464467 }
465468
@@ -478,7 +481,8 @@ static QScriptValue createScriptableResourcePrototype(QScriptEngine* engine) { · 12 unmodified lines
478481 state->setProperty(metaEnum.key(i), metaEnum.value(i));
479482 }
480483
481− auto prototypeState = engine->newQObject(state, QScriptEngine::QtOwnership, QScriptEngine::ExcludeSlots | QScriptEngine::ExcludeSuperClassMethods);
484+ auto prototypeState = engine->newQObject(state, QScriptEngine::QtOwnership,
485+ QScriptEngine::ExcludeDeleteLater | QScriptEngine::ExcludeSlots | QScriptEngine::ExcludeSuperClassMethods);
482486 prototype.setProperty("State", prototypeState);
483487
484488 return prototype;
@@ -611,7 +615,7 @@ void ScriptEngine::registerGlobalObject(const QString& name, QObject* object) { · 126 unmodified lines
611615
612616 if (!globalObject().property(name).isValid()) {
613617 if (object) {
614− QScriptValue value = newQObject(object);
618+ QScriptValue value = newQObject(object, QScriptEngine::QtOwnership, DEFAULT_QOBJECT_WRAP_OPTIONS);
615619 globalObject().setProperty(name, value);
616620 } else {
617621 globalObject().setProperty(name, QScriptValue());