]> granicus.if.org Git - python/commitdiff
[Patch #102827] Fix for PR#119558, avoiding core dumps by checking for
authorAndrew M. Kuchling <amk@amk.ca>
Fri, 15 Dec 2000 00:59:32 +0000 (00:59 +0000)
committerAndrew M. Kuchling <amk@amk.ca>
Fri, 15 Dec 2000 00:59:32 +0000 (00:59 +0000)
malloc() returning NULL

Modules/bsddbmodule.c

index 24d859b56448704e53764ed681837631191f5b82..35a22b993ddec8847f73f4ea8a1d0be41bb43d1a 100644 (file)
@@ -266,9 +266,10 @@ bsddb_subscript(bsddbobject *dp, PyObject *key)
        if (status == 0) {
                if (drec.size > sizeof(buf)) data = malloc(drec.size);
                else data = buf;
-               memcpy(data,drec.data,drec.size);
+               if (data!=NULL) memcpy(data,drec.data,drec.size);
        }
        BSDDB_END_SAVE(dp)
+       if (data==NULL) return PyErr_NoMemory();
        if (status != 0) {
                if (status < 0)
                        PyErr_SetFromErrno(BsddbError);
@@ -387,9 +388,10 @@ bsddb_keys(bsddbobject *dp, PyObject *args)
        if (status == 0) {
                if (krec.size > sizeof(buf)) data = malloc(krec.size);
                else data = buf;
-               memcpy(data,krec.data,krec.size);
+               if (data!=NULL) memcpy(data,krec.data,krec.size);
        }
        BSDDB_END_SAVE(dp)
+       if (data==NULL) return PyErr_NoMemory();
        while (status == 0) {
                item = PyString_FromStringAndSize(data, (int)krec.size);
                if (data != buf) free(data);
@@ -408,9 +410,10 @@ bsddb_keys(bsddbobject *dp, PyObject *args)
                if (status == 0) {
                        if (krec.size > sizeof(buf)) data = malloc(krec.size);
                        else data = buf;
-                       memcpy(data,krec.data,krec.size);
+                       if (data!=NULL) memcpy(data,krec.data,krec.size);
                }
                BSDDB_END_SAVE(dp)
+               if (data==NULL) return PyErr_NoMemory();
        }
        if (status < 0) {
                PyErr_SetFromErrno(BsddbError);
@@ -467,9 +470,10 @@ bsddb_set_location(bsddbobject *dp, PyObject *key)
        if (status == 0) {
                if (drec.size > sizeof(buf)) data = malloc(drec.size);
                else data = buf;
-               memcpy(data,drec.data,drec.size);
+               if (data!=NULL) memcpy(data,drec.data,drec.size);
        }
        BSDDB_END_SAVE(dp)
+       if (data==NULL) return PyErr_NoMemory();
        if (status != 0) {
                if (status < 0)
                        PyErr_SetFromErrno(BsddbError);
@@ -505,13 +509,18 @@ bsddb_seq(bsddbobject *dp, PyObject *args, int sequence_request)
        if (status == 0) {
                if (krec.size > sizeof(kbuf)) kdata = malloc(krec.size);
                else kdata = kbuf;
-               memcpy(kdata,krec.data,krec.size);
+               if (kdata!=NULL) memcpy(kdata,krec.data,krec.size);
                if (drec.size > sizeof(dbuf)) ddata = malloc(drec.size);
                else ddata = dbuf;
-               memcpy(ddata,drec.data,drec.size);
+               if (ddata!=NULL) memcpy(ddata,drec.data,drec.size);
        }
        BSDDB_END_SAVE(dp)
-       if (status != 0) {
+       if (status == 0) {
+               if ((kdata==NULL) || (ddata==NULL)) 
+                       return PyErr_NoMemory();
+       }
+       else { 
+               /* (status != 0) */  
                if (status < 0)
                        PyErr_SetFromErrno(BsddbError);
                else