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

Skip to content

Commit 77eecfa

Browse files
committed
Patches by AMK to check that the db is still open.
1 parent b8ad024 commit 77eecfa

3 files changed

Lines changed: 54 additions & 0 deletions

File tree

Modules/bsddbmodule.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ typedef struct {
5858
staticforward PyTypeObject Bsddbtype;
5959

6060
#define is_bsddbobject(v) ((v)->ob_type == &Bsddbtype)
61+
#define check_bsddbobject_open(v) if ((v)->di_bsddb == NULL) \
62+
{ PyErr_SetString(BsddbError, "BSDDB object has already been closed"); \
63+
return NULL; }
6164

6265
static PyObject *BsddbError;
6366

@@ -206,6 +209,10 @@ static int
206209
bsddb_length(dp)
207210
bsddbobject *dp;
208211
{
212+
if (dp->di_bsddb == NULL) {
213+
PyErr_SetString(BsddbError, "BSDDB object has already been closed");
214+
return -1;
215+
}
209216
if (dp->di_size < 0) {
210217
DBT krec, drec;
211218
int status;
@@ -237,6 +244,8 @@ bsddb_subscript(dp, key)
237244

238245
if (!PyArg_Parse(key, "s#", &data, &size))
239246
return NULL;
247+
check_bsddbobject_open(dp);
248+
240249
krec.data = data;
241250
krec.size = size;
242251

@@ -267,6 +276,10 @@ bsddb_ass_sub(dp, key, value)
267276
"bsddb key type must be string");
268277
return -1;
269278
}
279+
if (dp->di_bsddb == NULL) {
280+
PyErr_SetString(BsddbError, "BSDDB object has already been closed");
281+
return -1;
282+
}
270283
krec.data = data;
271284
krec.size = size;
272285
dp->di_size = -1;
@@ -341,6 +354,7 @@ bsddb_keys(dp, args)
341354

342355
if (!PyArg_NoArgs(args))
343356
return NULL;
357+
check_bsddbobject_open(dp);
344358
list = PyList_New(0);
345359
if (list == NULL)
346360
return NULL;
@@ -383,6 +397,7 @@ bsddb_has_key(dp, args)
383397

384398
if (!PyArg_Parse(args, "s#", &data, &size))
385399
return NULL;
400+
check_bsddbobject_open(dp);
386401
krec.data = data;
387402
krec.size = size;
388403

@@ -407,6 +422,7 @@ bsddb_set_location(dp, key)
407422

408423
if (!PyArg_Parse(key, "s#", &data, &size))
409424
return NULL;
425+
check_bsddbobject_open(dp);
410426
krec.data = data;
411427
krec.size = size;
412428

@@ -435,6 +451,7 @@ bsddb_seq(dp, args, sequence_request)
435451
if (!PyArg_NoArgs(args))
436452
return NULL;
437453

454+
check_bsddbobject_open(dp);
438455
krec.data = 0;
439456
krec.size = 0;
440457

@@ -487,6 +504,9 @@ bsddb_sync(dp, args)
487504
{
488505
int status;
489506

507+
if (!PyArg_NoArgs(args))
508+
return NULL;
509+
check_bsddbobject_open(dp);
490510
status = (dp->di_bsddb->sync)(dp->di_bsddb, 0);
491511
if (status != 0) {
492512
PyErr_SetFromErrno(BsddbError);

Modules/dbmmodule.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ typedef struct {
4848
staticforward PyTypeObject Dbmtype;
4949

5050
#define is_dbmobject(v) ((v)->ob_type == &Dbmtype)
51+
#define check_dbmobject_open(v) if ((v)->di_dbm == NULL) \
52+
{ PyErr_SetString(DbmError, "DBM object has already been closed"); \
53+
return NULL; }
5154

5255
static PyObject *DbmError;
5356

@@ -86,6 +89,10 @@ static int
8689
dbm_length(dp)
8790
dbmobject *dp;
8891
{
92+
if (dp->di_dbm == NULL) {
93+
PyErr_SetString(DbmError, "DBM object has already been closed");
94+
return -1;
95+
}
8996
if ( dp->di_size < 0 ) {
9097
datum key;
9198
int size;
@@ -109,6 +116,7 @@ register PyObject *key;
109116
if (!PyArg_Parse(key, "s#", &krec.dptr, &krec.dsize) )
110117
return NULL;
111118

119+
check_dbmobject_open(dp);
112120
drec = dbm_fetch(dp->di_dbm, krec);
113121
if ( drec.dptr == 0 ) {
114122
PyErr_SetString(PyExc_KeyError,
@@ -135,6 +143,10 @@ PyObject *v, *w;
135143
"dbm mappings have string indices only");
136144
return -1;
137145
}
146+
if (dp->di_dbm == NULL) {
147+
PyErr_SetString(DbmError, "DBM object has already been closed");
148+
return -1;
149+
}
138150
dp->di_size = -1;
139151
if (w == NULL) {
140152
if ( dbm_delete(dp->di_dbm, krec) < 0 ) {
@@ -195,6 +207,7 @@ PyObject *args;
195207

196208
if (!PyArg_NoArgs(args))
197209
return NULL;
210+
check_dbmobject_open(dp);
198211
v = PyList_New(0);
199212
if (v == NULL)
200213
return NULL;
@@ -224,6 +237,7 @@ PyObject *args;
224237

225238
if (!PyArg_Parse(args, "s#", &key.dptr, &key.dsize))
226239
return NULL;
240+
check_dbmobject_open(dp);
227241
val = dbm_fetch(dp->di_dbm, key);
228242
return PyInt_FromLong(val.dptr != NULL);
229243
}

Modules/gdbmmodule.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ typedef struct {
5757
staticforward PyTypeObject Dbmtype;
5858

5959
#define is_dbmobject(v) ((v)->ob_type == &Dbmtype)
60+
#define check_dbmobject_open(v) if ((v)->di_dbm == NULL) \
61+
{ PyErr_SetString(DbmError, "GDBM object has already been closed"); \
62+
return NULL; }
63+
64+
6065

6166
static PyObject *DbmError;
6267

@@ -100,6 +105,10 @@ static int
100105
dbm_length(dp)
101106
dbmobject *dp;
102107
{
108+
if (dp->di_dbm == NULL) {
109+
PyErr_SetString(DbmError, "GDBM object has already been closed");
110+
return -1;
111+
}
103112
if ( dp->di_size < 0 ) {
104113
datum key,okey;
105114
int size;
@@ -151,6 +160,10 @@ PyObject *v, *w;
151160
"gdbm mappings have string indices only");
152161
return -1;
153162
}
163+
if (dp->di_dbm == NULL) {
164+
PyErr_SetString(DbmError, "GDBM object has already been closed");
165+
return -1;
166+
}
154167
dp->di_size = -1;
155168
if (w == NULL) {
156169
if ( gdbm_delete(dp->di_dbm, krec) < 0 ) {
@@ -214,6 +227,8 @@ PyObject *args;
214227
if (!PyArg_NoArgs(args))
215228
return NULL;
216229

230+
check_dbmobject_open(dp);
231+
217232
v = PyList_New(0);
218233
if (v == NULL)
219234
return NULL;
@@ -250,6 +265,7 @@ PyObject *args;
250265

251266
if (!PyArg_Parse(args, "s#", &key.dptr, &key.dsize))
252267
return NULL;
268+
check_dbmobject_open(dp);
253269
return PyInt_FromLong((long) gdbm_exists(dp->di_dbm, key));
254270
}
255271

@@ -263,6 +279,7 @@ PyObject *args;
263279

264280
if (!PyArg_NoArgs(args))
265281
return NULL;
282+
check_dbmobject_open(dp);
266283
key = gdbm_firstkey(dp->di_dbm);
267284
if (key.dptr) {
268285
v = PyString_FromStringAndSize(key.dptr, key.dsize);
@@ -284,6 +301,7 @@ PyObject *args;
284301

285302
if (!PyArg_Parse(args, "s#", &key.dptr, &key.dsize))
286303
return NULL;
304+
check_dbmobject_open(dp);
287305
nextkey = gdbm_nextkey(dp->di_dbm, key);
288306
if (nextkey.dptr) {
289307
v = PyString_FromStringAndSize(nextkey.dptr, nextkey.dsize);
@@ -302,6 +320,7 @@ PyObject *args;
302320
{
303321
if (!PyArg_NoArgs(args))
304322
return NULL;
323+
check_dbmobject_open(dp);
305324
errno = 0;
306325
if (gdbm_reorganize(dp->di_dbm) < 0) {
307326
if (errno != 0)
@@ -322,6 +341,7 @@ dbm_sync(dp, args)
322341
{
323342
if (!PyArg_NoArgs(args))
324343
return NULL;
344+
check_dbmobject_open(dp);
325345
gdbm_sync(dp->di_dbm);
326346
Py_INCREF(Py_None);
327347
return Py_None;

0 commit comments

Comments
 (0)