Repository navigation
Fatal error in dbm.gdbm #66234
Description
Activity
It is possible to crash Python by breaking opened gdbm database.
>>> import _gdbm as dbm >>> db = dbm.open('x.db', 'n') >>> open('x.db', 'wb').close() >>> db[b'a'] = b'b' gdbm fatal: read error
Proposed patch tries to convert fatal gdbm into regular exception or in Python fatal error (which at least produces traceback).
>>> import _gdbm as dbm >>> db = dbm.open('x.db', 'n') >>> open('x.db', 'wb').close() >>> db[b'a'] = b'b' Traceback (most recent call last): File "<stdin>", line 1, in <module> _gdbm.error: gdbm fatal: read error
- addedextension-modulesC modules in the Modules dirC modules in the Modules dirtype-crashA hard crash of the interpreter, possibly with a core dumpA hard crash of the interpreter, possibly with a core dump
on Jul 22, 2014 Would somebody please review Serhiy's patch.
Oh, Mark, please stop shaking up bug tracker.
I would prefer to avoid setgmp/longjmp, it's kind of a hack. It's maybe more a design issue in the gdbm library to report errors.
I proposed a generic signal handler using setjmp/longjmp to convert SIGSEGV to regular Python exceptions, but it was rejected: issue bpo-3999.
Oh, Mark, please stop shaking up bug tracker.
I agree: please stop posting useless messages, and review patches instead.
The patch for bpo-3999 was rejected because Python internal state may be corrupted when the SIGSEGV signal is raised. This is not the case of this issue. gdbm fatal function is called when Python is in consistent state. So we free to use any Python C-API. But internal state of concrete GDBM_FILE may be corrupted, so we shouldn't use it after handling fatal error. This cause a leak, but I think that a leak with an exception is better than just a crash.
May be different type of exception should be raised. May be we need FatalError that inherits from BaseException.
Other external libraries used by the stdlib also can crash, and perhaps crashes can be converted to exceptions. This issue is only first in the series.
2015-04-01 10:39 GMT+02:00 Serhiy Storchaka <report@bugs.python.org>:
Other external libraries used by the stdlib also can crash, and perhaps crashes can be converted to exceptions. This issue is only first in the series.
I don't think that it's a good practice to try to workaround bugs. IMO
it's better to modify libraries directly to allow users of the library
to handle correctly errors.The issue still exists; I can reproduce it on Python 3.15
$ ./python Python 3.15.0a0 (heads/main:91b48868a8, May 25 2025, 18:45:04) [GCC 15.1.1 20250425] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import _gdbm as dbm >>> db = dbm.open('x.db', 'n') >>> open('x.db', 'wb').close() >>> db[b'a'] = b'b' [1] 163083 bus error (core dumped) ./python
The
fatal_funcparameter is deprecated now, so this way should no longer be used. It is expected that newgdbmversions better handle errors and do not need such function.The tests, added in dbm_gdbm_fatal_error.patch, fail with unpatched code because it raises different exceptions or do not raise exceptions. But they do not crash. The original example still crashes. The difference is that it uses empty database. Changing the tests to use empty database makes them crashing.
We can only hope that crashes will be fixed in upstream.
I have found that using the GDBM_NOMMAP flag prevents these crashes. But it can impact performance and/or memory consumption. I think we cannot expect more.
We can add support for that flag.
Reacted by Victor Stinner and Furkan Onder7 remaining items
Sad. So it doesn't work. Then there's no reason to add this flag.
- addedstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytriagedThe issue has been accepted as valid by a triager.The issue has been accepted as valid by a triager.3.13only security fixesonly security fixes3.14bugs and security fixesbugs and security fixes3.15bugs and security fixesbugs and security fixes
on Aug 17, 2025 - added a commit that references this issue
on Sep 20, 2025 - moved this from In Progress to Done in dbm and shelve issues
on Sep 20, 2025
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsDone
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
Linked PRs