Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8d4c981

Browse files
committed
Fix SF # 640557, '64-bit' systems and the dbm module
datum.dsize can apparently be long on some systems. Ensure we pass an int* to PyArg_Parse("s#"), not &datum.dsize Will backport.
1 parent 450cafa commit 8d4c981

1 file changed

Lines changed: 17 additions & 6 deletions

File tree

Modules/dbmmodule.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,12 @@ static PyObject *
9494
dbm_subscript(dbmobject *dp, register PyObject *key)
9595
{
9696
datum drec, krec;
97+
int tmp_size;
9798

98-
if (!PyArg_Parse(key, "s#", &krec.dptr, &krec.dsize) )
99+
if (!PyArg_Parse(key, "s#", &krec.dptr, &tmp_size) )
99100
return NULL;
100101

102+
krec.dsize = tmp_size;
101103
check_dbmobject_open(dp);
102104
drec = dbm_fetch(dp->di_dbm, krec);
103105
if ( drec.dptr == 0 ) {
@@ -117,12 +119,14 @@ static int
117119
dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w)
118120
{
119121
datum krec, drec;
122+
int tmp_size;
120123

121-
if ( !PyArg_Parse(v, "s#", &krec.dptr, &krec.dsize) ) {
124+
if ( !PyArg_Parse(v, "s#", &krec.dptr, &tmp_size) ) {
122125
PyErr_SetString(PyExc_TypeError,
123126
"dbm mappings have string indices only");
124127
return -1;
125128
}
129+
krec.dsize = tmp_size;
126130
if (dp->di_dbm == NULL) {
127131
PyErr_SetString(DbmError, "DBM object has already been closed");
128132
return -1;
@@ -136,11 +140,12 @@ dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w)
136140
return -1;
137141
}
138142
} else {
139-
if ( !PyArg_Parse(w, "s#", &drec.dptr, &drec.dsize) ) {
143+
if ( !PyArg_Parse(w, "s#", &drec.dptr, &tmp_size) ) {
140144
PyErr_SetString(PyExc_TypeError,
141145
"dbm mappings have string elements only");
142146
return -1;
143147
}
148+
drec.dsize = tmp_size;
144149
if ( dbm_store(dp->di_dbm, krec, drec, DBM_REPLACE) < 0 ) {
145150
dbm_clearerr(dp->di_dbm);
146151
PyErr_SetString(DbmError,
@@ -208,9 +213,11 @@ static PyObject *
208213
dbm_has_key(register dbmobject *dp, PyObject *args)
209214
{
210215
datum key, val;
216+
int tmp_size;
211217

212-
if (!PyArg_ParseTuple(args, "s#:has_key", &key.dptr, &key.dsize))
218+
if (!PyArg_ParseTuple(args, "s#:has_key", &key.dptr, &tmp_size))
213219
return NULL;
220+
key.dsize = tmp_size;
214221
check_dbmobject_open(dp);
215222
val = dbm_fetch(dp->di_dbm, key);
216223
return PyInt_FromLong(val.dptr != NULL);
@@ -221,10 +228,12 @@ dbm_get(register dbmobject *dp, PyObject *args)
221228
{
222229
datum key, val;
223230
PyObject *defvalue = Py_None;
231+
int tmp_size;
224232

225233
if (!PyArg_ParseTuple(args, "s#|O:get",
226-
&key.dptr, &key.dsize, &defvalue))
234+
&key.dptr, &tmp_size, &defvalue))
227235
return NULL;
236+
key.dsize = tmp_size;
228237
check_dbmobject_open(dp);
229238
val = dbm_fetch(dp->di_dbm, key);
230239
if (val.dptr != NULL)
@@ -240,10 +249,12 @@ dbm_setdefault(register dbmobject *dp, PyObject *args)
240249
{
241250
datum key, val;
242251
PyObject *defvalue = NULL;
252+
int tmp_size;
243253

244254
if (!PyArg_ParseTuple(args, "s#|S:setdefault",
245-
&key.dptr, &key.dsize, &defvalue))
255+
&key.dptr, &tmp_size, &defvalue))
246256
return NULL;
257+
key.dsize = tmp_size;
247258
check_dbmobject_open(dp);
248259
val = dbm_fetch(dp->di_dbm, key);
249260
if (val.dptr != NULL)

0 commit comments

Comments
 (0)