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