summaryrefslogtreecommitdiff
path: root/Modules/_bsddb.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/_bsddb.c')
-rw-r--r--Modules/_bsddb.c54
1 files changed, 30 insertions, 24 deletions
diff --git a/Modules/_bsddb.c b/Modules/_bsddb.c
index 9220866cbd..2a3ac5c948 100644
--- a/Modules/_bsddb.c
+++ b/Modules/_bsddb.c
@@ -98,12 +98,12 @@
#error "eek! DBVER can't handle minor versions > 9"
#endif
-#define PY_BSDDB_VERSION "4.4.4"
+#define PY_BSDDB_VERSION "4.4.5"
static char *rcs_id = "$Id$";
#if (PY_VERSION_HEX < 0x02050000)
-#define Py_ssize_t int
+typedef int Py_ssize_t;
#endif
#ifdef WITH_THREAD
@@ -528,6 +528,7 @@ static int makeDBError(int err)
PyObject *errObj = NULL;
PyObject *errTuple = NULL;
int exceptionRaised = 0;
+ unsigned int bytes_left;
switch (err) {
case 0: /* successful, no error */ break;
@@ -535,12 +536,15 @@ static int makeDBError(int err)
#if (DBVER < 41)
case DB_INCOMPLETE:
#if INCOMPLETE_IS_WARNING
- our_strlcpy(errTxt, db_strerror(err), sizeof(errTxt));
- if (_db_errmsg[0]) {
+ bytes_left = our_strlcpy(errTxt, db_strerror(err), sizeof(errTxt));
+ /* Ensure that bytes_left never goes negative */
+ if (_db_errmsg[0] && bytes_left < (sizeof(errTxt) - 4)) {
+ bytes_left = sizeof(errTxt) - bytes_left - 4 - 1;
+ assert(bytes_left >= 0);
strcat(errTxt, " -- ");
- strcat(errTxt, _db_errmsg);
- _db_errmsg[0] = 0;
+ strncat(errTxt, _db_errmsg, bytes_left);
}
+ _db_errmsg[0] = 0;
#ifdef HAVE_WARNINGS
exceptionRaised = PyErr_Warn(PyExc_RuntimeWarning, errTxt);
#else
@@ -588,12 +592,15 @@ static int makeDBError(int err)
}
if (errObj != NULL) {
- our_strlcpy(errTxt, db_strerror(err), sizeof(errTxt));
- if (_db_errmsg[0]) {
+ bytes_left = our_strlcpy(errTxt, db_strerror(err), sizeof(errTxt));
+ /* Ensure that bytes_left never goes negative */
+ if (_db_errmsg[0] && bytes_left < (sizeof(errTxt) - 4)) {
+ bytes_left = sizeof(errTxt) - bytes_left - 4 - 1;
+ assert(bytes_left >= 0);
strcat(errTxt, " -- ");
- strcat(errTxt, _db_errmsg);
- _db_errmsg[0] = 0;
+ strncat(errTxt, _db_errmsg, bytes_left);
}
+ _db_errmsg[0] = 0;
errTuple = Py_BuildValue("(is)", err, errTxt);
PyErr_SetObject(errObj, errTuple);
@@ -798,10 +805,12 @@ newDBObject(DBEnvObject* arg, int flags)
MYDB_BEGIN_ALLOW_THREADS;
err = db_create(&self->db, db_env, flags);
- self->db->set_errcall(self->db, _db_errorCallback);
+ if (self->db != NULL) {
+ self->db->set_errcall(self->db, _db_errorCallback);
#if (DBVER >= 33)
- self->db->app_private = (void*)self;
+ self->db->app_private = (void*)self;
#endif
+ }
MYDB_END_ALLOW_THREADS;
/* TODO add a weakref(self) to the self->myenvobj->open_child_weakrefs
* list so that a DBEnv can refuse to close without aborting any open
@@ -2681,12 +2690,13 @@ DB_set_encrypt(DBObject* self, PyObject* args, PyObject* kwargs)
/*-------------------------------------------------------------- */
/* Mapping and Dictionary-like access routines */
-Py_ssize_t DB_length(DBObject* self)
+Py_ssize_t DB_length(PyObject* _self)
{
int err;
Py_ssize_t size = 0;
int flags = 0;
void* sp;
+ DBObject* self = (DBObject*)_self;
if (self->db == NULL) {
PyObject *t = Py_BuildValue("(is)", 0, "DB object has been closed");
@@ -2720,6 +2730,8 @@ redo_stat_for_length:
*/
if (size == 0 && (flags & DB_FAST_STAT)) {
flags = 0;
+ if (!err)
+ free(sp);
goto redo_stat_for_length;
}
@@ -3864,7 +3876,7 @@ DBEnv_dbremove(DBEnvObject* self, PyObject* args, PyObject* kwargs)
static char* kwnames[] = { "file", "database", "txn", "flags",
NULL };
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss|Oi:dbremove", kwnames,
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|zOi:dbremove", kwnames,
&file, &database, &txnobj, &flags)) {
return NULL;
}
@@ -3892,7 +3904,7 @@ DBEnv_dbrename(DBEnvObject* self, PyObject* args, PyObject* kwargs)
static char* kwnames[] = { "file", "database", "newname", "txn",
"flags", NULL };
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sss|Oi:dbrename", kwnames,
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "szs|Oi:dbrename", kwnames,
&file, &database, &newname, &txnobj, &flags)) {
return NULL;
}
@@ -5153,11 +5165,7 @@ static PyMethodDef DB_methods[] = {
static PyMappingMethods DB_mapping = {
-#if (PY_VERSION_HEX < 0x02050000)
- (inquiry)DB_length, /*mp_length*/
-#else
- (lenfunc)DB_length, /*mp_length*/
-#endif
+ DB_length, /*mp_length*/
(binaryfunc)DB_subscript, /*mp_subscript*/
(objobjargproc)DB_ass_sub, /*mp_ass_subscript*/
};
@@ -5560,15 +5568,13 @@ DBEnv_construct(PyObject* self, PyObject* args)
static PyObject*
DBSequence_construct(PyObject* self, PyObject* args, PyObject* kwargs)
{
- PyObject* dbobj = NULL;
+ PyObject* dbobj;
int flags = 0;
static char* kwnames[] = { "db", "flags", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|i:DBSequence", kwnames, &dbobj, &flags))
return NULL;
- if (dbobj == Py_None)
- dbobj = NULL;
- else if (dbobj && !DBObject_Check(dbobj)) {
+ if (!DBObject_Check(dbobj)) {
makeTypeError("DB", dbobj);
return NULL;
}