Handle negative reply for NNTP STARTTLS in s_client
authorRobert Scheck <robert@fedoraproject.org>
Tue, 14 Feb 2017 20:47:25 +0000 (21:47 +0100)
committerRich Salz <rsalz@openssl.org>
Thu, 16 Feb 2017 01:28:44 +0000 (20:28 -0500)
Reviewed-by: Andy Polyakov <appro@openssl.org>
Reviewed-by: Rich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/2629)

apps/s_client.c

index 6d960128f572715221ab054d0403259d4fcd33a3..2db985daf329d2898f562d14e03bef5c03419d5a 100644 (file)
@@ -2218,7 +2218,16 @@ int s_client_main(int argc, char **argv)
                            "Didn't find STARTTLS in server response,"
                            " trying anyway...\n");
             BIO_printf(sbio, "STARTTLS\r\n");
                            "Didn't find STARTTLS in server response,"
                            " trying anyway...\n");
             BIO_printf(sbio, "STARTTLS\r\n");
-            BIO_read(sbio, sbuf, BUFSIZZ);
+            mbuf_len = BIO_read(sbio, mbuf, BUFSIZZ);
+            if (mbuf_len < 0) {
+                BIO_printf(bio_err, "BIO_read failed\n");
+                goto end;
+            }
+            mbuf[mbuf_len] = '\0';
+            if (strstr(mbuf, "382") == NULL) {
+                BIO_printf(bio_err, "STARTTLS failed: %s", mbuf);
+                goto shut;
+            }
         }
         break;
     case PROTO_SIEVE:
         }
         break;
     case PROTO_SIEVE:
@@ -2252,15 +2261,16 @@ int s_client_main(int argc, char **argv)
             if (mbuf_len < 0) {
                 BIO_printf(bio_err, "BIO_read failed\n");
                 goto end;
             if (mbuf_len < 0) {
                 BIO_printf(bio_err, "BIO_read failed\n");
                 goto end;
-            } else if (mbuf_len < 2) {
-                BIO_printf(bio_err, "Server does not support STARTTLS.\n");
+            }
+            mbuf[mbuf_len] = '\0';
+            if (mbuf_len < 2) {
+                BIO_printf(bio_err, "STARTTLS failed: %s", mbuf);
                 goto shut;
             }
             /*
              * According to RFC 5804 § 2.2, response codes are case-
              * insensitive, make it uppercase but preserve the response.
              */
                 goto shut;
             }
             /*
              * According to RFC 5804 § 2.2, response codes are case-
              * insensitive, make it uppercase but preserve the response.
              */
-            mbuf[mbuf_len] = '\0';
             strncpy(sbuf, mbuf, 2);
             make_uppercase(sbuf);
             if (strncmp(sbuf, "OK", 2) != 0) {
             strncpy(sbuf, mbuf, 2);
             make_uppercase(sbuf);
             if (strncmp(sbuf, "OK", 2) != 0) {