$OpenBSD: patch-ext_imap_php_imap_c,v 1.3 2001/03/08 22:58:27 avsm Exp $

This is a backport from PHP-4.0.5-dev to fix imap-ssl linking
(to simplify the patches, it assumes OpenSSL is present)
and fix a buffer overflow in the username/password handling.
- avsm

--- ext/imap/php_imap.c.orig	Wed Oct 25 17:43:52 2000
+++ ext/imap/php_imap.c	Tue Mar  6 08:47:56 2001
@@ -71,7 +71,7 @@ void *fs_get(size_t size);
 int imap_mail(char *to, char *subject, char *message, char *headers, char *cc, char *bcc, char *rpath);
 
 
-void mail_close_it(zend_rsrc_list_entry *rsrc);
+void mail_close_it (zend_rsrc_list_entry *rsrc);
 #ifdef OP_RELOGIN
 /* AJS: close persistent connection */
 void mail_userlogout_it(zend_rsrc_list_entry *rsrc);
@@ -183,7 +183,19 @@ extern char imsp_password[80];
 void mail_close_it(zend_rsrc_list_entry *rsrc)
 {
 	pils *imap_le_struct = (pils *)rsrc->ptr;
+	IMAPLS_FETCH();
+
 	mail_close_full(imap_le_struct->imap_stream, imap_le_struct->flags);
+
+	if (IMAPG(imap_user)) {
+		efree(IMAPG(imap_user));
+		IMAPG(imap_user) = 0;
+	}
+	if (IMAPG(imap_password)) {
+		efree(IMAPG(imap_password));
+		IMAPG(imap_password) = 0;
+	}
+
 	efree(imap_le_struct);
 }
 
@@ -411,6 +423,8 @@ PHP_MINIT_FUNCTION(imap)
 	mail_link(&newsdriver);      /* link in the news driver */
 	mail_link(&philedriver);     /* link in the phile driver */
 	auth_link(&auth_log);        /* link in the log authenticator */
+	ssl_onceonlyinit();
+	auth_link (&auth_ssl);       /* link in the ssl authenticator */
 #endif
 	mail_link(&dummydriver);     /* link in the dummy driver */
 #else
@@ -633,6 +647,14 @@ void imap_do_open(INTERNAL_FUNCTION_PARA
 		}
 	}
 
+	if (IMAPG(imap_user)) { 
+		efree(IMAPG(imap_user));
+	}
+
+	if (IMAPG(imap_password)) { 
+		efree(IMAPG(imap_password));
+	}
+
 	IMAPG(imap_user)     = estrndup(Z_STRVAL_PP(user), Z_STRLEN_PP(user));
 	IMAPG(imap_password) = estrndup(Z_STRVAL_PP(passwd), Z_STRLEN_PP(passwd));
 	
@@ -712,6 +734,8 @@ void imap_do_open(INTERNAL_FUNCTION_PARA
 				}
  			}
 			efree(hashed_details);
+			efree(IMAPG(imap_user)); IMAPG(imap_user) = 0;
+			efree(IMAPG(imap_password)); IMAPG(imap_password) = 0;
 			RETURN_FALSE;
 		}
 
@@ -721,6 +745,8 @@ void imap_do_open(INTERNAL_FUNCTION_PARA
 			node = malloc(sizeof(pils));
 			if (node == NULL) {
 				efree(hashed_details);
+				efree(IMAPG(imap_user)); IMAPG(imap_user) = 0;
+				efree(IMAPG(imap_password)); IMAPG(imap_password) = 0;
 				RETURN_FALSE;
 			}
 
@@ -757,6 +783,8 @@ void imap_do_open(INTERNAL_FUNCTION_PARA
 
 			free(headp);
 			efree(hashed_details);
+			efree(IMAPG(imap_user)); IMAPG(imap_user) = 0;
+			efree(IMAPG(imap_password)); IMAPG(imap_password) = 0;
  			RETURN_FALSE;
 		}
 
@@ -766,11 +794,11 @@ void imap_do_open(INTERNAL_FUNCTION_PARA
 	} else {
 #endif
 		imap_stream = mail_open(NIL, Z_STRVAL_PP(mailbox), flags);
-		efree(IMAPG(imap_user));
-		efree(IMAPG(imap_password));
 
 		if (imap_stream == NIL) {
 			php_error(E_WARNING, "Couldn't open stream %s\n", (*mailbox)->value.str.val);
+			efree(IMAPG(imap_user)); IMAPG(imap_user) = 0;
+			efree(IMAPG(imap_password)); IMAPG(imap_password) = 0;
 			RETURN_FALSE;
 		}
 
