REGRESSION(r185091): Crash happens on indexdb tests
authorgyuyoung.kim@webkit.org <gyuyoung.kim@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 2 Jun 2015 09:12:41 +0000 (09:12 +0000)
committergyuyoung.kim@webkit.org <gyuyoung.kim@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 2 Jun 2015 09:12:41 +0000 (09:12 +0000)
https://bugs.webkit.org/show_bug.cgi?id=145549

Reviewed by Csaba Osztrogon√°c.

r185091 caused crash on some indexeddb tests. The crash happens because IDBDatabaseError::create() doesn't
dereference count by using ptr(). It makes a crash when dereferencing on ~Ref() destructor. To fix this issue,
this patch uses leakRef() instead of ptr().

* WebProcess/Databases/IndexedDB/WebIDBServerConnection.cpp:
(WebKit::WebIDBServerConnection::didCreateObjectStore):
(WebKit::WebIDBServerConnection::didCreateIndex):
(WebKit::WebIDBServerConnection::didDeleteIndex):
(WebKit::WebIDBServerConnection::didPutRecord):
(WebKit::WebIDBServerConnection::didGetRecord):
(WebKit::WebIDBServerConnection::didOpenCursor):
(WebKit::WebIDBServerConnection::didAdvanceCursor):
(WebKit::WebIDBServerConnection::didIterateCursor):
(WebKit::WebIDBServerConnection::didCount):
(WebKit::WebIDBServerConnection::didDeleteRange):
(WebKit::WebIDBServerConnection::didClearObjectStore):
(WebKit::WebIDBServerConnection::didDeleteObjectStore):
(WebKit::WebIDBServerConnection::didChangeDatabaseVersion):

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

Source/WebKit2/ChangeLog
Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.cpp

index d8bec33..db9584d 100644 (file)
@@ -1,3 +1,29 @@
+2015-06-02  Gyuyoung Kim  <gyuyoung.kim@webkit.org>
+
+        REGRESSION(r185091): Crash happens on indexdb tests
+        https://bugs.webkit.org/show_bug.cgi?id=145549
+
+        Reviewed by Csaba Osztrogon√°c.
+
+        r185091 caused crash on some indexeddb tests. The crash happens because IDBDatabaseError::create() doesn't
+        dereference count by using ptr(). It makes a crash when dereferencing on ~Ref() destructor. To fix this issue,
+        this patch uses leakRef() instead of ptr().
+
+        * WebProcess/Databases/IndexedDB/WebIDBServerConnection.cpp:
+        (WebKit::WebIDBServerConnection::didCreateObjectStore):
+        (WebKit::WebIDBServerConnection::didCreateIndex):
+        (WebKit::WebIDBServerConnection::didDeleteIndex):
+        (WebKit::WebIDBServerConnection::didPutRecord):
+        (WebKit::WebIDBServerConnection::didGetRecord):
+        (WebKit::WebIDBServerConnection::didOpenCursor):
+        (WebKit::WebIDBServerConnection::didAdvanceCursor):
+        (WebKit::WebIDBServerConnection::didIterateCursor):
+        (WebKit::WebIDBServerConnection::didCount):
+        (WebKit::WebIDBServerConnection::didDeleteRange):
+        (WebKit::WebIDBServerConnection::didClearObjectStore):
+        (WebKit::WebIDBServerConnection::didDeleteObjectStore):
+        (WebKit::WebIDBServerConnection::didChangeDatabaseVersion):
+
 2015-06-01  Enrica Casucci  <enrica@apple.com>
 
         [iOS] Hardware Keyboard: All combinations for arrow keys with Shift do not extend the selection.
index 37b2eb2..6a8d967 100644 (file)
@@ -336,7 +336,7 @@ void WebIDBServerConnection::didCreateObjectStore(uint64_t requestID, bool succe
     if (!serverRequest)
         return;
 
-    serverRequest->completeRequest(success ? nullptr : IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured creating object store").ptr());
+    serverRequest->completeRequest(success ? nullptr : &IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured creating object store").leakRef());
 }
 
 void WebIDBServerConnection::createIndex(IDBTransactionBackend&transaction, const CreateIndexOperation& operation, std::function<void (PassRefPtr<IDBDatabaseError>)> completionCallback)
@@ -365,7 +365,7 @@ void WebIDBServerConnection::didCreateIndex(uint64_t requestID, bool success)
     if (!serverRequest)
         return;
 
-    serverRequest->completeRequest(success ? nullptr : IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured creating index").ptr());
+    serverRequest->completeRequest(success ? nullptr : &IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured creating index").leakRef());
 }
 
 void WebIDBServerConnection::deleteIndex(IDBTransactionBackend&transaction, const DeleteIndexOperation& operation, std::function<void (PassRefPtr<IDBDatabaseError>)> completionCallback)
@@ -394,7 +394,7 @@ void WebIDBServerConnection::didDeleteIndex(uint64_t requestID, bool success)
     if (!serverRequest)
         return;
 
-    serverRequest->completeRequest(success ? nullptr : IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured deleting index").ptr());
+    serverRequest->completeRequest(success ? nullptr : &IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured deleting index").leakRef());
 }
 
 void WebIDBServerConnection::get(IDBTransactionBackend& transaction, const GetOperation& operation, std::function<void (const IDBGetResult&, PassRefPtr<IDBDatabaseError>)> completionCallback)
@@ -453,7 +453,7 @@ void WebIDBServerConnection::didPutRecord(uint64_t requestID, const WebCore::IDB
     if (!serverRequest)
         return;
 
-    serverRequest->completeRequest(resultKey.isNull ? nullptr : resultKey.maybeCreateIDBKey(), errorCode ? IDBDatabaseError::create(errorCode, errorMessage).ptr() : nullptr);
+    serverRequest->completeRequest(resultKey.isNull ? nullptr : resultKey.maybeCreateIDBKey(), errorCode ? &IDBDatabaseError::create(errorCode, errorMessage).leakRef() : nullptr);
 }
 
 void WebIDBServerConnection::didGetRecord(uint64_t requestID, const WebCore::IDBGetResult& getResult, uint32_t errorCode, const String& errorMessage)
@@ -465,7 +465,7 @@ void WebIDBServerConnection::didGetRecord(uint64_t requestID, const WebCore::IDB
     if (!serverRequest)
         return;
 
-    serverRequest->completeRequest(getResult, errorCode ? IDBDatabaseError::create(errorCode, errorMessage).ptr() : nullptr);
+    serverRequest->completeRequest(getResult, errorCode ? &IDBDatabaseError::create(errorCode, errorMessage).leakRef() : nullptr);
 }
 
 void WebIDBServerConnection::didOpenCursor(uint64_t requestID, int64_t cursorID, const IDBKeyData& key, const IDBKeyData& primaryKey, const IPC::DataReference& valueData, uint32_t errorCode, const String& errorMessage)
@@ -478,7 +478,7 @@ void WebIDBServerConnection::didOpenCursor(uint64_t requestID, int64_t cursorID,
         return;
 
     RefPtr<SharedBuffer> value = SharedBuffer::create(valueData.data(), valueData.size());
-    serverRequest->completeRequest(cursorID, key.maybeCreateIDBKey(), primaryKey.maybeCreateIDBKey(), value.release(), errorCode ? IDBDatabaseError::create(errorCode, errorMessage).ptr() : nullptr);
+    serverRequest->completeRequest(cursorID, key.maybeCreateIDBKey(), primaryKey.maybeCreateIDBKey(), value.release(), errorCode ? &IDBDatabaseError::create(errorCode, errorMessage).leakRef() : nullptr);
 }
 
 void WebIDBServerConnection::didAdvanceCursor(uint64_t requestID, const IDBKeyData& key, const IDBKeyData& primaryKey, const IPC::DataReference& valueData, uint32_t errorCode, const String& errorMessage)
@@ -491,7 +491,7 @@ void WebIDBServerConnection::didAdvanceCursor(uint64_t requestID, const IDBKeyDa
         return;
 
     RefPtr<SharedBuffer> value = SharedBuffer::create(valueData.data(), valueData.size());
-    serverRequest->completeRequest(key.maybeCreateIDBKey(), primaryKey.maybeCreateIDBKey(), value.release(), errorCode ? IDBDatabaseError::create(errorCode, errorMessage).ptr() : nullptr);
+    serverRequest->completeRequest(key.maybeCreateIDBKey(), primaryKey.maybeCreateIDBKey(), value.release(), errorCode ? &IDBDatabaseError::create(errorCode, errorMessage).leakRef() : nullptr);
 }
 
 void WebIDBServerConnection::didIterateCursor(uint64_t requestID, const IDBKeyData& key, const IDBKeyData& primaryKey, const IPC::DataReference& valueData, uint32_t errorCode, const String& errorMessage)
@@ -504,7 +504,7 @@ void WebIDBServerConnection::didIterateCursor(uint64_t requestID, const IDBKeyDa
         return;
 
     RefPtr<SharedBuffer> value = SharedBuffer::create(valueData.data(), valueData.size());
-    serverRequest->completeRequest(key.maybeCreateIDBKey(), primaryKey.maybeCreateIDBKey(), value.release(), errorCode ? IDBDatabaseError::create(errorCode, errorMessage).ptr() : nullptr);
+    serverRequest->completeRequest(key.maybeCreateIDBKey(), primaryKey.maybeCreateIDBKey(), value.release(), errorCode ? &IDBDatabaseError::create(errorCode, errorMessage).leakRef() : nullptr);
 }
 
 void WebIDBServerConnection::count(IDBTransactionBackend& transaction, const CountOperation& operation, std::function<void (int64_t, PassRefPtr<IDBDatabaseError>)> completionCallback)
@@ -533,7 +533,7 @@ void WebIDBServerConnection::didCount(uint64_t requestID, int64_t count, uint32_
     if (!serverRequest)
         return;
 
-    serverRequest->completeRequest(count, errorCode ? IDBDatabaseError::create(errorCode, errorMessage).ptr() : nullptr);
+    serverRequest->completeRequest(count, errorCode ? &IDBDatabaseError::create(errorCode, errorMessage).leakRef() : nullptr);
 }
 
 void WebIDBServerConnection::deleteRange(IDBTransactionBackend& transaction, const DeleteRangeOperation& operation, std::function<void (PassRefPtr<IDBDatabaseError>)> completionCallback)
@@ -562,7 +562,7 @@ void WebIDBServerConnection::didDeleteRange(uint64_t requestID, uint32_t errorCo
     if (!serverRequest)
         return;
 
-    serverRequest->completeRequest(errorCode ? IDBDatabaseError::create(errorCode, errorMessage).ptr() : nullptr);
+    serverRequest->completeRequest(errorCode ? &IDBDatabaseError::create(errorCode, errorMessage).leakRef() : nullptr);
 }
 
 void WebIDBServerConnection::clearObjectStore(IDBTransactionBackend&, const ClearObjectStoreOperation& operation, std::function<void (PassRefPtr<IDBDatabaseError>)> completionCallback)
@@ -591,7 +591,7 @@ void WebIDBServerConnection::didClearObjectStore(uint64_t requestID, bool succes
     if (!serverRequest)
         return;
 
-    serverRequest->completeRequest(success ? nullptr : IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured clearing object store").ptr());
+    serverRequest->completeRequest(success ? nullptr : &IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured clearing object store").leakRef());
 }
 
 void WebIDBServerConnection::deleteObjectStore(IDBTransactionBackend&, const DeleteObjectStoreOperation& operation, std::function<void (PassRefPtr<IDBDatabaseError>)> completionCallback)
@@ -620,7 +620,7 @@ void WebIDBServerConnection::didDeleteObjectStore(uint64_t requestID, bool succe
     if (!serverRequest)
         return;
 
-    serverRequest->completeRequest(success ? nullptr : IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured deleting object store").ptr());
+    serverRequest->completeRequest(success ? nullptr : &IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured deleting object store").leakRef());
 }
 
 void WebIDBServerConnection::changeDatabaseVersion(IDBTransactionBackend&, const IDBDatabaseBackend::VersionChangeOperation& operation, std::function<void (PassRefPtr<IDBDatabaseError>)> completionCallback)
@@ -649,7 +649,7 @@ void WebIDBServerConnection::didChangeDatabaseVersion(uint64_t requestID, bool s
     if (!serverRequest)
         return;
 
-    serverRequest->completeRequest(success ? nullptr : IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured changing database version").ptr());
+    serverRequest->completeRequest(success ? nullptr : &IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured changing database version").leakRef());
 }
 
 void WebIDBServerConnection::openCursor(IDBTransactionBackend&, const OpenCursorOperation& operation, std::function<void (int64_t, PassRefPtr<IDBKey>, PassRefPtr<IDBKey>, PassRefPtr<SharedBuffer>, PassRefPtr<IDBDatabaseError>)> completionCallback)