--- libpam-krb5-1.2.0.org/compat_mit.c	2005-09-28 01:33:51.000000000 +0200
+++ libpam-krb5-1.2.0/compat_mit.c	2006-09-02 23:22:52.000000000 +0200
@@ -34,7 +34,7 @@
     int		pam_prompts = num_prompts;
     int		pamret, i;
 
-    struct pam_message	*msg;
+    struct pam_message	**msg;
     struct pam_response	*resp = NULL;
     struct pam_conv	*conv;
     pam_handle_t	*pamh = (pam_handle_t *) data;
@@ -48,43 +48,56 @@
     if (banner)
 	pam_prompts++;
 
-    msg = calloc(sizeof(struct pam_message) * pam_prompts, 1);
+    /* alocate pointers to pam_message structs, pam_prompts many */
+
+    msg = calloc(pam_prompts, sizeof(msg));
     if (!msg)
 	return ENOMEM;
 
+    /* allocate the pam_message structs, pam_prompts many  */
+
+    *msg=calloc(pam_prompts,sizeof(struct pam_message));
+
+    /* and point the pointers to these slots *
+     * (pointer 0 is already initialized)    */
+
+    for (i = 1; i < pam_prompts; i++) {
+        msg[i]=msg[0]+i;
+    }
+
     /* Now use pam_prompts as an index */
     pam_prompts = 0;
 
     /* Sigh. malloc all the prompts. */
     if (name) {
-	msg[pam_prompts].msg = malloc(strlen(name) + 1);
-	if (!msg[pam_prompts].msg)
+	msg[pam_prompts]->msg = malloc(strlen(name) + 1);
+	if (!msg[pam_prompts]->msg)
 	    goto cleanup;
-	strcpy((char *) msg[pam_prompts].msg, name);
-	msg[pam_prompts].msg_style = PAM_TEXT_INFO;
+	strcpy((char *) msg[pam_prompts]->msg, name);
+	msg[pam_prompts]->msg_style = PAM_TEXT_INFO;
 	pam_prompts++;
     }
 
     if (banner) {
-	msg[pam_prompts].msg = malloc(strlen(banner) + 1);
-	if (!msg[pam_prompts].msg)
+	msg[pam_prompts]->msg = malloc(strlen(banner) + 1);
+	if (!msg[pam_prompts]->msg)
 	    goto cleanup;
-	strcpy((char *) msg[pam_prompts].msg, banner);
-	msg[pam_prompts].msg_style = PAM_TEXT_INFO;
+	strcpy((char *) msg[pam_prompts]->msg, banner);
+	msg[pam_prompts]->msg_style = PAM_TEXT_INFO;
 	pam_prompts++;
     }
 
     for (i = 0; i < num_prompts; i++) {
-	msg[pam_prompts].msg = malloc(strlen(prompts[i].prompt) + 3);
-	if (!msg[pam_prompts].msg)
+	msg[pam_prompts]->msg = malloc(strlen(prompts[i].prompt) + 3);
+	if (!msg[pam_prompts]->msg)
 	    goto cleanup;
-	sprintf((char *) msg[pam_prompts].msg, "%s: ", prompts[i].prompt);
-	msg[pam_prompts].msg_style = prompts[i].hidden ? PAM_PROMPT_ECHO_OFF
+	sprintf((char *) msg[pam_prompts]->msg, "%s: ", prompts[i].prompt);
+	msg[pam_prompts]->msg_style = prompts[i].hidden ? PAM_PROMPT_ECHO_OFF
 						       : PAM_PROMPT_ECHO_ON;
 	pam_prompts++;
     }
 
-    if ((pamret = conv->conv(pam_prompts, (const struct pam_message **) &msg, 
+    if ((pamret = conv->conv(pam_prompts, (const struct pam_message **) msg, 
       &resp, conv->appdata_ptr)) != 0)
 	goto cleanup;
 
@@ -117,9 +130,14 @@
     /* pam_prompts is correct at this point */
 
     for (i = 0; i < pam_prompts; i++) {
-	if (msg[i].msg)
-	    free((char *) msg[i].msg);
+	if (msg[i]->msg)
+	    free((char *) msg[i]->msg);
     }
+
+    /* free the pam_message structs */
+    free(*msg);
+
+    /* free the corresponding pointers */
     free(msg);
 
     if (resp) {
