WebKit crashes when trying to send a msg via 'today's birthdays' dialogue box on...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 Sep 2013 01:16:50 +0000 (01:16 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 Sep 2013 01:16:50 +0000 (01:16 +0000)
https://bugs.webkit.org/show_bug.cgi?id=120612#add_comment
Patch by Chris Curtis <chris_curtis@apple.com> on 2013-09-10
Reviewed by Geoffrey Garen.

The codeBlock was assumed to exist when appendSourceToMessage was set.
This was an invalid assumption. I added a check to ensure that there is a
valid codeBlock before accessing it.

* API/tests/testapi.c:
(valueToObjectExceptionCallAsFunction):
(valueToObjectExceptionTest):
(main):
* runtime/VM.cpp:
(JSC::VM::throwException):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@155495 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/API/tests/testapi.c
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/VM.cpp

index a9e9e4dab4002e34055d3fa9063650637cb5347f..77bebd760018f64d5d54cb9cfb2b7a8d2a7f598d 100644 (file)
@@ -1043,6 +1043,44 @@ static bool checkForCycleInPrototypeChain()
     return result;
 }
 
+static JSValueRef valueToObjectExceptionCallAsFunction(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
+{
+    UNUSED_PARAM(function);
+    UNUSED_PARAM(thisObject);
+    UNUSED_PARAM(argumentCount);
+    UNUSED_PARAM(arguments);
+    JSValueRef jsUndefined = JSValueMakeUndefined(JSContextGetGlobalContext(ctx));
+    JSValueToObject(JSContextGetGlobalContext(ctx), jsUndefined, exception);
+    
+    return JSValueMakeUndefined(ctx);
+}
+static bool valueToObjectExceptionTest()
+{
+    JSGlobalContextRef testContext;
+    JSClassDefinition globalObjectClassDefinition = kJSClassDefinitionEmpty;
+    globalObjectClassDefinition.initialize = globalObject_initialize;
+    globalObjectClassDefinition.staticValues = globalObject_staticValues;
+    globalObjectClassDefinition.staticFunctions = globalObject_staticFunctions;
+    globalObjectClassDefinition.attributes = kJSClassAttributeNoAutomaticPrototype;
+    JSClassRef globalObjectClass = JSClassCreate(&globalObjectClassDefinition);
+    testContext = JSGlobalContextCreateInGroup(NULL, globalObjectClass);
+    JSObjectRef globalObject = JSContextGetGlobalObject(testContext);
+
+    JSStringRef valueToObject = JSStringCreateWithUTF8CString("valueToObject");
+    JSObjectRef valueToObjectFunction = JSObjectMakeFunctionWithCallback(testContext, valueToObject, valueToObjectExceptionCallAsFunction);
+    JSObjectSetProperty(testContext, globalObject, valueToObject, valueToObjectFunction, kJSPropertyAttributeNone, NULL);
+    JSStringRelease(valueToObject);
+
+    JSStringRef test = JSStringCreateWithUTF8CString("valueToObject();");
+    JSEvaluateScript(testContext, test, NULL, NULL, 1, NULL);
+    
+    JSStringRelease(test);
+    JSClassRelease(globalObjectClass);
+    JSGlobalContextRelease(testContext);
+    
+    return true;
+}
+
 static void checkConstnessInJSObjectNames()
 {
     JSStaticFunction fun;
@@ -1975,6 +2013,8 @@ int main(int argc, char* argv[])
         printf("FAIL: A cycle in a prototype chain can be created.\n");
         failed = true;
     }
+    if (valueToObjectExceptionTest())
+        printf("PASS: throwException did not crash when handling an error with appendMessageToError set and no codeBlock available.\n");
 
     if (failed) {
         printf("FAIL: Some tests failed.\n");
index 6a46909bbd373e5f171dfbf10903eeaf29b07da6..6f85e8a41b305e8e723611306611dcdac6c6c6dc 100644 (file)
@@ -1,3 +1,20 @@
+2013-09-10  Chris Curtis  <chris_curtis@apple.com>
+
+        WebKit crashes when trying to send a msg via 'today's birthdays' dialogue box on Facebook
+        https://bugs.webkit.org/show_bug.cgi?id=120612#add_comment
+        Reviewed by Geoffrey Garen.
+
+        The codeBlock was assumed to exist when appendSourceToMessage was set.
+        This was an invalid assumption. I added a check to ensure that there is a
+        valid codeBlock before accessing it.
+
+        * API/tests/testapi.c:
+        (valueToObjectExceptionCallAsFunction):
+        (valueToObjectExceptionTest):
+        (main):
+        * runtime/VM.cpp:
+        (JSC::VM::throwException):
+
 2013-09-10  Mark Lam  <mark.lam@apple.com>
 
         Fix some indentation in Interpreter.cpp.
index 974d39b6c8b18c8602802625e38e4b9e419318c6..4efa72aeb04316d6bace2e2a02857a2a3fce100e 100644 (file)
@@ -635,9 +635,11 @@ JSValue VM::throwException(ExecState* exec, JSValue error)
         CallFrame* callFrame;
         for (callFrame = exec; callFrame && !callFrame->codeBlock(); callFrame = callFrame->callerFrame()->removeHostCallFrameFlag())
             stackIndex++;
-        stackFrame = stackTrace.at(stackIndex);
-        bytecodeOffset = stackFrame.bytecodeOffset;
-        appendSourceToError(callFrame, static_cast<ErrorInstance*>(exception), bytecodeOffset);
+        if (callFrame && callFrame->codeBlock()) {
+            stackFrame = stackTrace.at(stackIndex);
+            bytecodeOffset = stackFrame.bytecodeOffset;
+            appendSourceToError(callFrame, static_cast<ErrorInstance*>(exception), bytecodeOffset);
+        }
     }
 
     if (exception->hasProperty(exec, this->propertyNames->stack))