]> granicus.if.org Git - python/commitdiff
Backport 58532, 58533, 58534:
authorGregory P. Smith <greg@mad-scientist.com>
Thu, 18 Oct 2007 17:15:20 +0000 (17:15 +0000)
committerGregory P. Smith <greg@mad-scientist.com>
Thu, 18 Oct 2007 17:15:20 +0000 (17:15 +0000)
 - Fix bsddb.dbtables: Don't randomly corrupt newly inserted rows by
   picking a rowid string with null bytes in it.  Such rows could not
   later be deleted, modified or individually selected.  Existing
   bsdTableDb databases created with such rows are out of luck.
 - Use mkdtemp for the test_dbtables test database environment and
   clean it up afterwards using shutil.rmtree.

Lib/bsddb/dbtables.py
Lib/bsddb/test/test_dbtables.py
Misc/NEWS

index 492d5fdfac29c9f6c1702ab7c7b46e032e98022d..f6c7f02cfe32bdbc68dcda9a2030cf47de95c8a4 100644 (file)
@@ -20,7 +20,7 @@ _cvsid = '$Id$'
 import re
 import sys
 import copy
-import xdrlib
+import struct
 import random
 from types import ListType, StringType
 import cPickle as pickle
@@ -362,10 +362,11 @@ class bsdTableDB :
             # Generate a random 64-bit row ID string
             # (note: this code has <64 bits of randomness
             # but it's plenty for our database id needs!)
-            p = xdrlib.Packer()
-            p.pack_int(int(random.random()*2147483647))
-            p.pack_int(int(random.random()*2147483647))
-            newid = p.get_buffer()
+            # We must ensure that no null bytes are in the id value.
+            blist = []
+            for x in xrange(_rowid_str_len):
+                blist.append(random.randint(1,255))
+            newid = struct.pack('B'*_rowid_str_len, *blist)
 
             # Guarantee uniqueness by adding this key to the database
             try:
@@ -444,7 +445,7 @@ class bsdTableDB :
                         try:
                             dataitem = self.db.get(
                                 _data_key(table, column, rowid),
-                                txn)
+                                txn=txn)
                             self.db.delete(
                                 _data_key(table, column, rowid),
                                 txn)
index 26e3d3650bc681536663df9908d8409677093d57..7bcc2a73eb16530395b6505f97e2f8208a51f1eb 100644 (file)
 # $Id$
 
 import sys, os, re
+import shutil
+import tempfile
 try:
-    import cPickle
-    pickle = cPickle
+    import cPickle as pickle
 except ImportError:
     import pickle
 
@@ -42,12 +43,9 @@ except ImportError:
 #----------------------------------------------------------------------
 
 class TableDBTestCase(unittest.TestCase):
-    db_home = 'db_home'
-    db_name = 'test-table.db'
-
     def setUp(self):
-        homeDir = os.path.join(os.path.dirname(sys.argv[0]), 'db_home')
-        self.homeDir = homeDir
+        homeDir = tempfile.mkdtemp()
+        self.testHomeDir = homeDir
         try: os.mkdir(homeDir)
         except os.error: pass
         self.tdb = dbtables.bsdTableDB(
@@ -55,10 +53,7 @@ class TableDBTestCase(unittest.TestCase):
 
     def tearDown(self):
         self.tdb.close()
-        import glob
-        files = glob.glob(os.path.join(self.homeDir, '*'))
-        for file in files:
-            os.remove(file)
+        shutil.rmtree(self.testHomeDir)
 
     def test01(self):
         tabname = "test01"
index 2d9af12b3cbb90e5e1a40a66d3f1e8e39291953c..a3912191d8806c6da374b05c9779f930ead492dc 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -118,6 +118,10 @@ Extension Modules
 - Bug #1233: fix bsddb.dbshelve.DBShelf append method to work as
   intended for RECNO databases.
 
+- Fix bsddb.dbtables: Don't randomly corrupt newly inserted rows by
+  picking a rowid string with null bytes in it.  Such rows could not
+  later be deleted, modified or individually selected.
+
 - Bug #1726026: Correct the field names of WIN32_FIND_DATAA and
   WIN32_FIND_DATAW structures in the ctypes.wintypes module.