static int su_pam_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr) { if (suppress_pam_info && num_msg == 1 && msg && msg[0]->msg_style == PAM_TEXT_INFO) return PAM_SUCCESS; return misc_conv(num_msg, msg, resp, appdata_ptr); }
static int su_pam_conv(int num_msg, const struct pam_message** msg, struct pam_response** resp, void* appdata_ptr) { if (suppress_pam_info && num_msg == 1 && msg && msg[0]->msg_style == PAM_TEXT_INFO) { return PAM_SUCCESS; } #ifdef HAVE_SECURITY_PAM_MISC_H return misc_conv(num_msg, msg, resp, appdata_ptr); #elif defined(HAVE_SECURITY_OPENPAM_H) return openpam_ttyconv(num_msg, msg, resp, appdata_ptr); #endif }
int converse(int n, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr) { struct pam_response *aresp; char *ack = "OK"; int i; if (n <= 0 || n > PAM_MAX_NUM_MSG) return PAM_CONV_ERR; /* free in module if PAM_EX_DATA */ if ((aresp = calloc(n, sizeof *aresp)) == NULL) return PAM_BUF_ERR; for (i=0; i<n; ++i) { aresp[i].resp_retcode = 0; aresp[i].resp = NULL; if (msg[i]->msg_style == PAM_EX_DATA) { data = (struct pam_user *)msg[i]->msg; if (data == NULL) goto fail; aresp[i].resp = ack; } } if (data) { *resp = aresp; return PAM_SUCCESS; } F(aresp); return misc_conv(n, msg, resp, appdata_ptr); fail: for (i = 0; i < n; ++i) { if (aresp[i].resp != NULL) { memset(aresp[i].resp, 0, strlen(aresp[i].resp)); F(aresp[i].resp); } } memset(aresp, 0, n * sizeof *aresp); F(aresp); *resp = NULL; return PAM_CONV_ERR; }