From 2f91e22371fb2b7054e1576f6f85bde429cefec5 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Sat, 3 Dec 2016 20:58:16 +0100 Subject: [PATCH] fix LOGIN in SASL builds if AuthMechs includes more than just LOGIN and the server announces any AUTH= mechanism, we try SASL. but that can still fail to find any suitable authentication mechanism, and we must not error out in that case if we are supposed to fall back to LOGIN. --- src/drv_imap.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/drv_imap.c b/src/drv_imap.c index 4bc2fcc..5d77f08 100644 --- a/src/drv_imap.c +++ b/src/drv_imap.c @@ -1992,6 +1992,8 @@ imap_open_store_authenticate2( imap_store_t *ctx ) rc = sasl_client_new( "imap", srvc->sconf.host, NULL, NULL, NULL, 0, &ctx->sasl ); if (rc != SASL_OK) { + if (rc == SASL_NOMECH) + goto notsasl; if (!ctx->sasl) goto saslbail; error( "Error: %s\n", sasl_errdetail( ctx->sasl ) ); @@ -1999,6 +2001,8 @@ imap_open_store_authenticate2( imap_store_t *ctx ) } rc = sasl_client_start( ctx->sasl, saslmechs + 1, &interact, CAP(SASLIR) ? &out : NULL, &out_len, &gotmech ); + if (rc == SASL_NOMECH) + goto notsasl; if (gotmech) info( "Authenticating with SASL mechanism %s...\n", gotmech ); /* Technically, we are supposed to loop over sasl_client_start(), @@ -2017,6 +2021,8 @@ imap_open_store_authenticate2( imap_store_t *ctx ) imap_exec( ctx, cmd, done_sasl_auth, enc ? "AUTHENTICATE %s %s" : "AUTHENTICATE %s", gotmech, enc ); free( enc ); return; + notsasl: + sasl_dispose( &ctx->sasl ); } #endif if (auth_login) {