3203dca
diff -up PyPAM-0.5.0/PAMmodule.c.memory PyPAM-0.5.0/PAMmodule.c
c34a70a
--- PyPAM-0.5.0/PAMmodule.c.memory	2012-05-07 17:22:54.503914026 +0200
c34a70a
+++ PyPAM-0.5.0/PAMmodule.c	2012-05-07 17:23:15.644381942 +0200
c34a70a
@@ -37,33 +37,48 @@ static void PyPAM_Err(PyPAMObject *self,
c34a70a
 
c34a70a
     err_msg = pam_strerror(self->pamh, result);
c34a70a
     error = Py_BuildValue("(si)", err_msg, result);
c34a70a
-    Py_INCREF(PyPAM_Error);
c34a70a
     PyErr_SetObject(PyPAM_Error, error);
c34a70a
+    Py_XDECREF(error);
c34a70a
 }
c34a70a
 
3203dca
 static int PyPAM_conv(int num_msg, const struct pam_message **msg,
3203dca
     struct pam_response **resp, void *appdata_ptr)
3203dca
 {
3203dca
-    PyObject                *args;
3203dca
-
3203dca
+    PyObject *args, *msgList, *respList, *item;
3203dca
+    struct pam_response *response, *spr;
3203dca
     PyPAMObject* self = (PyPAMObject *) appdata_ptr;
3203dca
+
3203dca
     if (self->callback == NULL)
3203dca
         return PAM_CONV_ERR;
3203dca
 
3203dca
     Py_INCREF(self);
3203dca
 
3203dca
-    PyObject* msgList = PyList_New(num_msg);
3203dca
-    
3203dca
+    msgList = PyList_New(num_msg);
3203dca
+    if (msgList == NULL) {
3203dca
+        Py_DECREF(self);
3203dca
+        return PAM_CONV_ERR;
3203dca
+    }
3203dca
+
3203dca
     for (int i = 0; i < num_msg; i++) {
3203dca
-        PyList_SetItem(msgList, i,
3203dca
-            Py_BuildValue("(si)", msg[i]->msg, msg[i]->msg_style));
3203dca
+        item = Py_BuildValue("(si)", msg[i]->msg, msg[i]->msg_style);
3203dca
+        if (item == NULL) {
3203dca
+            Py_DECREF(msgList);
3203dca
+            Py_DECREF(self);
3203dca
+            return PAM_CONV_ERR;
3203dca
+        }
3203dca
+        PyList_SetItem(msgList, i, item);
3203dca
     }
3203dca
-    
3203dca
+
3203dca
     args = Py_BuildValue("(OO)", self, msgList);
3203dca
-    PyObject* respList = PyEval_CallObject(self->callback, args);
3203dca
+    if (args == NULL) {
3203dca
+        Py_DECREF(self);
3203dca
+	Py_DECREF(msgList);
3203dca
+        return PAM_CONV_ERR;
3203dca
+    }
3203dca
+    respList = PyEval_CallObject(self->callback, args);
3203dca
     Py_DECREF(args);
3203dca
     Py_DECREF(self);
3203dca
-    
3203dca
+
3203dca
     if (respList == NULL)
3203dca
         return PAM_CONV_ERR;
3203dca
 
3203dca
@@ -71,11 +86,15 @@ static int PyPAM_conv(int num_msg, const
3203dca
         Py_DECREF(respList);
3203dca
         return PAM_CONV_ERR;
3203dca
     }
3203dca
-    
3203dca
-    *resp = (struct pam_response *) malloc(
3203dca
+
3203dca
+    response = (struct pam_response *) malloc(
3203dca
         PyList_Size(respList) * sizeof(struct pam_response));
3203dca
+    if (response == NULL) {
3203dca
+        Py_DECREF(respList);
3203dca
+        return PAM_CONV_ERR;
3203dca
+    }
3203dca
+    spr = response;
3203dca
 
3203dca
-    struct pam_response* spr = *resp;
3203dca
     for (int i = 0; i < PyList_Size(respList); i++, spr++) {
3203dca
         PyObject* respTuple = PyList_GetItem(respList, i);
3203dca
         char* resp_text;
3203dca
@@ -85,7 +104,7 @@ static int PyPAM_conv(int num_msg, const
3203dca
                 free((--spr)->resp);
3203dca
                 --i;
3203dca
             }
3203dca
-            free(*resp);
3203dca
+            free(response);
3203dca
             Py_DECREF(respList);
3203dca
             return PAM_CONV_ERR;
3203dca
         }
3203dca
@@ -95,7 +114,8 @@ static int PyPAM_conv(int num_msg, const
3203dca
     }
3203dca
 
3203dca
     Py_DECREF(respList);
3203dca
-    
3203dca
+    *resp = response;
3203dca
+
3203dca
     return PAM_SUCCESS;
3203dca
 }
3203dca
 
3203dca
@@ -122,7 +142,11 @@ static PyObject * PyPAM_pam(PyObject *se
3203dca
     PyPAMObject_Type.ob_type = &PyType_Type;
3203dca
     p = (PyPAMObject *) PyObject_NEW(PyPAMObject, &PyPAMObject_Type);
3203dca
 
3203dca
+    if (p == NULL)
3203dca
+        return NULL;
3203dca
+
3203dca
     if ((spc = (struct pam_conv *) malloc(sizeof(struct pam_conv))) == NULL) {
3203dca
+        Py_DECREF((PyObject *)p);
3203dca
         PyErr_SetString(PyExc_MemoryError, "out of memory");
3203dca
         return NULL;
3203dca
     }
3203dca
@@ -455,9 +479,15 @@ static PyObject * PyPAM_getenvlist(PyObj
3203dca
     }
3203dca
     
3203dca
     retval = PyList_New(0);
3203dca
+    if (retval == NULL)
3203dca
+	return NULL;
3203dca
     
3203dca
     while ((cp = *(result++)) != NULL) {
3203dca
         entry = Py_BuildValue("s", cp);
3203dca
+        if (entry == NULL) {
3203dca
+            Py_DECREF(retval);
3203dca
+            return NULL;
3203dca
+        }
3203dca
         PyList_Append(retval, entry);
3203dca
         Py_DECREF(entry);
3203dca
     }