--- cyrus-sasl2.orig/saslauthd/auth_rimap.c
+++ cyrus-sasl2/saslauthd/auth_rimap.c
@@ -90,6 +90,7 @@ static struct addrinfo *ai = NULL;	/* re
 					   service we connect to.	 */
 #define TAG "saslauthd"			/* IMAP command tag */
 #define LOGIN_CMD (TAG " LOGIN ")	/* IMAP login command (with tag) */
+#define LOGOUT_CMD (TAG " LOGOUT ")	/* IMAP logout command (with tag)*/
 #define NETWORK_IO_TIMEOUT 30		/* network I/O timeout (seconds) */
 #define RESP_LEN 1000			/* size of read response buffer  */
 
@@ -307,10 +308,12 @@ auth_rimap (
     int	s=-1;				/* socket to remote auth host   */
     struct addrinfo *r;			/* remote socket address info   */
     struct iovec iov[5];		/* for sending LOGIN command    */
+    struct iovec iov2[1];               /* for sending LOGOUT command   */
     char *qlogin;			/* pointer to "quoted" login    */
     char *qpass;			/* pointer to "quoted" password */
     char *c;				/* scratch pointer              */
     int rc;				/* return code scratch area     */
+    int rcl;				/* return code scratch area     */
     char rbuf[RESP_LEN];		/* response read buffer         */
     char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
     int saved_errno;
@@ -505,6 +508,24 @@ auth_rimap (
            }
         }
     }
+
+    /* close remote imap */
+    iov2[0].iov_base = LOGOUT_CMD;
+    iov2[0].iov_len  = sizeof(LOGOUT_CMD) - 1;
+    iov2[1].iov_base = "\r\n";
+    iov2[1].iov_len  = sizeof("\r\n") - 1;
+
+    if (flags & VERBOSE) {
+        syslog(LOG_DEBUG, "auth_rimap: sending %s%s %s",
+               LOGOUT_CMD, qlogin, qpass);
+    }
+    alarm(NETWORK_IO_TIMEOUT);
+    rcl = retry_writev(s, iov2, 2);
+    alarm(0);
+    if (rcl == -1) {
+        syslog(LOG_WARNING, "auth_rimap: writev logout: %m");
+    }
+
     (void) close(s);			/* we're done with the remote */
     if (rc == -1) {
 	syslog(LOG_WARNING, "auth_rimap: read (response): %m");
