Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 9cfacd819f89639031bcef018ee6955f0824a95f
      
https://github.com/WebKit/WebKit/commit/9cfacd819f89639031bcef018ee6955f0824a95f
  Author: Rupin Mittal <[email protected]>
  Date:   2024-10-30 (Wed, 30 Oct 2024)

  Changed paths:
    M Source/WebCore/platform/sql/SQLiteStatement.h
    M Source/WebCore/platform/sql/SQLiteStatementAutoResetScope.cpp
    M Source/WebCore/platform/sql/SQLiteStatementAutoResetScope.h
    M Source/WebKit/NetworkProcess/storage/SQLiteStorageArea.cpp

  Log Message:
  -----------
  Ensure SQLiteStorageArea does not use SQLiteStatement after it's been freed
https://bugs.webkit.org/show_bug.cgi?id=278538
rdar://127866416

Reviewed by Chris Dumez, Geoffrey Garen, and Sihui Liu.

SQLiteStorageArea::getItemFromDatabase() holds a SQLiteStatementAutoResetScope
statement variable. This goes out of scope at the end of getItemFromDatabase()
and so it's destructor is called. There is a crash occurring here. It turns out
that SQLiteStatementAutoResetScope holds a raw pointer to a SQLiteStatement.
A series of function calls: getItemFromDatabase() -> 
handleDatabaseErrorIfNeeded()
-> close() results in this SQLiteStatement object being destroyed
(SQLiteStorageArea holds a unique pointer to this SQLiteStatement object which 
is
destroyed in close()). After this destruction, the SQLiteStatementAutoResetScope
statement variable goes out of scope and it's destructor attempts to access the
raw pointer to the now-destroyed SQLiteStatement object. This use-after-free
causes the crash.

We fix this problem by using a block-scope to ensure the 
SQLiteStatementAutoResetScope
statement variable is destroyed before handleDatabaseErrorIfNeeded() is called. 
Although
the crash was only in getItemFromDatabase(), there are other functions in 
SQLiteStorageArea
that follow this same pattern and could potentially have a use-after-free. We 
make this
block-scope change there as well. Additionally, we change the SQLiteStatement 
raw pointer
in SQLiteStatementAutoResetScope to a CheckedPtr.

We use a block-scope rather than declare a new function 
SQLiteStatementAutoResetScope that
could call reset on the SQLiteStatement object because we want the object to 
live and be
reset in sync with the scope's lifetime.

* Source/WebCore/platform/sql/SQLiteStatement.h:
* Source/WebCore/platform/sql/SQLiteStatementAutoResetScope.cpp:
(WebCore::SQLiteStatementAutoResetScope::operator=): Deleted.
* Source/WebCore/platform/sql/SQLiteStatementAutoResetScope.h:
(WebCore::SQLiteStatementAutoResetScope::operator bool const):
(WebCore::SQLiteStatementAutoResetScope::get):
(WebCore::SQLiteStatementAutoResetScope::operator->):
* Source/WebKit/NetworkProcess/storage/SQLiteStorageArea.cpp:
(WebKit::SQLiteStorageArea::getItemFromDatabase):
(WebKit::SQLiteStorageArea::allItems):
(WebKit::SQLiteStorageArea::setItem):
(WebKit::SQLiteStorageArea::removeItem):
(WebKit::SQLiteStorageArea::clear):

Originally-landed-as: 280938.269@safari-7619-branch (d76a8be1ba40). 
rdar://138875969
Canonical link: https://commits.webkit.org/285939@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to