Changeset 61127 in webkit


Ignore:
Timestamp:
Jun 14, 2010 9:38:18 AM (14 years ago)
Author:
eric@webkit.org
Message:

2010-06-14 Andreas Kling <andreas.kling@nokia.com>

Reviewed by Tor Arne Vestbø.

[Qt] Stack overflow when converting navigator object to QVariant
https://bugs.webkit.org/show_bug.cgi?id=40572

Protect against infinite recursion in JSValue->QVariant conversion.
This fixes a crash when trying to convert MimeType objects (they
recurse infinitely and on-the-fly via the enabledPlugin property.)

  • bridge/qt/qt_runtime.cpp: (JSC::Bindings::convertValueToQVariant):
Location:
trunk/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r61126 r61127  
     12010-06-14  Andreas Kling  <andreas.kling@nokia.com>
     2
     3        Reviewed by Tor Arne Vestbø.
     4
     5        [Qt] Stack overflow when converting navigator object to QVariant
     6        https://bugs.webkit.org/show_bug.cgi?id=40572
     7
     8        Protect against infinite recursion in JSValue->QVariant conversion.
     9        This fixes a crash when trying to convert MimeType objects (they
     10        recurse infinitely and on-the-fly via the enabledPlugin property.)
     11
     12        * bridge/qt/qt_runtime.cpp:
     13        (JSC::Bindings::convertValueToQVariant):
     14
    1152010-06-14  Yong Li  <yoli@rim.com>
    216
  • trunk/WebCore/bridge/qt/qt_runtime.cpp

    r61089 r61127  
    163163}
    164164
    165 QVariant convertValueToQVariant(ExecState* exec, JSValue value, QMetaType::Type hint, int *distance, HashSet<JSObject*>* visitedObjects)
    166 {
    167     if (!value)
     165QVariant convertValueToQVariant(ExecState* exec, JSValue value, QMetaType::Type hint, int *distance, HashSet<JSObject*>* visitedObjects, int recursionLimit)
     166{
     167    --recursionLimit;
     168
     169    if (!value || !recursionLimit)
    168170        return QVariant();
    169171
     
    345347                    if (object->propertyIsEnumerable(exec, *it)) {
    346348                        JSValue val = object->get(exec, *it);
    347                         QVariant v = convertValueToQVariant(exec, val, QMetaType::Void, &objdist, visitedObjects);
     349                        QVariant v = convertValueToQVariant(exec, val, QMetaType::Void, &objdist, visitedObjects, recursionLimit);
    348350                        if (objdist >= 0) {
    349351                            UString ustring = (*it).ustring();
     
    369371                for (int i = 0; i < len; ++i) {
    370372                    JSValue val = rtarray->getConcreteArray()->valueAt(exec, i);
    371                     result.append(convertValueToQVariant(exec, val, QMetaType::Void, &objdist, visitedObjects));
     373                    result.append(convertValueToQVariant(exec, val, QMetaType::Void, &objdist, visitedObjects, recursionLimit));
    372374                    if (objdist == -1) {
    373375                        qConvDebug() << "Failed converting element at index " << i;
     
    388390                for (int i = 0; i < len; ++i) {
    389391                    JSValue val = array->get(exec, i);
    390                     result.append(convertValueToQVariant(exec, val, QMetaType::Void, &objdist, visitedObjects));
     392                    result.append(convertValueToQVariant(exec, val, QMetaType::Void, &objdist, visitedObjects, recursionLimit));
    391393                    if (objdist == -1) {
    392394                        qConvDebug() << "Failed converting element at index " << i;
     
    402404                int objdist;
    403405                qConvDebug() << "making a single length variantlist";
    404                 QVariant var = convertValueToQVariant(exec, value, QMetaType::Void, &objdist, visitedObjects);
     406                QVariant var = convertValueToQVariant(exec, value, QMetaType::Void, &objdist, visitedObjects, recursionLimit);
    405407                if (objdist != -1) {
    406408                    QVariantList result;
     
    646648                        JSValue val = rtarray->getConcreteArray()->valueAt(exec, i);
    647649                        int itemdist = -1;
    648                         QVariant item = convertValueToQVariant(exec, val, QMetaType::QObjectStar, &itemdist, visitedObjects);
     650                        QVariant item = convertValueToQVariant(exec, val, QMetaType::QObjectStar, &itemdist, visitedObjects, recursionLimit);
    649651                        if (itemdist >= 0)
    650652                            result.append(item.value<QObject*>());
     
    665667                        JSValue val = array->get(exec, i);
    666668                        int itemdist = -1;
    667                         QVariant item = convertValueToQVariant(exec, val, QMetaType::QObjectStar, &itemdist, visitedObjects);
     669                        QVariant item = convertValueToQVariant(exec, val, QMetaType::QObjectStar, &itemdist, visitedObjects, recursionLimit);
    668670                        if (itemdist >= 0)
    669671                            result.append(item.value<QObject*>());
     
    680682                    QObjectList result;
    681683                    int itemdist = -1;
    682                     QVariant item = convertValueToQVariant(exec, value, QMetaType::QObjectStar, &itemdist, visitedObjects);
     684                    QVariant item = convertValueToQVariant(exec, value, QMetaType::QObjectStar, &itemdist, visitedObjects, recursionLimit);
    683685                    if (itemdist >= 0) {
    684686                        result.append(item.value<QObject*>());
     
    697699                        JSValue val = rtarray->getConcreteArray()->valueAt(exec, i);
    698700                        int itemdist = -1;
    699                         QVariant item = convertValueToQVariant(exec, val, QMetaType::Int, &itemdist, visitedObjects);
     701                        QVariant item = convertValueToQVariant(exec, val, QMetaType::Int, &itemdist, visitedObjects, recursionLimit);
    700702                        if (itemdist >= 0)
    701703                            result.append(item.value<int>());
     
    716718                        JSValue val = array->get(exec, i);
    717719                        int itemdist = -1;
    718                         QVariant item = convertValueToQVariant(exec, val, QMetaType::Int, &itemdist, visitedObjects);
     720                        QVariant item = convertValueToQVariant(exec, val, QMetaType::Int, &itemdist, visitedObjects, recursionLimit);
    719721                        if (itemdist >= 0)
    720722                            result.append(item.value<int>());
     
    731733                    QList<int> result;
    732734                    int itemdist = -1;
    733                     QVariant item = convertValueToQVariant(exec, value, QMetaType::Int, &itemdist, visitedObjects);
     735                    QVariant item = convertValueToQVariant(exec, value, QMetaType::Int, &itemdist, visitedObjects, recursionLimit);
    734736                    if (itemdist >= 0) {
    735737                        result.append(item.value<int>());
     
    758760
    759761                    // And then recurse with the autodetect flag
    760                     ret = convertValueToQVariant(exec, value, QMetaType::Void, distance, visitedObjects);
     762                    ret = convertValueToQVariant(exec, value, QMetaType::Void, distance, visitedObjects, recursionLimit);
    761763                    dist = 10;
    762764                }
     
    778780QVariant convertValueToQVariant(ExecState* exec, JSValue value, QMetaType::Type hint, int *distance)
    779781{
     782    const int recursionLimit = 200;
    780783    HashSet<JSObject*> visitedObjects;
    781     return convertValueToQVariant(exec, value, hint, distance, &visitedObjects);
     784    return convertValueToQVariant(exec, value, hint, distance, &visitedObjects, recursionLimit);
    782785}
    783786
Note: See TracChangeset for help on using the changeset viewer.