Commit b635f7e9 authored by Guido van Rossum's avatar Guido van Rossum

Skip Montanaro:

I guess in 1.5.2 a new module, whichdb, was added that attempts to
divine the nature of a database file.  This module doesn't know anything
about Berkeley DB v2 files.  In v2, Sleepycat added a 12-byte null pad
in front of the old magic numbers (at least for hash and btree files).
I've been using v2 for awhile and upgrading to 1.5.2 broke all my
anydbm.open calls. I believe the following patch corrects the problem.
parent d0cf4f2c
...@@ -31,9 +31,10 @@ def whichdb(filename): ...@@ -31,9 +31,10 @@ def whichdb(filename):
except IOError: except IOError:
return None return None
# Read the first 4 bytes of the file -- the magic number # Read the start of the file -- the magic number
s = f.read(4) s16 = f.read(16)
f.close() f.close()
s = s16[0:4]
# Return "" if not at least 4 bytes # Return "" if not at least 4 bytes
if len(s) != 4: if len(s) != 4:
...@@ -53,5 +54,15 @@ def whichdb(filename): ...@@ -53,5 +54,15 @@ def whichdb(filename):
if magic in (0x00061561, 0x61150600): if magic in (0x00061561, 0x61150600):
return "dbhash" return "dbhash"
# BSD hash v2 has a 12-byte NULL pad in front of the file type
try:
(magic,) = struct.unpack("=l", s16[-4:])
except struct.error:
return ""
# Check for BSD hash
if magic in (0x00061561, 0x61150600):
return "dbhash"
# Unknown # Unknown
return "" return ""
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment