summaryrefslogtreecommitdiffstats
path: root/src/script/api/qscriptvalue.cpp
diff options
context:
space:
mode:
authorKent Hansen <khansen@trolltech.com>2009-07-17 11:59:44 (GMT)
committerKent Hansen <khansen@trolltech.com>2009-07-17 11:59:44 (GMT)
commit869450c0f6f5cf654211f79d97d00e0d0058b49c (patch)
tree41e940e70397ca358483068fbfeae13b37cf33aa /src/script/api/qscriptvalue.cpp
parent55e4d1453f6ddbca69599047f5638ca2cd63bd0c (diff)
downloadQt-869450c0f6f5cf654211f79d97d00e0d0058b49c.zip
Qt-869450c0f6f5cf654211f79d97d00e0d0058b49c.tar.gz
Qt-869450c0f6f5cf654211f79d97d00e0d0058b49c.tar.bz2
implement cyclic prototype chain check
Diffstat (limited to 'src/script/api/qscriptvalue.cpp')
-rw-r--r--src/script/api/qscriptvalue.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/script/api/qscriptvalue.cpp b/src/script/api/qscriptvalue.cpp
index ec72818..2084ddb 100644
--- a/src/script/api/qscriptvalue.cpp
+++ b/src/script/api/qscriptvalue.cpp
@@ -840,9 +840,20 @@ void QScriptValue::setPrototype(const QScriptValue &prototype)
"a different engine");
return;
}
- // ### check for cycle
QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine);
JSC::JSValue other = eng_p->scriptValueToJSCValue(prototype);
+
+ // check for cycle
+ JSC::JSValue nextPrototypeValue = other;
+ while (nextPrototypeValue && nextPrototypeValue.isObject()) {
+ JSC::JSObject *nextPrototype = JSC::asObject(nextPrototypeValue);
+ if (nextPrototype == JSC::asObject(d->jscValue)) {
+ qWarning("QScriptValue::setPrototype() failed: cyclic prototype value");
+ return;
+ }
+ nextPrototypeValue = nextPrototype->prototype();
+ }
+
JSC::asObject(d->jscValue)->setPrototype(other);
}