This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Crash calling sqlite3_close with invalid pointer
Type: crash Stage: test needed
Components: Extension Modules, Library (Lib) Versions: Python 3.6, Python 3.5
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: serhiy.storchaka Nosy List: erlendaasland, ghaering, scorp, serhiy.storchaka
Priority: normal Keywords: patch

Created on 2016-02-18 17:59 by scorp, last changed 2022-04-11 14:58 by admin.

Files
File name Uploaded Description Edit
sqlite_connection.c.patch scorp, 2016-02-18 17:59 Bugfix patch
sqlite_connection.c.patch scorp, 2016-02-19 10:54 Next patch
Messages (9)
msg260472 - (view) Author: Filipp Andjelo (scorp) Date: 2016-02-18 17:59
Race condition in sqlite close/dealloc crashes the application with double free(). The pointer is set to NULL outside of mutexed zone, so if close and dealloc follow each other very shortly application crashes. Please see the attached patch.
msg260516 - (view) Author: Filipp Andjelo (scorp) Date: 2016-02-19 10:54
Hm, this is strange, because close() can only be called from the same thread and dealloc() can be called only if reference count is 0, right? So why is there a mutex again each other anyway? And how can that be, that sqlite3_close() is called multiple times with the same pointer? We are getting a crash, which is only possible if dealloc() is called where close() is not yet done. Is this possible? Or do I understand something wrong? For such cases we also have to set database pointer to NULL in dealloc(), but it looks like the problem is somewhere different, the whole code looks strange for me.
msg260663 - (view) Author: Filipp Andjelo (scorp) Date: 2016-02-22 09:16
Ok, the race condition seems not to be the real problem, since the patches didn't help. Don't want to do any assumptions anymore, but it seems like the python objects memory is deallocated before the sqlite connection was closed. The thing is, that this problem appears only on very heavy load with 40 parallel python processes and overall memory consumption of more than 240GiB. This high number is due to deactivated GC on our side, due to performance problems, we call it once the complete work is done. Unfortunately, I can't reproduce this error in "small", but here is the crash report (the crash comes from different parts of free(), sometimes with double free, sometimes invalid pointer or similar):

*** glibc detected *** /share/nds-buildtools/python/python-3.4.2-64_5/bin/python: free(): invalid next size (normal): 0x00000000058b72b0 ***
======= Backtrace: =========
/lib64/libc.so.6[0x36e6275f4e]
/lib64/libc.so.6[0x36e6278cf0]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(+0x23918)[0x7f785100a918]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(sqlite3_free+0x63)[0x7f785100b6b6]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(+0x3193d)[0x7f785101893d]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(+0x31a93)[0x7f7851018a93]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(+0x31e6d)[0x7f7851018e6d]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(+0x32735)[0x7f7851019735]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(+0x3115d)[0x7f785101815d]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(+0x3119e)[0x7f785101819e]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(+0x33df2)[0x7f785101adf2]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(+0x36441)[0x7f785101d441]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(+0x40e21)[0x7f7851027e21]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(+0xbbddf)[0x7f78510a2ddf]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(+0xbbcff)[0x7f78510a2cff]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(sqlite3_close+0x1d)[0x7f78510a2d23]
/share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so(pysqlite_connection_close+0x79)[0x7f7851002af9]
/share/nds-buildtools/python/python-3.4.2-64_5/bin/python(PyEval_EvalFrameEx+0x64e3)[0x4c52e3]
/share/nds-buildtools/python/python-3.4.2-64_5/bin/python(PyEval_EvalFrameEx+0x6e38)[0x4c5c38]
/share/nds-buildtools/python/python-3.4.2-64_5/bin/python(PyEval_EvalFrameEx+0x6e38)[0x4c5c38]
/share/nds-buildtools/python/python-3.4.2-64_5/bin/python(PyEval_EvalFrameEx+0x6e38)[0x4c5c38]
/share/nds-buildtools/python/python-3.4.2-64_5/bin/python(PyEval_EvalFrameEx+0x6e38)[0x4c5c38]
/share/nds-buildtools/python/python-3.4.2-64_5/bin/python(PyEval_EvalFrameEx+0x6e38)[0x4c5c38]
/share/nds-buildtools/python/python-3.4.2-64_5/bin/python(PyEval_EvalCodeEx+0x8a7)[0x4c72a7]
/share/nds-buildtools/python/python-3.4.2-64_5/bin/python(PyEval_EvalCode+0x3b)[0x4c736b]
/share/nds-buildtools/python/python-3.4.2-64_5/bin/python[0x4e7c61]
/share/nds-buildtools/python/python-3.4.2-64_5/bin/python(PyRun_FileExFlags+0x115)[0x4e9a85]
/share/nds-buildtools/python/python-3.4.2-64_5/bin/python(PyRun_SimpleFileExFlags+0xfa)[0x4eb2ea]
/share/nds-buildtools/python/python-3.4.2-64_5/bin/python(Py_Main+0xa74)[0x41d8e4]
/share/nds-buildtools/python/python-3.4.2-64_5/bin/python(main+0x155)[0x41a465]
/lib64/libc.so.6(__libc_start_main+0xfd)[0x36e621ed5d]
/share/nds-buildtools/python/python-3.4.2-64_5/bin/python[0x41a249]
======= Memory map: ========
00400000-005fe000 r-xp 00000000 00:1a 491451                             /share/nds-buildtools/python/python-3.4.2-64_5/bin/python3.4
007fd000-00857000 rw-p 001fd000 00:1a 491451                             /share/nds-buildtools/python/python-3.4.2-64_5/bin/python3.4
00857000-00872000 rw-p 00000000 00:00 0 
00c84000-0dd92000 rw-p 00000000 00:00 0                                  [heap]
36e5e00000-36e5e20000 r-xp 00000000 fd:00 2964                           /lib64/ld-2.12.so
36e601f000-36e6020000 r--p 0001f000 fd:00 2964                           /lib64/ld-2.12.so
36e6020000-36e6021000 rw-p 00020000 fd:00 2964                           /lib64/ld-2.12.so
36e6021000-36e6022000 rw-p 00000000 00:00 0 
36e6200000-36e638a000 r-xp 00000000 fd:00 3884                           /lib64/libc-2.12.so
36e638a000-36e658a000 ---p 0018a000 fd:00 3884                           /lib64/libc-2.12.so
36e658a000-36e658e000 r--p 0018a000 fd:00 3884                           /lib64/libc-2.12.so
36e658e000-36e658f000 rw-p 0018e000 fd:00 3884                           /lib64/libc-2.12.so
36e658f000-36e6594000 rw-p 00000000 00:00 0 
36e6600000-36e6602000 r-xp 00000000 fd:00 4585                           /lib64/libdl-2.12.so
36e6602000-36e6802000 ---p 00002000 fd:00 4585                           /lib64/libdl-2.12.so
36e6802000-36e6803000 r--p 00002000 fd:00 4585                           /lib64/libdl-2.12.so
36e6803000-36e6804000 rw-p 00003000 fd:00 4585                           /lib64/libdl-2.12.so
36e6a00000-36e6a17000 r-xp 00000000 fd:00 3891                           /lib64/libpthread-2.12.so
36e6a17000-36e6c17000 ---p 00017000 fd:00 3891                           /lib64/libpthread-2.12.so
36e6c17000-36e6c18000 r--p 00017000 fd:00 3891                           /lib64/libpthread-2.12.so
36e6c18000-36e6c19000 rw-p 00018000 fd:00 3891                           /lib64/libpthread-2.12.so
36e6c19000-36e6c1d000 rw-p 00000000 00:00 0 
36e6e00000-36e6e15000 r-xp 00000000 fd:00 8884                           /lib64/libz.so.1.2.3
36e6e15000-36e7014000 ---p 00015000 fd:00 8884                           /lib64/libz.so.1.2.3
36e7014000-36e7015000 r--p 00014000 fd:00 8884                           /lib64/libz.so.1.2.3
36e7015000-36e7016000 rw-p 00015000 fd:00 8884                           /lib64/libz.so.1.2.3
36e7200000-36e7207000 r-xp 00000000 fd:00 7022                           /lib64/librt-2.12.so
36e7207000-36e7406000 ---p 00007000 fd:00 7022                           /lib64/librt-2.12.so
36e7406000-36e7407000 r--p 00006000 fd:00 7022                           /lib64/librt-2.12.so
36e7407000-36e7408000 rw-p 00007000 fd:00 7022                           /lib64/librt-2.12.so
36e7600000-36e7683000 r-xp 00000000 fd:00 10439                          /lib64/libm-2.12.so
36e7683000-36e7882000 ---p 00083000 fd:00 10439                          /lib64/libm-2.12.so
36e7882000-36e7883000 r--p 00082000 fd:00 10439                          /lib64/libm-2.12.so
36e7883000-36e7884000 rw-p 00083000 fd:00 10439                          /lib64/libm-2.12.so
36e7a00000-36e7a1d000 r-xp 00000000 fd:00 5374                           /lib64/libselinux.so.1
36e7a1d000-36e7c1c000 ---p 0001d000 fd:00 5374                           /lib64/libselinux.so.1
36e7c1c000-36e7c1d000 r--p 0001c000 fd:00 5374                           /lib64/libselinux.so.1
36e7c1d000-36e7c1e000 rw-p 0001d000 fd:00 5374                           /lib64/libselinux.so.1
36e7c1e000-36e7c1f000 rw-p 00000000 00:00 0 
36e8200000-36e8216000 r-xp 00000000 fd:00 5071                           /lib64/libresolv-2.12.so
36e8216000-36e8416000 ---p 00016000 fd:00 5071                           /lib64/libresolv-2.12.so
36e8416000-36e8417000 r--p 00016000 fd:00 5071                           /lib64/libresolv-2.12.so
36e8417000-36e8418000 rw-p 00017000 fd:00 5071                           /lib64/libresolv-2.12.so
36e8418000-36e841a000 rw-p 00000000 00:00 0 
36e8600000-36e8616000 r-xp 00000000 fd:00 10440                          /lib64/libgcc_s-4.4.7-20120601.so.1
36e8616000-36e8815000 ---p 00016000 fd:00 10440                          /lib64/libgcc_s-4.4.7-20120601.so.1
36e8815000-36e8816000 rw-p 00015000 fd:00 10440                          /lib64/libgcc_s-4.4.7-20120601.so.1
36e8e00000-36e8e02000 r-xp 00000000 fd:00 18011                          /lib64/libutil-2.12.so
36e8e02000-36e9001000 ---p 00002000 fd:00 18011                          /lib64/libutil-2.12.so
36e9001000-36e9002000 r--p 00001000 fd:00 18011                          /lib64/libutil-2.12.so
36e9002000-36e9003000 rw-p 00002000 fd:00 18011                          /lib64/libutil-2.12.so
36ea600000-36ea602000 r-xp 00000000 fd:00 5005                           /lib64/libkeyutils.so.1.3
36ea602000-36ea801000 ---p 00002000 fd:00 5005                           /lib64/libkeyutils.so.1.3
36ea801000-36ea802000 r--p 00001000 fd:00 5005                           /lib64/libkeyutils.so.1.3
36ea802000-36ea803000 rw-p 00002000 fd:00 5005                           /lib64/libkeyutils.so.1.3
36eaa00000-36eaa03000 r-xp 00000000 fd:00 6725                           /lib64/libcom_err.so.2.1
36eaa03000-36eac02000 ---p 00003000 fd:00 6725                           /lib64/libcom_err.so.2.1
36eac02000-36eac03000 r--p 00002000 fd:00 6725                           /lib64/libcom_err.so.2.1
36eac03000-36eac04000 rw-p 00003000 fd:00 6725                           /lib64/libcom_err.so.2.1
36eb200000-36eb3b9000 r-xp 00000000 fd:00 9400                           /usr/lib64/libcrypto.so.1.0.1e
36eb3b9000-36eb5b8000 ---p 001b9000 fd:00 9400                           /usr/lib64/libcrypto.so.1.0.1e
36eb5b8000-36eb5d3000 r--p 001b8000 fd:00 9400                           /usr/lib64/libcrypto.so.1.0.1e
36eb5d3000-36eb5df000 rw-p 001d3000 fd:00 9400                           /usr/lib64/libcrypto.so.1.0.1e
36eb5df000-36eb5e3000 rw-p 00000000 00:00 0 
36eb600000-36eb641000 r-xp 00000000 fd:00 6869                           /lib64/libgssapi_krb5.so.2.2
36eb641000-36eb841000 ---p 00041000 fd:00 6869                           /lib64/libgssapi_krb5.so.2.2
36eb841000-36eb842000 r--p 00041000 fd:00 6869                           /lib64/libgssapi_krb5.so.2.2
36eb842000-36eb844000 rw-p 00042000 fd:00 6869                           /lib64/libgssapi_krb5.so.2.2
36ec600000-36ec60a000 r-xp 00000000 fd:00 5394                           /lib64/libkrb5support.so.0.1
36ec60a000-36ec809000 ---p 0000a000 fd:00 5394                           /lib64/libkrb5support.so.0.1
36ec809000-36ec80a000 r--p 00009000 fd:00 5394                           /lib64/libkrb5support.so.0.1
36ec80a000-36ec80b000 rw-p 0000a000 fd:00 5394                           /lib64/libkrb5support.so.0.1
36eca00000-36eca29000 r-xp 00000000 fd:00 5413                           /lib64/libk5crypto.so.3.1
36eca29000-36ecc29000 ---p 00029000 fd:00 5413                           /lib64/libk5crypto.so.3.1
36ecc29000-36ecc2a000 r--p 00029000 fd:00 5413                           /lib64/libk5crypto.so.3.1
36ecc2a000-36ecc2b000 rw-p 0002a000 fd:00 5413                           /lib64/libk5crypto.so.3.1
36ecc2b000-36ecc2c000 rw-p 00000000 00:00 0 
36ece00000-36ecedb000 r-xp 00000000 fd:00 6862                           /lib64/libkrb5.so.3.3
36ecedb000-36ed0db000 ---p 000db000 fd:00 6862                           /lib64/libkrb5.so.3.3
36ed0db000-36ed0e5000 r--p 000db000 fd:00 6862                           /lib64/libkrb5.so.3.3
36ed0e5000-36ed0e7000 rw-p 000e5000 fd:00 6862                           /lib64/libkrb5.so.3.3
36ede00000-36ede62000 r-xp 00000000 fd:00 22840                          /usr/lib64/libssl.so.1.0.1e
36ede62000-36ee061000 ---p 00062000 fd:00 22840                          /usr/lib64/libssl.so.1.0.1e
36ee061000-36ee065000 r--p 00061000 fd:00 22840                          /usr/lib64/libssl.so.1.0.1e
36ee065000-36ee06c000 rw-p 00065000 fd:00 22840                          /usr/lib64/libssl.so.1.0.1e
7f783c000000-7f783c021000 rw-p 00000000 00:00 0 
7f783c021000-7f7840000000 ---p 00000000 00:00 0 
7f7842d72000-7f7842db2000 rw-p 00000000 00:00 0 
7f7842f72000-7f7842fb2000 rw-p 00000000 00:00 0 
7f78441b2000-7f7844232000 rw-p 00000000 00:00 0 
7f7846573000-7f78465f3000 rw-p 00000000 00:00 0 
7f7846873000-7f78468b3000 rw-p 00000000 00:00 0 
7f7847033000-7f7847073000 rw-p 00000000 00:00 0 
7f7847673000-7f78476b3000 rw-p 00000000 00:00 0 
7f7847bb4000-7f7847bf4000 rw-p 00000000 00:00 0 
7f7848974000-7f78489b4000 rw-p 00000000 00:00 0 
7f7849134000-7f7849174000 rw-p 00000000 00:00 0 
7f7849234000-7f7849274000 rw-p 00000000 00:00 0 
7f784a6f5000-7f784a775000 rw-p 00000000 00:00 0 
7f784a7b5000-7f784a835000 rw-p 00000000 00:00 0 
7f784acb5000-7f784acf5000 rw-p 00000000 00:00 0 
7f784ae35000-7f784ae75000 rw-p 00000000 00:00 0 
7f784bcb6000-7f784bcf6000 rw-p 00000000 00:00 0 
7f784bd36000-7f784bd76000 rw-p 00000000 00:00 0 
7f784c976000-7f784c9b6000 rw-p 00000000 00:00 0 
7f784c9f6000-7f784ca36000 rw-p 00000000 00:00 0 
7f784cd77000-7f784cdf7000 rw-p 00000000 00:00 0 
7f784d9c5000-7f784da05000 rw-p 00000000 00:00 0 
7f784dd45000-7f784dd85000 rw-p 00000000 00:00 0 
7f784dfc5000-7f784e005000 rw-p 00000000 00:00 0 
7f784e345000-7f784e385000 rw-p 00000000 00:00 0 
7f784e8c5000-7f784e905000 rw-p 00000000 00:00 0 
7f784ea46000-7f784ea86000 rw-p 00000000 00:00 0 
7f784ebc6000-7f784ec06000 rw-p 00000000 00:00 0 
7f784ed86000-7f784edc6000 rw-p 00000000 00:00 0 
7f784f486000-7f784f4c6000 rw-p 00000000 00:00 0 
7f784f546000-7f784f586000 rw-p 00000000 00:00 0 
7f784f646000-7f784f686000 rw-p 00000000 00:00 0 
7f784f805000-7f7850906000 rw-p 00000000 00:00 0 
7f7850906000-7f785091d000 r-xp 00000000 00:1a 484827                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_pickle.cpython-34m.so
7f785091d000-7f7850b1c000 ---p 00017000 00:1a 484827                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_pickle.cpython-34m.so
7f7850b1c000-7f7850b20000 rw-p 00016000 00:1a 484827                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_pickle.cpython-34m.so
7f7850b20000-7f7850d61000 rw-p 00000000 00:00 0 
7f7850d61000-7f7850d66000 r-xp 00000000 00:1a 484828                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_hashlib.cpython-34m.so
7f7850d66000-7f7850f66000 ---p 00005000 00:1a 484828                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_hashlib.cpython-34m.so
7f7850f66000-7f7850f67000 rw-p 00005000 00:1a 484828                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_hashlib.cpython-34m.so
7f7850f67000-7f7850fe7000 rw-p 00000000 00:00 0 
7f7850fe7000-7f785113d000 r-xp 00000000 00:1a 484839                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so
7f785113d000-7f785133c000 ---p 00156000 00:1a 484839                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so
7f785133c000-7f7851345000 rw-p 00155000 00:1a 484839                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_sqlite3.cpython-34m.so
7f7851345000-7f7851346000 rw-p 00000000 00:00 0 
7f7851346000-7f785135f000 r-xp 00000000 00:1a 484811                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/zlib.cpython-34m.so
7f785135f000-7f785155f000 ---p 00019000 00:1a 484811                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/zlib.cpython-34m.so
7f785155f000-7f7851561000 rw-p 00019000 00:1a 484811                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/zlib.cpython-34m.so
7f7851561000-7f7851569000 r-xp 00000000 00:1a 484837                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/binascii.cpython-34m.so
7f7851569000-7f7851768000 ---p 00008000 00:1a 484837                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/binascii.cpython-34m.so
7f7851768000-7f7851769000 rw-p 00007000 00:1a 484837                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/binascii.cpython-34m.so
7f7851769000-7f78517a9000 rw-p 00000000 00:00 0 
7f78517a9000-7f78517ab000 r-xp 00000000 00:1a 484815                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/grp.cpython-34m.so
7f78517ab000-7f78519ab000 ---p 00002000 00:1a 484815                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/grp.cpython-34m.so
7f78519ab000-7f78519ac000 rw-p 00002000 00:1a 484815                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/grp.cpython-34m.so
7f78519ac000-7f78519ec000 rw-p 00000000 00:00 0 
7f78519ec000-7f7851a21000 r-xp 00000000 00:1a 484822                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/pyexpat.cpython-34m.so
7f7851a21000-7f7851c20000 ---p 00035000 00:1a 484822                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/pyexpat.cpython-34m.so
7f7851c20000-7f7851c24000 rw-p 00034000 00:1a 484822                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/pyexpat.cpython-34m.so
7f7851c24000-7f7851c31000 r-xp 00000000 00:1a 484847                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_elementtree.cpython-34m.so
7f7851c31000-7f7851e30000 ---p 0000d000 00:1a 484847                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_elementtree.cpython-34m.so
7f7851e30000-7f7851e32000 rw-p 0000c000 00:1a 484847                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_elementtree.cpython-34m.so
7f7851e32000-7f7852172000 rw-p 00000000 00:00 0 
7f78521a6000-7f78523e6000 rw-p 00000000 00:00 0 
7f78523e6000-7f78523ee000 r-xp 00000000 00:1a 484843                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_struct.cpython-34m.so
7f78523ee000-7f78525ed000 ---p 00008000 00:1a 484843                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_struct.cpython-34m.so
7f78525ed000-7f78525f0000 rw-p 00007000 00:1a 484843                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_struct.cpython-34m.so
7f78525f0000-7f7852670000 rw-p 00000000 00:00 0 
7f7852670000-7f7852681000 r-xp 00000000 00:1a 484823                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_datetime.cpython-34m.so
7f7852681000-7f7852881000 ---p 00011000 00:1a 484823                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_datetime.cpython-34m.so
7f7852881000-7f7852884000 rw-p 00011000 00:1a 484823                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_datetime.cpython-34m.so
7f7852884000-7f785288c000 r-xp 00000000 00:1a 484797                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/math.cpython-34m.so
7f785288c000-7f7852a8c000 ---p 00008000 00:1a 484797                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/math.cpython-34m.so
7f7852a8c000-7f7852a8e000 rw-p 00008000 00:1a 484797                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/math.cpython-34m.so
7f7852a8e000-7f7852ace000 rw-p 00000000 00:00 0 
7f7852ace000-7f7852acf000 r-xp 00000000 00:1a 484830                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_opcode.cpython-34m.so
7f7852acf000-7f7852cce000 ---p 00001000 00:1a 484830                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_opcode.cpython-34m.so
7f7852cce000-7f7852ccf000 rw-p 00000000 00:1a 484830                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_opcode.cpython-34m.so
7f7852ccf000-7f7852d4f000 rw-p 00000000 00:00 0 
7f7852d4f000-7f7852d5e000 r-xp 00000000 00:1a 484792                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_socket.cpython-34m.so
7f7852d5e000-7f7852f5e000 ---p 0000f000 00:1a 484792                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_socket.cpython-34m.so
7f7852f5e000-7f7852f63000 rw-p 0000f000 00:1a 484792                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_socket.cpython-34m.so
7f7852f63000-7f7852f66000 r-xp 00000000 00:1a 484846                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_heapq.cpython-34m.so
7f7852f66000-7f7853165000 ---p 00003000 00:1a 484846                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_heapq.cpython-34m.so
7f7853165000-7f7853168000 rw-p 00002000 00:1a 484846                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/_heapq.cpython-34m.so
7f7853168000-7f785316d000 r-xp 00000000 00:1a 484819                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/time.cpython-34m.so
7f785316d000-7f785336c000 ---p 00005000 00:1a 484819                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/time.cpython-34m.so
7f785336c000-7f785336f000 rw-p 00004000 00:1a 484819                     /share/nds-buildtools/python/python-3.4.2-64_5/lib/python3.4/lib-dynload/time.cpython-34m.so
7f785336f000-7f78533af000 rw-p 00000000 00:00 0 
7f78533b0000-7f7853470000 rw-p 00000000 00:00 0 
7f78534a1000-7f78535e1000 rw-p 00000000 00:00 0 
7f78535e1000-7f7859472000 r--p 00000000 fd:00 34413                      /usr/lib/locale/locale-archive
7f7859472000-7f7859476000 rw-p 00000000 00:00 0 
7f785947d000-7f7859484000 r--s 00000000 fd:00 152113                     /usr/lib64/gconv/gconv-modules.cache
7f7859484000-7f7859485000 rw-p 00000000 00:00 0 
7ffea445d000-7ffea447c000 rw-p 00000000 00:00 0                          [stack]
7ffea44bc000-7ffea44bd000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
msg261359 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2016-03-08 13:56
Could you please provide a test Filipp?
msg261363 - (view) Author: Filipp Andjelo (scorp) Date: 2016-03-08 14:37
Hi Serhiy,

unfortunately not, we have one heavy application which is crashing with the given error non deterministically after about 25 hours of running on 40 CPUs with 280GiB memory (!) in use. We already made all kind of test to get it reproducible "in a small", but it just doesn't crash. If I have more information, I'll post it here.
msg261367 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2016-03-08 17:13
This may be similar to issue26494.

As for the patch, _pysqlite_seterror() shouldn't be called when GIL is released. And setting self->db not guarded with GIL looks dangerous.
msg261411 - (view) Author: Filipp Andjelo (scorp) Date: 2016-03-09 10:43
The issue26494 seems really suspicious, could be our case. And regarding my patch, nice to know, you are the same opinion. However, the code there is looking very strange. I really don't understand, why there are mutex guards anyway, since close() can only be called from one thread (there is a check) and dealloc() can only be called, when the object is not in use anymore.
msg404177 - (view) Author: Erlend E. Aasland (erlendaasland) * (Python triager) Date: 2021-10-18 11:40
FYI: We've been using sqlite3_close_v2(), when available, since 2017 (see 86a670543ff97d52fd9b8ca0477f8b6d27ee946d), but we now call it with GIL held.

I'm leaning towards closing this as out-of-date. There is no reproducer, there has been no more similar bug reports, and there has been no activity on this issue.


Possible improvement of connection_close():
  1. save database pointer to temporary variable
  2. clear self->db
  3. call sqlite3_close_v2() (without holding GIL)

diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c
index d6d1fa8bf2..47c0267e89 100644
--- a/Modules/_sqlite/connection.c
+++ b/Modules/_sqlite/connection.c
@@ -301,9 +301,12 @@ static void
 connection_close(pysqlite_Connection *self)
 {
     if (self->db) {
-        int rc = sqlite3_close_v2(self->db);
-        assert(rc == SQLITE_OK), (void)rc;
+        sqlite *db = self->db;
         self->db = NULL;
+        Py_BEGIN_ALLOW_THREADS
+        int rc = sqlite3_close_v2(db);
+        assert(rc == SQLITE_OK), (void)rc;
+        Py_END_ALLOW_THREADS
     }
 }
 }
msg404178 - (view) Author: Erlend E. Aasland (erlendaasland) * (Python triager) Date: 2021-10-18 11:42
From https://sqlite.org/c3ref/close.html:

  If sqlite3_close_v2() is called with unfinalized prepared statements,
  unclosed BLOB handlers, and/or unfinished sqlite3_backups, it returns
  SQLITE_OK regardless, but instead of deallocating the database connection
  immediately, it marks the database connection as an unusable "zombie" and
  makes arrangements to automatically deallocate the database connection after
  all prepared statements are finalized, all BLOB handles are closed, and all
  backups have finished. The sqlite3_close_v2() interface is intended for use
  with host languages that are garbage collected, and where the order in which
  destructors are called is arbitrary.


Also:

  Calling sqlite3_close() or sqlite3_close_v2() with a NULL pointer argument
  is a harmless no-op.
History
Date User Action Args
2022-04-11 14:58:27adminsetgithub: 70575
2021-10-18 11:42:47erlendaaslandsetmessages: + msg404178
2021-10-18 11:40:57erlendaaslandsetnosy: + erlendaasland
messages: + msg404177
2016-03-09 10:43:00scorpsetmessages: + msg261411
2016-03-08 17:13:16serhiy.storchakasetmessages: + msg261367
2016-03-08 14:37:28scorpsetmessages: + msg261363
2016-03-08 13:56:11serhiy.storchakasetmessages: + msg261359
2016-02-24 12:16:33serhiy.storchakasetstage: test needed
versions: - Python 3.4
2016-02-24 12:11:37serhiy.storchakasetassignee: serhiy.storchaka

nosy: + serhiy.storchaka
2016-02-22 09:16:18scorpsetmessages: + msg260663
title: Race condition in sqlite module -> Crash calling sqlite3_close with invalid pointer
2016-02-19 10:54:25scorpsetfiles: + sqlite_connection.c.patch

messages: + msg260516
2016-02-18 18:03:53SilentGhostsetnosy: + ghaering

components: + Extension Modules
versions: - Python 3.2, Python 3.3
2016-02-18 17:59:33scorpcreate