You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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:
assignee=Noneclosed_at=Nonecreated_at=<Date2017-05-17.16:03:55.042>labels= ['OS-mac', 'type-bug', 'library']
title="ndbm can't iterate through values on OS X"updated_at=<Date2020-11-27.11:32:30.539>user='https://bugs.python.org/ForestGregg'
On Mac OS 10.12.4, a large shelve, backed by ndbm, can be created. But when I attempt to iterate through the values of the shelve it raises this exception:
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/dedupe/api.py", line 281, in _blockData
for block in viewvalues(blocks):
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/collections_abc.py", line 693, in __iter_
for key in self._mapping:
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/shelve.py", line 95, in __iter__
for k in self.dict.keys():
SystemError: Negative size passed to PyBytes_FromStringAndSize
I've confirmed that this works with Python 3.6.1. All the Python versions were installed from homebrew.
I cannot reproduce on linux on windows machines. I've attached a zip file of the ndbm files that python created.
Can you provide a complete example of how to reproduce the behavior you are seeing? Ideally, it would include producing the shelve object. Also, please provide the output of this command:
/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload/_dbm.cpython-35m-darwin.so:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0,
current version 125.2.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version
125.2.0)
ForestGregg commented on Jun 9, 2017
ForestGreggmannequin
MannequinAuthor
More actions
A different user:
otool -L $(python3.6 -c 'import _dbm;print(_dbm.file)')
/usr/local/var/pyenv/versions/3.6.1/lib/python3.6/lib-dynload/_dbm.cpython-36m-darwin.so:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.50.2)
I've attached a C program that demonstrates the problem, and have filed an issue with Apple about this: FB8919203
It is not clear to me what we can do about this, other than not building the ndbm binding on macOS. The manpages for the ndbm APIs do not mention limitations on item sizes, and the dbopen manpage mention that there a no limitations on item sizes).
Activity
ForestGregg commentedon May 17, 2017
On Mac OS 10.12.4, a large shelve, backed by ndbm, can be created. But when I attempt to iterate through the values of the shelve it raises this exception:
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/dedupe/api.py", line 281, in _blockData
for block in viewvalues(blocks):
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/collections_abc.py", line 693, in __iter_
for key in self._mapping:
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/shelve.py", line 95, in __iter__
for k in self.dict.keys():
SystemError: Negative size passed to PyBytes_FromStringAndSize
I've confirmed that this works with Python 3.6.1. All the Python versions were installed from homebrew.
I cannot reproduce on linux on windows machines. I've attached a zip file of the ndbm files that python created.
ForestGregg commentedon May 18, 2017
The ndbm db's two files (in the attachment) have the following size
tmp___otctx 0 bytes
tmp___otctx.db 12857344 bytes
terryjreedy commentedon May 19, 2017
Do you mean that on OSX, you code works with 3.6.1 and fails with 3.5.3?
ForestGregg commentedon May 19, 2017
Very sorry for the ambiguity.
The bug appears for both python 3.5 and python 3.6.1 on OS X. I have not tried other versions of python on OS X.
ned-deily commentedon May 20, 2017
Can you provide a complete example of how to reproduce the behavior you are seeing? Ideally, it would include producing the shelve object. Also, please provide the output of this command:
otool -L $(python3.6 -c 'import _dbm;print(dbm.__file_)')
ForestGregg commentedon Jun 5, 2017
I have been trying to make a small reproducible example, but haven't been able to isolate it.
Running this script [1] csv_example on mac os x under either py27 or py3 does seem *often* cause this problem [2], [3]:
[1] https://github.com/dedupeio/dedupe-examples/blob/master/csv_example/csv_example.py
[2] dedupeio/dedupe#571
[3] dedupeio/dedupe-examples#54
ned-deily commentedon Jun 5, 2017
It would be helpful if you could provide the output of this command:
otool -L $(python3.6 -c 'import _dbm;print(dbm.__file_)')
if necessary, substituting whatever command name(s) you are using to invoke python when failing.
ForestGregg commentedon Jun 6, 2017
From one user who had problems under both 3.5 and 3.6
otool -L $(python3.5 -c 'import _dbm;print(dbm.__file_)')
/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload/_dbm.cpython-35m-darwin.so:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0,
current version 125.2.0)
otool -L $(python3.6 -c 'import _dbm;print(dbm.__file_)')
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload/_
dbm.cpython-36m-darwin.so:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version
125.2.0)
ForestGregg commentedon Jun 9, 2017
A different user:
otool -L $(python3.6 -c 'import _dbm;print(_dbm.file)')
/usr/local/var/pyenv/versions/3.6.1/lib/python3.6/lib-dynload/_dbm.cpython-36m-darwin.so:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.50.2)
ronaldoussoren commentedon Nov 14, 2020
See also bpo-33074
ronaldoussoren commentedon Nov 27, 2020
I've attached a C program that demonstrates the problem, and have filed an issue with Apple about this: FB8919203
It is not clear to me what we can do about this, other than not building the ndbm binding on macOS. The manpages for the ndbm APIs do not mention limitations on item sizes, and the dbopen manpage mention that there a no limitations on item sizes).
pythongh-74573: document that ndbm can silently corrupt databases on …
ronaldoussoren commentedon Dec 21, 2023
The best we can do is document the issue.
gh-74573: document that ndbm can silently corrupt databases on macOS (#…
pythongh-74573: document that ndbm can silently corrupt databases on …
pythongh-74573: document that ndbm can silently corrupt databases on …
[3.12] gh-74573: document that ndbm can silently corrupt databases on…
[3.11] gh-74573: document that ndbm can silently corrupt databases on…
ronaldoussoren commentedon Dec 23, 2023
The just merged PRs document the problem in main, 3.12 and 3.11. As we cannot fix Apple's code that's the best we can do.
pythongh-74573: document that ndbm can silently corrupt databases on …
pythongh-74573: document that ndbm can silently corrupt databases on …
pythongh-74573: document that ndbm can silently corrupt databases on …
pythongh-74573: document that ndbm can silently corrupt databases on …