You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.7 KiB
96 lines
2.7 KiB
6 years ago
|
--- netkit-rsh-0.17/rexecd/rexecd.c.pam-conv 2005-10-13 18:42:54.000000000 +0200
|
||
|
+++ netkit-rsh-0.17/rexecd/rexecd.c 2005-10-13 18:45:30.000000000 +0200
|
||
|
@@ -178,47 +178,51 @@
|
||
|
static char *PAM_username;
|
||
|
static char *PAM_password;
|
||
|
|
||
|
-static int PAM_conv (int num_msg,
|
||
|
- const struct pam_message **msg,
|
||
|
- struct pam_response **resp,
|
||
|
- void *appdata_ptr) {
|
||
|
- int count = 0, replies = 0;
|
||
|
- struct pam_response *reply = NULL;
|
||
|
- int size = sizeof(struct pam_response);
|
||
|
-
|
||
|
- #define GET_MEM if (reply) realloc(reply, size); else reply = malloc(size); \
|
||
|
- if (!reply) return PAM_CONV_ERR; \
|
||
|
- size += sizeof(struct pam_response)
|
||
|
- #define COPY_STRING(s) (s) ? strdup(s) : NULL
|
||
|
-
|
||
|
- for (count = 0; count < num_msg; count++) {
|
||
|
- GET_MEM;
|
||
|
- switch (msg[count]->msg_style) {
|
||
|
- case PAM_PROMPT_ECHO_ON:
|
||
|
- reply[replies].resp_retcode = PAM_SUCCESS;
|
||
|
- reply[replies++].resp = COPY_STRING(PAM_username);
|
||
|
- /* PAM frees resp */
|
||
|
- break;
|
||
|
- case PAM_PROMPT_ECHO_OFF:
|
||
|
- reply[replies].resp_retcode = PAM_SUCCESS;
|
||
|
- reply[replies++].resp = COPY_STRING(PAM_password);
|
||
|
- /* PAM frees resp */
|
||
|
- break;
|
||
|
- case PAM_TEXT_INFO:
|
||
|
- reply[replies].resp_retcode = PAM_SUCCESS;
|
||
|
- reply[replies++].resp = NULL;
|
||
|
- /* ignore it... */
|
||
|
- break;
|
||
|
- case PAM_ERROR_MSG:
|
||
|
- reply[replies].resp_retcode = PAM_SUCCESS;
|
||
|
- reply[replies++].resp = NULL;
|
||
|
- /* Must be an error of some sort... */
|
||
|
- default:
|
||
|
- return PAM_CONV_ERR;
|
||
|
- }
|
||
|
- }
|
||
|
- if (reply) *resp = reply;
|
||
|
- return PAM_SUCCESS;
|
||
|
+static int
|
||
|
+PAM_conv(int num_msg, const struct pam_message **msg,
|
||
|
+ struct pam_response **response, void *appdata_ptr)
|
||
|
+{
|
||
|
+ struct pam_response *pr;
|
||
|
+ const struct pam_message *pm;
|
||
|
+ int n;
|
||
|
+
|
||
|
+ if ((*response = malloc(num_msg * sizeof(struct pam_response))) == NULL)
|
||
|
+ return(PAM_CONV_ERR);
|
||
|
+ memset(*response, 0, num_msg * sizeof(struct pam_response));
|
||
|
+
|
||
|
+ for (pr = *response, pm = *msg, n = num_msg; n--; pr++, pm++)
|
||
|
+ {
|
||
|
+ switch (pm->msg_style) {
|
||
|
+ case PAM_PROMPT_ECHO_ON:
|
||
|
+ /* XXX: why not pam_set_item(PAM_RUSER) ? */
|
||
|
+ pr->resp_retcode = PAM_SUCCESS;
|
||
|
+ pr->resp = PAM_username ? strdup(PAM_username) : NULL;
|
||
|
+ /* PAM frees resp */
|
||
|
+ break;
|
||
|
+ case PAM_PROMPT_ECHO_OFF:
|
||
|
+ pr->resp_retcode = PAM_SUCCESS;
|
||
|
+ pr->resp = PAM_password ? strdup(PAM_password) : NULL;
|
||
|
+ /* PAM frees resp */
|
||
|
+ break;
|
||
|
+ case PAM_TEXT_INFO:
|
||
|
+ case PAM_ERROR_MSG:
|
||
|
+ /* ignore it... */
|
||
|
+ pr->resp_retcode = PAM_SUCCESS;
|
||
|
+ pr->resp = NULL;
|
||
|
+ break;
|
||
|
+ default:
|
||
|
+ /* Zero and free allocated memory and return an error. */
|
||
|
+ for (pr = *response, n = num_msg; n--; pr++)
|
||
|
+ {
|
||
|
+ if (pr->resp)
|
||
|
+ free(pr->resp);
|
||
|
+ }
|
||
|
+ free(*response);
|
||
|
+ *response = NULL;
|
||
|
+ return(PAM_CONV_ERR);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ return PAM_SUCCESS;
|
||
|
}
|
||
|
|
||
|
static struct pam_conv PAM_conversation = {
|