Line
Link Here
|
0 |
-- PAMmodule.c |
0 |
++ PAMmodule.c |
Lines 82-98
Link Here
|
82 |
Py_DECREF(respList); |
82 |
Py_DECREF(respList); |
83 |
return PAM_CONV_ERR; |
83 |
return PAM_CONV_ERR; |
84 |
} |
84 |
} |
85 |
|
85 |
|
86 |
*resp = (struct pam_response *) malloc( |
86 |
/* pam_conv(3) says we "should not set *resp" on PAM_CONV_ERR. |
|
|
87 |
* Some pam implementations will free it if we set it, others will not. |
88 |
* So at the very least we need to not leave it dangling if we error out, |
89 |
* but for robustness just only set it if we will exit successfully. |
90 |
*/ |
91 |
|
92 |
struct pam_response* myresp = (struct pam_response *) malloc( |
87 |
PyList_Size(respList) * sizeof(struct pam_response)); |
93 |
PyList_Size(respList) * sizeof(struct pam_response)); |
88 |
|
94 |
|
89 |
struct pam_response* spr = *resp; |
95 |
struct pam_response* spr = myresp; |
90 |
for (int i = 0; i < PyList_Size(respList); i++, spr++) { |
96 |
for (int i = 0; i < PyList_Size(respList); i++, spr++) { |
91 |
PyObject* respTuple = PyList_GetItem(respList, i); |
97 |
PyObject* respTuple = PyList_GetItem(respList, i); |
92 |
char* resp_text; |
98 |
char* resp_text; |
93 |
int resp_retcode = 0; |
99 |
int resp_retcode = 0; |
94 |
if (!PyArg_ParseTuple(respTuple, "si", &resp_text, &resp_retcode)) { |
100 |
if (!PyArg_ParseTuple(respTuple, "si", &resp_text, &resp_retcode)) { |
95 |
free(*resp); |
101 |
free(myresp); |
96 |
Py_DECREF(respList); |
102 |
Py_DECREF(respList); |
97 |
return PAM_CONV_ERR; |
103 |
return PAM_CONV_ERR; |
98 |
} |
104 |
} |
Lines 100-106
Link Here
|
100 |
spr->resp_retcode = resp_retcode; |
106 |
spr->resp_retcode = resp_retcode; |
101 |
Py_DECREF(respTuple); |
107 |
Py_DECREF(respTuple); |
102 |
} |
108 |
} |
103 |
|
109 |
|
|
|
110 |
*resp = myresp; |
104 |
// Save this so we can free it later. |
111 |
// Save this so we can free it later. |
105 |
self->response_data = *resp; |
112 |
self->response_data = *resp; |
106 |
self->response_len = PyList_Size(respList); |
113 |
self->response_len = PyList_Size(respList); |