Fix dovecot with empty 334 challenge.
authorPhil Pennock <pdp@exim.org>
Mon, 30 Sep 2013 04:57:07 +0000 (00:57 -0400)
committerPhil Pennock <pdp@exim.org>
Mon, 30 Sep 2013 04:57:07 +0000 (00:57 -0400)
Thomas Morper reported, with 4.82RC1, that he saw "334 NULL" as the
challenge when using AUTH PLAIN to Dovecot when the client does not send
an initial response.  I could replicate.

This was caused by commit 3f1df0e3 on 2012-11-19 (PP/13 of 4.82); I was
too cautious in the robustness fixes; the clue came in this line of
debug output:

    76430 dovecot: warning: ignoring trailing tab

This change removes that check, and documents in a comment that this
input is acceptable protocol-wise, and why.

With this fix:

    AUTH PLAIN
    334
    AGZyZWRlcmljAGh1bXB0eS1kdW1wdHk=
    235 Authentication succeeded

src/src/auths/dovecot.c

index 032a089..94b3152 100644 (file)
@@ -118,7 +118,6 @@ static int
 strcut(uschar *str, uschar **ptrs, int nptrs)
 {
        uschar *last_sub_start = str;
 strcut(uschar *str, uschar **ptrs, int nptrs)
 {
        uschar *last_sub_start = str;
-       uschar *lastvalid = str + Ustrlen(str);
        int n;
 
        for (n = 0; n < nptrs; n++)
        int n;
 
        for (n = 0; n < nptrs; n++)
@@ -137,16 +136,14 @@ strcut(uschar *str, uschar **ptrs, int nptrs)
                str++;
        }
 
                str++;
        }
 
-       if (last_sub_start < lastvalid) {
-              if (n <= nptrs) {
-                       *ptrs = last_sub_start;
-               } else {
-                       HDEBUG(D_auth) debug_printf("dovecot: warning: too many results from tab-splitting; saw %d fields, room for %d\n", n, nptrs);
-                       n = nptrs;
-              }
+       /* It's acceptable for the string to end with a tab character.  We see
+       this in AUTH PLAIN without an initial response from the client, which
+       causing us to send "334 " and get the data from the client. */
+       if (n <= nptrs) {
+               *ptrs = last_sub_start;
        } else {
        } else {
-              n--;
-              HDEBUG(D_auth) debug_printf("dovecot: warning: ignoring trailing tab\n");
+               HDEBUG(D_auth) debug_printf("dovecot: warning: too many results from tab-splitting; saw %d fields, room for %d\n", n, nptrs);
+               n = nptrs;
        }
 
        return n <= nptrs ? n : nptrs;
        }
 
        return n <= nptrs ? n : nptrs;