Password containing backslashes need to have them doubled to have them properly 
interpreted by the imap server.

A password terminating with a blackslash used to trigger this error:
IMAP command 'LOGIN <user> <pass>' returned response (BAD) - Missing '"'

Signed-off-by: Nicolas Morey-Chaisemartin <nico...@morey-chaisemartin.com>
---
 imap-send.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/imap-send.c b/imap-send.c
index b2d0b849b..7fde6ec96 100644
--- a/imap-send.c
+++ b/imap-send.c
@@ -926,6 +926,32 @@ static int auth_cram_md5(struct imap_store *ctx, struct 
imap_cmd *cmd, const cha
        return 0;
 }
 
+static char* imap_escape_password(const char *passwd)
+{
+       const unsigned passwd_len = strlen(passwd);
+       char *escaped = xmalloc(2 * passwd_len + 1);
+       const char *passwd_cur = passwd;
+       char *escaped_cur = escaped;
+
+       do {
+               char *next = strchr(passwd_cur, '\\');
+
+               if (!next) {
+                       strcpy(escaped_cur, passwd_cur);
+               } else {
+                       int len = next - passwd_cur + 1;
+
+                       memcpy(escaped_cur, passwd_cur, len);
+                       escaped_cur += len;
+                       next++;
+                       *(escaped_cur++) = '\\';
+               }
+               passwd_cur = next;
+       } while(passwd_cur);
+
+       return escaped;
+}
+
 static struct imap_store *imap_open_store(struct imap_server_conf *srvc, char 
*folder)
 {
        struct credential cred = CREDENTIAL_INIT;
@@ -1090,7 +1116,7 @@ static struct imap_store *imap_open_store(struct 
imap_server_conf *srvc, char *f
                        if (!srvc->user)
                                srvc->user = xstrdup(cred.username);
                        if (!srvc->pass)
-                               srvc->pass = xstrdup(cred.password);
+                               srvc->pass = 
imap_escape_password(cred.password);
                }
 
                if (srvc->auth_method) {

Reply via email to