Package: python-zodb
Version: 3.6.0-6
Severity: important
ZODB 3.6 had a portability bug (see
https://bugs.edge.launchpad.net/zodb/+bug/153316), as it used int
for addresses and pointers instead of Py_ssize_t (the Python equivalent
of size_t) that prevented it from being used successfully in x86_64. A fix
was committed in revision r81758, please find attached a
testcase and a patch that should solve this issue in 3.6.0-6.
=== added file 'Dependencies/BTrees-ZODB3-3.6.0/BTrees/py24compat.h'
--- zodb-3.6.0.orig/Dependencies/BTrees-ZODB3-3.6.0/BTrees/py24compat.h 1970-01-01 00:00:00 +0000
+++ zodb-3.6.0/Dependencies/BTrees-ZODB3-3.6.0/BTrees/py24compat.h 2007-12-01 12:26:34 +0000
@@ -0,0 +1,11 @@
+/* Backport type definitions from Python 2.5's object.h */
+#ifndef BTREE_PY24COMPATH_H
+#define BTREE_PY24COMPAT_H
+#if PY_VERSION_HEX < 0x02050000
+typedef Py_ssize_t (*lenfunc)(PyObject *);
+typedef PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t);
+typedef PyObject *(*ssizessizeargfunc)(PyObject *, Py_ssize_t, Py_ssize_t);
+typedef int(*ssizeobjargproc)(PyObject *, Py_ssize_t, PyObject *);
+typedef int(*ssizessizeobjargproc)(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *);
+#endif /* PY_VERSION_HEX */
+#endif /* BTREE_PY24COMPAT_H */
=== added file 'Dependencies/persistent-ZODB3-3.6.0/persistent/py24compat.h'
--- zodb-3.6.0.orig/Dependencies/persistent-ZODB3-3.6.0/persistent/py24compat.h 1970-01-01 00:00:00 +0000
+++ zodb-3.6.0/Dependencies/persistent-ZODB3-3.6.0/persistent/py24compat.h 2007-12-01 12:26:34 +0000
@@ -0,0 +1,9 @@
+/* Backport type definitions from Python 2.5's object.h */
+#ifndef PERSISTENT_PY24COMPATH_H
+#define PERSISTENT_PY24COMPAT_H
+#if PY_VERSION_HEX < 0x02050000
+typedef int Py_ssize_t;
+#define PY_SSIZE_T_MAX INT_MAX
+#define PY_SSIZE_T_MIN INT_MIN
+#endif /* PY_VERSION_HEX */
+#endif /* PERSISTENT_PY24COMPAT_H */
=== modified file 'Dependencies/BTrees-ZODB3-3.6.0/BTrees/BTreeItemsTemplate.c'
--- zodb-3.6.0.orig/Dependencies/BTrees-ZODB3-3.6.0/BTrees/BTreeItemsTemplate.c 2007-12-01 12:14:46 +0000
+++ zodb-3.6.0/Dependencies/BTrees-ZODB3-3.6.0/BTrees/BTreeItemsTemplate.c 2007-12-01 12:26:34 +0000
@@ -69,10 +69,10 @@
PyObject_DEL(self);
}
-static int
+static Py_ssize_t
BTreeItems_length_or_nonzero(BTreeItems *self, int nonzero)
{
- int r;
+ Py_ssize_t r;
Bucket *b, *next;
b = self->firstbucket;
@@ -111,8 +111,8 @@
return r >= 0 ? r : 0;
}
-static int
-BTreeItems_length( BTreeItems *self)
+static Py_ssize_t
+BTreeItems_length(BTreeItems *self)
{
return BTreeItems_length_or_nonzero(self, 0);
}
@@ -132,7 +132,7 @@
** self->currentbucket.
*/
static int
-BTreeItems_seek(BTreeItems *self, int i)
+BTreeItems_seek(BTreeItems *self, Py_ssize_t i)
{
int delta, pseudoindex, currentoffset;
Bucket *b, *currentbucket;
@@ -285,7 +285,7 @@
** (ie pulls the ith item out)
*/
static PyObject *
-BTreeItems_item(BTreeItems *self, int i)
+BTreeItems_item(BTreeItems *self, Py_ssize_t i)
{
PyObject *result;
@@ -311,13 +311,13 @@
** Returns: BTreeItems item
*/
static PyObject *
-BTreeItems_slice(BTreeItems *self, int ilow, int ihigh)
+BTreeItems_slice(BTreeItems *self, Py_ssize_t ilow, Py_ssize_t ihigh)
{
Bucket *lowbucket;
Bucket *highbucket;
int lowoffset;
int highoffset;
- int length = -1; /* len(self), but computed only if needed */
+ Py_ssize_t length = -1; /* len(self), but computed only if needed */
/* Complications:
* A Python slice never raises IndexError, but BTreeItems_seek does.
@@ -386,11 +386,11 @@
}
static PySequenceMethods BTreeItems_as_sequence = {
- (inquiry) BTreeItems_length,
+ (lenfunc) BTreeItems_length,
(binaryfunc)0,
- (intargfunc)0,
- (intargfunc) BTreeItems_item,
- (intintargfunc) BTreeItems_slice,
+ (ssizeargfunc)0,
+ (ssizeargfunc) BTreeItems_item,
+ (ssizessizeargfunc) BTreeItems_slice,
};
/* Number Method items (just for nb_nonzero!) */
=== modified file 'Dependencies/BTrees-ZODB3-3.6.0/BTrees/BTreeModuleTemplate.c'
--- zodb-3.6.0.orig/Dependencies/BTrees-ZODB3-3.6.0/BTrees/BTreeModuleTemplate.c 2007-12-01 12:14:46 +0000
+++ zodb-3.6.0/Dependencies/BTrees-ZODB3-3.6.0/BTrees/BTreeModuleTemplate.c 2007-12-01 12:26:34 +0000
@@ -27,6 +27,8 @@
#define PER_ACCESSED(O) 1
#endif
+#include "py24compat.h"
+
/* So sue me. This pair gets used all over the place, so much so that it
* interferes with understanding non-persistence parts of algorithms.
* PER_UNUSE can be used after a successul PER_USE or PER_USE_OR_RETURN.
=== modified file 'Dependencies/BTrees-ZODB3-3.6.0/BTrees/BTreeTemplate.c'
--- zodb-3.6.0.orig/Dependencies/BTrees-ZODB3-3.6.0/BTrees/BTreeTemplate.c 2007-12-01 12:14:46 +0000
+++ zodb-3.6.0/Dependencies/BTrees-ZODB3-3.6.0/BTrees/BTreeTemplate.c 2007-12-01 12:26:34 +0000
@@ -1730,7 +1730,7 @@
}
/* forward declaration */
-static int
+static Py_ssize_t
BTree_length_or_nonzero(BTree *self, int nonzero);
static PyObject *
@@ -2062,7 +2062,7 @@
* -1 error
* >= 0 number of elements.
*/
-static int
+static Py_ssize_t
BTree_length_or_nonzero(BTree *self, int nonzero)
{
int result;
@@ -2086,32 +2086,32 @@
return result;
}
-static int
-BTree_length( BTree *self)
+static Py_ssize_t
+BTree_length(BTree *self)
{
return BTree_length_or_nonzero(self, 0);
}
static PyMappingMethods BTree_as_mapping = {
- (inquiry)BTree_length, /*mp_length*/
+ (lenfunc)BTree_length, /*mp_length*/
(binaryfunc)BTree_get, /*mp_subscript*/
(objobjargproc)BTree_setitem, /*mp_ass_subscript*/
};
static PySequenceMethods BTree_as_sequence = {
- (inquiry)0, /* sq_length */
+ (lenfunc)0, /* sq_length */
(binaryfunc)0, /* sq_concat */
- (intargfunc)0, /* sq_repeat */
- (intargfunc)0, /* sq_item */
- (intintargfunc)0, /* sq_slice */
- (intobjargproc)0, /* sq_ass_item */
- (intintobjargproc)0, /* sq_ass_slice */
+ (ssizeargfunc)0, /* sq_repeat */
+ (ssizeargfunc)0, /* sq_item */
+ (ssizessizeargfunc)0, /* sq_slice */
+ (ssizeobjargproc)0, /* sq_ass_item */
+ (ssizessizeobjargproc)0, /* sq_ass_slice */
(objobjproc)BTree_contains, /* sq_contains */
0, /* sq_inplace_concat */
0, /* sq_inplace_repeat */
};
-static int
+static Py_ssize_t
BTree_nonzero(BTree *self)
{
return BTree_length_or_nonzero(self, 1);
=== modified file 'Dependencies/BTrees-ZODB3-3.6.0/BTrees/BucketTemplate.c'
--- zodb-3.6.0.orig/Dependencies/BTrees-ZODB3-3.6.0/BTrees/BucketTemplate.c 2007-12-01 12:14:46 +0000
+++ zodb-3.6.0/Dependencies/BTrees-ZODB3-3.6.0/BTrees/BucketTemplate.c 2007-12-01 12:26:34 +0000
@@ -1683,19 +1683,19 @@
}
static PyMappingMethods Bucket_as_mapping = {
- (inquiry)Bucket_length, /*mp_length*/
+ (lenfunc)Bucket_length, /*mp_length*/
(binaryfunc)bucket_getitem, /*mp_subscript*/
(objobjargproc)bucket_setitem, /*mp_ass_subscript*/
};
static PySequenceMethods Bucket_as_sequence = {
- (inquiry)0, /* sq_length */
+ (lenfunc)0, /* sq_length */
(binaryfunc)0, /* sq_concat */
- (intargfunc)0, /* sq_repeat */
- (intargfunc)0, /* sq_item */
- (intintargfunc)0, /* sq_slice */
- (intobjargproc)0, /* sq_ass_item */
- (intintobjargproc)0, /* sq_ass_slice */
+ (ssizeargfunc)0, /* sq_repeat */
+ (ssizeargfunc)0, /* sq_item */
+ (ssizessizeargfunc)0, /* sq_slice */
+ (ssizeobjargproc)0, /* sq_ass_item */
+ (ssizessizeobjargproc)0, /* sq_ass_slice */
(objobjproc)bucket_contains, /* sq_contains */
0, /* sq_inplace_concat */
0, /* sq_inplace_repeat */
=== modified file 'Dependencies/BTrees-ZODB3-3.6.0/BTrees/SetTemplate.c'
--- zodb-3.6.0.orig/Dependencies/BTrees-ZODB3-3.6.0/BTrees/SetTemplate.c 2007-12-01 12:14:46 +0000
+++ zodb-3.6.0/Dependencies/BTrees-ZODB3-3.6.0/BTrees/SetTemplate.c 2007-12-01 12:26:34 +0000
@@ -243,7 +243,7 @@
return NULL;
}
-static int
+static Py_ssize_t
set_length(Bucket *self)
{
int r;
@@ -256,7 +256,7 @@
}
static PyObject *
-set_item(Bucket *self, int index)
+set_item(Bucket *self, Py_ssize_t index)
{
PyObject *r=0;
@@ -274,16 +274,16 @@
}
static PySequenceMethods set_as_sequence = {
- (inquiry)set_length, /* sq_length */
- (binaryfunc)0, /* sq_concat */
- (intargfunc)0, /* sq_repeat */
- (intargfunc)set_item, /* sq_item */
- (intintargfunc)0, /* sq_slice */
- (intobjargproc)0, /* sq_ass_item */
- (intintobjargproc)0, /* sq_ass_slice */
- (objobjproc)bucket_contains, /* sq_contains */
- 0, /* sq_inplace_concat */
- 0, /* sq_inplace_repeat */
+ (lenfunc)set_length, /* sq_length */
+ (binaryfunc)0, /* sq_concat */
+ (ssizeargfunc)0, /* sq_repeat */
+ (ssizeargfunc)set_item, /* sq_item */
+ (ssizessizeargfunc)0, /* sq_slice */
+ (ssizeobjargproc)0, /* sq_ass_item */
+ (ssizessizeobjargproc)0, /* sq_ass_slice */
+ (objobjproc)bucket_contains, /* sq_contains */
+ 0, /* sq_inplace_concat */
+ 0, /* sq_inplace_repeat */
};
static PyTypeObject SetType = {
=== modified file 'Dependencies/BTrees-ZODB3-3.6.0/BTrees/TreeSetTemplate.c'
--- zodb-3.6.0.orig/Dependencies/BTrees-ZODB3-3.6.0/BTrees/TreeSetTemplate.c 2007-12-01 12:14:46 +0000
+++ zodb-3.6.0/Dependencies/BTrees-ZODB3-3.6.0/BTrees/TreeSetTemplate.c 2007-12-01 12:26:34 +0000
@@ -170,17 +170,17 @@
};
static PyMappingMethods TreeSet_as_mapping = {
- (inquiry)BTree_length, /*mp_length*/
+ (lenfunc)BTree_length, /*mp_length*/
};
static PySequenceMethods TreeSet_as_sequence = {
- (inquiry)0, /* sq_length */
+ (lenfunc)0, /* sq_length */
(binaryfunc)0, /* sq_concat */
- (intargfunc)0, /* sq_repeat */
- (intargfunc)0, /* sq_item */
- (intintargfunc)0, /* sq_slice */
- (intobjargproc)0, /* sq_ass_item */
- (intintobjargproc)0, /* sq_ass_slice */
+ (ssizeargfunc)0, /* sq_repeat */
+ (ssizeargfunc)0, /* sq_item */
+ (ssizessizeargfunc)0, /* sq_slice */
+ (ssizeobjargproc)0, /* sq_ass_item */
+ (ssizessizeobjargproc)0, /* sq_ass_slice */
(objobjproc)BTree_contains, /* sq_contains */
0, /* sq_inplace_concat */
0, /* sq_inplace_repeat */
=== modified file 'Dependencies/persistent-ZODB3-3.6.0/MANIFEST'
--- zodb-3.6.0.orig/Dependencies/persistent-ZODB3-3.6.0/MANIFEST 2007-12-01 12:14:46 +0000
+++ zodb-3.6.0/Dependencies/persistent-ZODB3-3.6.0/MANIFEST 2007-12-01 12:26:34 +0000
@@ -14,6 +14,7 @@
persistent/interfaces.py
persistent/README.txt
persistent/cPersistence.h
+persistent/py24compat.h
persistent/tests/persistenttestbase.py
persistent/tests/test_PickleCache.py
persistent/tests/test_list.py
=== modified file 'Dependencies/persistent-ZODB3-3.6.0/persistent/SETUP.cfg'
--- zodb-3.6.0.orig/Dependencies/persistent-ZODB3-3.6.0/persistent/SETUP.cfg 2007-12-01 12:14:46 +0000
+++ zodb-3.6.0/Dependencies/persistent-ZODB3-3.6.0/persistent/SETUP.cfg 2007-12-01 12:26:34 +0000
@@ -11,6 +11,10 @@
#
header ring.h
+# This is included by cPersistence.h, so all users of cPersistence.h
+# have to be able to include this indirectly.
+#
+header py24compat.h
<extension cPersistence>
source cPersistence.c
@@ -18,6 +22,7 @@
depends-on cPersistence.h
depends-on ring.h
+ depends-on py24compat.h
</extension>
<extension cPickleCache>
@@ -26,6 +31,7 @@
depends-on cPersistence.h
depends-on ring.h
+ depends-on py24compat.h
</extension>
<extension TimeStamp>
=== modified file 'Dependencies/persistent-ZODB3-3.6.0/persistent/cPersistence.c'
--- zodb-3.6.0.orig/Dependencies/persistent-ZODB3-3.6.0/persistent/cPersistence.c 2007-12-01 12:14:46 +0000
+++ zodb-3.6.0/Dependencies/persistent-ZODB3-3.6.0/persistent/cPersistence.c 2007-12-01 12:26:34 +0000
@@ -300,7 +300,7 @@
{
PyObject *copy, *key, *value;
char *ckey;
- int pos = 0;
+ Py_ssize_t pos = 0;
copy = PyDict_New();
if (!copy)
@@ -414,7 +414,7 @@
pickle_setattrs_from_dict(PyObject *self, PyObject *dict)
{
PyObject *key, *value;
- int pos = 0;
+ Py_ssize_t pos = 0;
if (!PyDict_Check(dict)) {
PyErr_SetString(PyExc_TypeError, "Expected dictionary");
=== modified file 'Dependencies/persistent-ZODB3-3.6.0/persistent/cPersistence.h'
--- zodb-3.6.0.orig/Dependencies/persistent-ZODB3-3.6.0/persistent/cPersistence.h 2007-12-01 12:14:46 +0000
+++ zodb-3.6.0/Dependencies/persistent-ZODB3-3.6.0/persistent/cPersistence.h 2007-12-01 12:26:34 +0000
@@ -16,6 +16,8 @@
#define CPERSISTENCE_H
#include "Python.h"
+#include "py24compat.h"
+
#include "ring.h"
#define CACHE_HEAD \
=== modified file 'Dependencies/persistent-ZODB3-3.6.0/persistent/cPickleCache.c'
--- zodb-3.6.0.orig/Dependencies/persistent-ZODB3-3.6.0/persistent/cPickleCache.c 2007-12-01 12:14:46 +0000
+++ zodb-3.6.0/Dependencies/persistent-ZODB3-3.6.0/persistent/cPickleCache.c 2007-12-01 12:26:34 +0000
@@ -378,7 +378,7 @@
cc_invalidate(ccobject *self, PyObject *inv)
{
PyObject *key, *v;
- int i = 0;
+ Py_ssize_t i = 0;
if (PyDict_Check(inv))
{
@@ -448,7 +448,7 @@
cc_klass_items(ccobject *self)
{
PyObject *l,*k,*v;
- int p = 0;
+ Py_ssize_t p = 0;
l = PyList_New(0);
if (l == NULL)
@@ -477,7 +477,7 @@
cc_debug_info(ccobject *self)
{
PyObject *l,*k,*v;
- int p = 0;
+ Py_ssize_t p = 0;
l = PyList_New(0);
if (l == NULL)
@@ -707,7 +707,7 @@
static int
cc_clear(ccobject *self)
{
- int pos = 0;
+ Py_ssize_t pos = 0;
PyObject *k, *v;
/* Clearing the cache is delicate.
=== modified file 'MANIFEST'
--- zodb-3.6.0.orig/MANIFEST 2007-12-01 12:14:46 +0000
+++ zodb-3.6.0/MANIFEST 2007-12-01 12:26:34 +0000
@@ -512,6 +512,7 @@
Dependencies/persistent-ZODB3-3.6.0/persistent/TimeStamp.c
Dependencies/persistent-ZODB3-3.6.0/persistent/DEPENDENCIES.cfg
Dependencies/persistent-ZODB3-3.6.0/persistent/ring.h
+Dependencies/persistent-ZODB3-3.6.0/persistent/py24compat.h
Dependencies/persistent-ZODB3-3.6.0/persistent/__init__.py
Dependencies/persistent-ZODB3-3.6.0/persistent/wref.py
Dependencies/persistent-ZODB3-3.6.0/persistent/SETUP.cfg
=== modified file 'ZODB3/MANIFEST'
--- zodb-3.6.0.orig/ZODB3/MANIFEST 2007-12-01 12:14:46 +0000
+++ zodb-3.6.0/ZODB3/MANIFEST 2007-12-01 12:26:34 +0000
@@ -310,6 +310,7 @@
src/persistent/interfaces.py
src/persistent/list.py
src/persistent/mapping.py
+src/persistent/py24compat.h
src/persistent/ring.c
src/persistent/ring.h
src/persistent/wref.py
from ZODB import FileStorage, DB
from BTrees.IOBTree import IOBTree
import transaction
from persistent import Persistent
class MyObj(Persistent):
def __init__(self):
self.my_attribute = "froon"
print "Making empty database"
storage = FileStorage.FileStorage('db.fs')
db = DB(storage)
conn = db.open()
root = conn.root()
print "\nstoring an object..."
root[1] = MyObj()
print "\ninspecting object..."
if hasattr(root[1], 'my_attribute') and root[1].my_attribute == 'froon':
print "object still works..."
else:
print "object is broken!"
print "\ncommitting transaction..."
transaction.commit()
print "\ninspecting object..."
if hasattr(root[1], 'my_attribute') and root[1].my_attribute == 'froon':
print "object still works..."
else:
print "object is broken!"
print "\nclosing up zodb...",
del root
conn.close()
del conn
db.close()
del db
storage.close()
del storage
print "done"
print "\nopening for another look..."
storage = FileStorage.FileStorage('db.fs')
db = DB(storage)
conn = db.open()
root = conn.root()
print "\ninspecting object..."
if hasattr(root[1], 'my_attribute') and root[1].my_attribute == 'froon':
print "object still works..."
else:
print "object is broken!"
transaction.abort()
del root
conn.close()
del conn
db.close()
del db
storage.close()
del storage
print "done"