]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fix SF # 640557, '64-bit' systems and the dbm module
authorNeal Norwitz <nnorwitz@gmail.com>
Fri, 22 Nov 2002 23:29:47 +0000 (23:29 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Fri, 22 Nov 2002 23:29:47 +0000 (23:29 +0000)
datum.dsize can apparently be long on some systems.
Ensure we pass an int* to PyArg_Parse("s#"), not &datum.dsize

Modules/dbmmodule.c

index 233487d6122462669997fa8b7da97b98f270777e..60bf7147445ac99ee63a4605b4b7150c658bec27 100644 (file)
@@ -90,10 +90,12 @@ static PyObject *
 dbm_subscript(dbmobject *dp, register PyObject *key)
 {
        datum drec, krec;
+       int tmp_size;
        
-       if (!PyArg_Parse(key, "s#", &krec.dptr, &krec.dsize) )
+       if (!PyArg_Parse(key, "s#", &krec.dptr, &tmp_size) )
                return NULL;
        
+       krec.dsize = tmp_size;
         check_dbmobject_open(dp);
        drec = dbm_fetch(dp->di_dbm, krec);
        if ( drec.dptr == 0 ) {
@@ -113,12 +115,14 @@ static int
 dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w)
 {
         datum krec, drec;
+       int tmp_size;
        
-        if ( !PyArg_Parse(v, "s#", &krec.dptr, &krec.dsize) ) {
+        if ( !PyArg_Parse(v, "s#", &krec.dptr, &tmp_size) ) {
                PyErr_SetString(PyExc_TypeError,
                                "dbm mappings have string indices only");
                return -1;
        }
+       krec.dsize = tmp_size;
         if (dp->di_dbm == NULL) {
                  PyErr_SetString(DbmError, "DBM object has already been closed"); 
                  return -1;
@@ -132,11 +136,12 @@ dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w)
                        return -1;
                }
        } else {
-               if ( !PyArg_Parse(w, "s#", &drec.dptr, &drec.dsize) ) {
+               if ( !PyArg_Parse(w, "s#", &drec.dptr, &tmp_size) ) {
                        PyErr_SetString(PyExc_TypeError,
                                     "dbm mappings have string elements only");
                        return -1;
                }
+               drec.dsize = tmp_size;
                if ( dbm_store(dp->di_dbm, krec, drec, DBM_REPLACE) < 0 ) {
                        dbm_clearerr(dp->di_dbm);
                        PyErr_SetString(DbmError,
@@ -204,9 +209,11 @@ static PyObject *
 dbm_has_key(register dbmobject *dp, PyObject *args)
 {
        datum key, val;
+       int tmp_size;
        
-       if (!PyArg_ParseTuple(args, "s#:has_key", &key.dptr, &key.dsize))
+       if (!PyArg_ParseTuple(args, "s#:has_key", &key.dptr, &tmp_size))
                return NULL;
+       key.dsize = tmp_size;
         check_dbmobject_open(dp);
        val = dbm_fetch(dp->di_dbm, key);
        return PyInt_FromLong(val.dptr != NULL);
@@ -217,10 +224,12 @@ dbm_get(register dbmobject *dp, PyObject *args)
 {
        datum key, val;
        PyObject *defvalue = Py_None;
+       int tmp_size;
 
        if (!PyArg_ParseTuple(args, "s#|O:get",
-                              &key.dptr, &key.dsize, &defvalue))
+                              &key.dptr, &tmp_size, &defvalue))
                return NULL;
+       key.dsize = tmp_size;
         check_dbmobject_open(dp);
        val = dbm_fetch(dp->di_dbm, key);
        if (val.dptr != NULL)
@@ -236,10 +245,12 @@ dbm_setdefault(register dbmobject *dp, PyObject *args)
 {
        datum key, val;
        PyObject *defvalue = NULL;
+       int tmp_size;
 
        if (!PyArg_ParseTuple(args, "s#|S:setdefault",
-                              &key.dptr, &key.dsize, &defvalue))
+                              &key.dptr, &tmp_size, &defvalue))
                return NULL;
+       key.dsize = tmp_size;
         check_dbmobject_open(dp);
        val = dbm_fetch(dp->di_dbm, key);
        if (val.dptr != NULL)