db76890
--- netkit-rsh-0.17/rexecd/rexecd.c.pam-conv	2005-10-13 18:42:54.000000000 +0200
db76890
+++ netkit-rsh-0.17/rexecd/rexecd.c	2005-10-13 18:45:30.000000000 +0200
db76890
@@ -178,47 +178,51 @@
db76890
 static char *PAM_username;
db76890
 static char *PAM_password;
db76890
 
db76890
-static int PAM_conv (int num_msg,
db76890
-		     const struct pam_message **msg,
db76890
-		     struct pam_response **resp,
db76890
-		     void *appdata_ptr) {
db76890
-  int count = 0, replies = 0;
db76890
-  struct pam_response *reply = NULL;
db76890
-  int size = sizeof(struct pam_response);
db76890
-
db76890
-  #define GET_MEM if (reply) realloc(reply, size); else reply = malloc(size); \
db76890
-  if (!reply) return PAM_CONV_ERR; \
db76890
-  size += sizeof(struct pam_response)
db76890
-  #define COPY_STRING(s) (s) ? strdup(s) : NULL
db76890
-
db76890
-  for (count = 0; count < num_msg; count++) {
db76890
-    GET_MEM;
db76890
-    switch (msg[count]->msg_style) {
db76890
-      case PAM_PROMPT_ECHO_ON:
db76890
-	reply[replies].resp_retcode = PAM_SUCCESS;
db76890
-	reply[replies++].resp = COPY_STRING(PAM_username);
db76890
-	  /* PAM frees resp */
db76890
-	break;
db76890
-      case PAM_PROMPT_ECHO_OFF:
db76890
-	reply[replies].resp_retcode = PAM_SUCCESS;
db76890
-	reply[replies++].resp = COPY_STRING(PAM_password);
db76890
-	  /* PAM frees resp */
db76890
-	break;
db76890
-      case PAM_TEXT_INFO:
db76890
-	reply[replies].resp_retcode = PAM_SUCCESS;
db76890
-	reply[replies++].resp = NULL;
db76890
-	/* ignore it... */
db76890
-	break;
db76890
-      case PAM_ERROR_MSG:
db76890
-	reply[replies].resp_retcode = PAM_SUCCESS;
db76890
-	reply[replies++].resp = NULL;
db76890
-	/* Must be an error of some sort... */
db76890
-      default:
db76890
-	return PAM_CONV_ERR;
db76890
-    }
db76890
-  }
db76890
-  if (reply) *resp = reply;
db76890
-  return PAM_SUCCESS;
db76890
+static int
db76890
+PAM_conv(int num_msg, const struct pam_message **msg, 
db76890
+		struct pam_response **response, void *appdata_ptr)
db76890
+{
db76890
+	struct pam_response *pr;
db76890
+	const struct pam_message *pm;
db76890
+	int n;
db76890
+
db76890
+	if ((*response = malloc(num_msg * sizeof(struct pam_response))) == NULL)
db76890
+		return(PAM_CONV_ERR);
db76890
+	memset(*response, 0, num_msg * sizeof(struct pam_response));
db76890
+
db76890
+	for (pr = *response, pm = *msg, n = num_msg; n--; pr++, pm++) 
db76890
+	{
db76890
+		switch (pm->msg_style) {
db76890
+		case PAM_PROMPT_ECHO_ON:
db76890
+			/* XXX: why not pam_set_item(PAM_RUSER) ? */
db76890
+			pr->resp_retcode = PAM_SUCCESS;
db76890
+			pr->resp = PAM_username ? strdup(PAM_username) : NULL;
db76890
+			/* PAM frees resp */
db76890
+			break;
db76890
+		case PAM_PROMPT_ECHO_OFF:
db76890
+			pr->resp_retcode = PAM_SUCCESS;
db76890
+			pr->resp = PAM_password ? strdup(PAM_password) : NULL;
db76890
+			/* PAM frees resp */
db76890
+			break;
db76890
+		case PAM_TEXT_INFO:
db76890
+		case PAM_ERROR_MSG:
db76890
+			/* ignore it... */
db76890
+			pr->resp_retcode = PAM_SUCCESS;
db76890
+			pr->resp = NULL;
db76890
+			break;
db76890
+		default:
db76890
+			/* Zero and free allocated memory and return an error. */
db76890
+			for (pr = *response, n = num_msg; n--; pr++) 
db76890
+			{
db76890
+				if (pr->resp)
db76890
+					free(pr->resp);
db76890
+			}
db76890
+			free(*response);
db76890
+			*response = NULL;
db76890
+			return(PAM_CONV_ERR);
db76890
+		}
db76890
+	}
db76890
+	return PAM_SUCCESS;
db76890
 }
db76890
 
db76890
 static struct pam_conv PAM_conversation = {