Skip to content

sqlite3: some code paths ignore exceptions #108083

Description

@erlend-aasland

Originally posted by @vstinner in #108015 (comment):

Ignoring the exception here is a bug.

connection_finalize() clears any exception with PyErr_SetRaisedException(), but pysqlite_connection_close_impl() must not ignore silently error, since here we are talking about a raised Python exception! The function must report if an exception was raised. Then the caller is free to ignore it or not.

I suggest to continue ignoring it in finalize, but then write a separated PR to log the "unraisable exception".

Linked PRs

Activity

  1. added
    type-bugAn unexpected behavior, bug, or error
    3.11only security fixes
    3.12only security fixes
    3.13only security fixes
    on Aug 17, 2023
  2. added a commit that references this issue on Aug 17, 2023
  3. serhiy-storchaka commented on Aug 18, 2023

    @serhiy-storchaka
    Member

    I have not found a test for failing Connection.close(). Would it be possible to write one? Maybe in a separate issue.

  4. added 2 commits that reference this issue on Aug 18, 2023
  5. erlend-aasland commented on Aug 19, 2023

    @erlend-aasland
    ContributorAuthor

    I have not found a test for failing Connection.close(). Would it be possible to write one? Maybe in a separate issue.

    It should be possible to force the implicit ROLLBACK in .close() to fail using some kind of database lock trick. Perhaps we could use a similar trick as in test_ctx_mgr_rollback_if_commit_failed.

  6. added a commit that references this issue on Aug 19, 2023
  7. erlend-aasland commented on Aug 23, 2023

    @erlend-aasland
    ContributorAuthor

    Keeping this open until tests are added.

  8. serhiy-storchaka commented on Aug 23, 2023

    @serhiy-storchaka
    Member

    sqlite3_close() can be made failing in many ways, but sqlite3_close_v2() tries hard to return SQLITE_OK, so it may be not so easy to provoke a failure.

    https://www.sqlite.org/c3ref/close.html

  9. erlend-aasland commented on Aug 23, 2023

    @erlend-aasland
    ContributorAuthor

    Yes, sqlite3_close_v2() returns SQLITE_OK if it is given a valid database handle.
    sqlite3_close can return an error, but it is hard to see how to be able to trigger that from the constructor; I'm not sure it is possible. We could just as well use sqlite3_close_v2() in the constructor.

  10. vstinner commented on Aug 23, 2023

    @vstinner
    Member

    If closing a connection can fail but the sqlite3_close_v2() ignores errors, is there another API to "flush" a connection and reports errors?

    If there is no easy way to trigger an error at exit or to report it, I suggest to just give up and close the issue.

  11. erlend-aasland commented on Aug 24, 2023

    @erlend-aasland
    ContributorAuthor

    If there is no easy way to trigger an error at exit or to report it, I suggest to just give up and close the issue.

    I don't think there is; the case is the constructor, between the sqlite3_open_v2 call and the following four goto error jumps. I don't see how we can provoke an error there.

    Closing this as resolved.

  12. vstinner commented on Aug 24, 2023

    @vstinner
    Member

    Thanks, nice sqlite3 enhancement! Ignoring exceptions silently is never a good idea.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

3.11only security fixes3.12only security fixes3.13only security fixestopic-sqlite3type-bugAn unexpected behavior, bug, or error

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions