Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 407603
Collapse All | Expand All

(-)file_not_specified_in_diff (-6 / +13 lines)
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);

Return to bug 407603