Changeset 61127 in webkit
- Timestamp:
- Jun 14, 2010 9:38:18 AM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r61126 r61127 1 2010-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 1 15 2010-06-14 Yong Li <yoli@rim.com> 2 16 -
trunk/WebCore/bridge/qt/qt_runtime.cpp
r61089 r61127 163 163 } 164 164 165 QVariant convertValueToQVariant(ExecState* exec, JSValue value, QMetaType::Type hint, int *distance, HashSet<JSObject*>* visitedObjects) 166 { 167 if (!value) 165 QVariant convertValueToQVariant(ExecState* exec, JSValue value, QMetaType::Type hint, int *distance, HashSet<JSObject*>* visitedObjects, int recursionLimit) 166 { 167 --recursionLimit; 168 169 if (!value || !recursionLimit) 168 170 return QVariant(); 169 171 … … 345 347 if (object->propertyIsEnumerable(exec, *it)) { 346 348 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); 348 350 if (objdist >= 0) { 349 351 UString ustring = (*it).ustring(); … … 369 371 for (int i = 0; i < len; ++i) { 370 372 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)); 372 374 if (objdist == -1) { 373 375 qConvDebug() << "Failed converting element at index " << i; … … 388 390 for (int i = 0; i < len; ++i) { 389 391 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)); 391 393 if (objdist == -1) { 392 394 qConvDebug() << "Failed converting element at index " << i; … … 402 404 int objdist; 403 405 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); 405 407 if (objdist != -1) { 406 408 QVariantList result; … … 646 648 JSValue val = rtarray->getConcreteArray()->valueAt(exec, i); 647 649 int itemdist = -1; 648 QVariant item = convertValueToQVariant(exec, val, QMetaType::QObjectStar, &itemdist, visitedObjects );650 QVariant item = convertValueToQVariant(exec, val, QMetaType::QObjectStar, &itemdist, visitedObjects, recursionLimit); 649 651 if (itemdist >= 0) 650 652 result.append(item.value<QObject*>()); … … 665 667 JSValue val = array->get(exec, i); 666 668 int itemdist = -1; 667 QVariant item = convertValueToQVariant(exec, val, QMetaType::QObjectStar, &itemdist, visitedObjects );669 QVariant item = convertValueToQVariant(exec, val, QMetaType::QObjectStar, &itemdist, visitedObjects, recursionLimit); 668 670 if (itemdist >= 0) 669 671 result.append(item.value<QObject*>()); … … 680 682 QObjectList result; 681 683 int itemdist = -1; 682 QVariant item = convertValueToQVariant(exec, value, QMetaType::QObjectStar, &itemdist, visitedObjects );684 QVariant item = convertValueToQVariant(exec, value, QMetaType::QObjectStar, &itemdist, visitedObjects, recursionLimit); 683 685 if (itemdist >= 0) { 684 686 result.append(item.value<QObject*>()); … … 697 699 JSValue val = rtarray->getConcreteArray()->valueAt(exec, i); 698 700 int itemdist = -1; 699 QVariant item = convertValueToQVariant(exec, val, QMetaType::Int, &itemdist, visitedObjects );701 QVariant item = convertValueToQVariant(exec, val, QMetaType::Int, &itemdist, visitedObjects, recursionLimit); 700 702 if (itemdist >= 0) 701 703 result.append(item.value<int>()); … … 716 718 JSValue val = array->get(exec, i); 717 719 int itemdist = -1; 718 QVariant item = convertValueToQVariant(exec, val, QMetaType::Int, &itemdist, visitedObjects );720 QVariant item = convertValueToQVariant(exec, val, QMetaType::Int, &itemdist, visitedObjects, recursionLimit); 719 721 if (itemdist >= 0) 720 722 result.append(item.value<int>()); … … 731 733 QList<int> result; 732 734 int itemdist = -1; 733 QVariant item = convertValueToQVariant(exec, value, QMetaType::Int, &itemdist, visitedObjects );735 QVariant item = convertValueToQVariant(exec, value, QMetaType::Int, &itemdist, visitedObjects, recursionLimit); 734 736 if (itemdist >= 0) { 735 737 result.append(item.value<int>()); … … 758 760 759 761 // 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); 761 763 dist = 10; 762 764 } … … 778 780 QVariant convertValueToQVariant(ExecState* exec, JSValue value, QMetaType::Type hint, int *distance) 779 781 { 782 const int recursionLimit = 200; 780 783 HashSet<JSObject*> visitedObjects; 781 return convertValueToQVariant(exec, value, hint, distance, &visitedObjects );784 return convertValueToQVariant(exec, value, hint, distance, &visitedObjects, recursionLimit); 782 785 } 783 786
Note: See TracChangeset
for help on using the changeset viewer.