[pypy-svn] r75553 - in pypy/branch/sys-prefix/lib_pypy: . pypy_test

antocuni at codespeak.net antocuni at codespeak.net
Thu Jun 24 11:57:36 CEST 2010


Author: antocuni
Date: Thu Jun 24 11:57:34 2010
New Revision: 75553

Modified:
   pypy/branch/sys-prefix/lib_pypy/dbm.py   (contents, props changed)
   pypy/branch/sys-prefix/lib_pypy/pypy_test/test_dbm_extra.py
Log:
merge from trunk

    r75210 | afa | 2010-06-08 18:51:44 +0200 (Tue, 08 Jun 2010) | 3 lines
    Changed paths:
       M /pypy/trunk/pypy/lib/dbm.py
       A /pypy/trunk/pypy/lib/test2/test_dbm_extra.py
    
    issue467 resolved: add checks to the dbm module,
    avoids some segfaults
    


Modified: pypy/branch/sys-prefix/lib_pypy/dbm.py
==============================================================================
--- pypy/branch/sys-prefix/lib_pypy/dbm.py	(original)
+++ pypy/branch/sys-prefix/lib_pypy/dbm.py	Thu Jun 24 11:57:34 2010
@@ -1,4 +1,4 @@
-from ctypes import *
+from ctypes import Structure, c_char_p, c_int, c_void_p, CDLL
 import ctypes.util
 import os, sys
 
@@ -15,6 +15,11 @@
     ('dsize', c_int),
     ]
 
+    def __init__(self, text):
+        if not isinstance(text, str):
+            raise TypeError("datum: expected string, not %s" % type(text))
+        Structure.__init__(self, text, len(text))
+
 class dbm(object):
     def __init__(self, dbmobj):
         self._aobj = dbmobj
@@ -42,9 +47,7 @@
     def get(self, key, default=None):
         if not self._aobj:
             raise error('DBM object has already been closed')
-        dat = datum()
-        dat.dptr = c_char_p(key)
-        dat.dsize = c_int(len(key))
+        dat = datum(key)
         k = getattr(lib, funcs['fetch'])(self._aobj, dat)
         if k.dptr:
             return k.dptr[:k.dsize]
@@ -65,12 +68,8 @@
     def __setitem__(self, key, value):
         if not self._aobj: 
             raise error('DBM object has already been closed')
-        dat = datum()
-        dat.dptr = c_char_p(key)
-        dat.dsize = c_int(len(key))
-        data = datum()
-        data.dptr = c_char_p(value)
-        data.dsize = c_int(len(value))
+        dat = datum(key)
+        data = datum(value)
         status = getattr(lib, funcs['store'])(self._aobj, dat, data, lib.DBM_REPLACE)
         if getattr(lib, funcs['error'])(self._aobj):
             getattr(lib, funcs['clearerr'])(self._aobj)
@@ -80,15 +79,11 @@
     def setdefault(self, key, default=''):
         if not self._aobj:
             raise error('DBM object has already been closed')
-        dat = datum()
-        dat.dptr = c_char_p(key)
-        dat.dsize = c_int(len(key))
+        dat = datum(key)
         k = getattr(lib, funcs['fetch'])(self._aobj, dat)
         if k.dptr:
             return k.dptr[:k.dsize]
-        data = datum()
-        data.dptr = c_char_p(default)
-        data.dsize = c_int(len(default))
+        data = datum(default)
         status = getattr(lib, funcs['store'])(self._aobj, dat, data, lib.DBM_INSERT)
         if status < 0:
             getattr(lib, funcs['clearerr'])(self._aobj)
@@ -98,9 +93,7 @@
     def has_key(self, key):
         if not self._aobj:
             raise error('DBM object has already been closed')
-        dat = datum()
-        dat.dptr = c_char_p(key)
-        dat.dsize = c_int(len(key))
+        dat = datum(key)
         k = getattr(lib, funcs['fetch'])(self._aobj, dat)
         if k.dptr:
             return True
@@ -109,9 +102,7 @@
     def __delitem__(self, key):
         if not self._aobj:
             raise error('DBM object has already been closed')
-        dat = datum()
-        dat.dptr = c_char_p(key)
-        dat.dsize = c_int(len(key))
+        dat = datum(key)
         status = getattr(lib, funcs['delete'])(self._aobj, dat)
         if status < 0:
             raise KeyError(key)
@@ -146,7 +137,7 @@
 library = "GNU gdbm"
 
 funcs = {}
-_init_func('open', [c_char_p, c_int, c_int])
+_init_func('open', (c_char_p, c_int, c_int))
 _init_func('close', restype=c_void_p)
 _init_func('firstkey', restype=datum)
 _init_func('nextkey', restype=datum)
@@ -160,6 +151,9 @@
 
 def open(filename, flag='r', mode=0666):
     "open a DBM database"
+    if not isinstance(filename, str):
+        raise TypeError("expected string")
+
     openflag = 0
 
     try:
@@ -177,3 +171,6 @@
     if a_db == 0:
         raise error("Could not open file %s.db" % filename)
     return dbm(a_db)
+
+__all__ = ('datum', 'dbm', 'error', 'funcs', 'open', 'library')
+

Modified: pypy/branch/sys-prefix/lib_pypy/pypy_test/test_dbm_extra.py
==============================================================================
--- pypy/branch/sys-prefix/lib_pypy/pypy_test/test_dbm_extra.py	(original)
+++ pypy/branch/sys-prefix/lib_pypy/pypy_test/test_dbm_extra.py	Thu Jun 24 11:57:34 2010
@@ -44,3 +44,7 @@
     d['xyz'] = '546'
     assert dict(d) == {'xyz': '546'}
     assert d['xyz'] == '546'
+
+def test_extra():
+    py.test.raises(TypeError, dbm.datum, 123)
+    py.test.raises(TypeError, dbm.datum, False)



More information about the Pypy-commit mailing list