Revert "Fix bssl client/server's error-handling."

This reverts commit e7ca8a5d78396388570df4d91058f6e170e8647f.

Change-Id: Ib2f923760dc54400f45e9327b3a45466be1dd6d1
Reviewed-on: https://boringssl-review.googlesource.com/28184
Reviewed-by: Steven Valdez <svaldez@google.com>
Commit-Queue: Steven Valdez <svaldez@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/tool/transport_common.cc b/tool/transport_common.cc
index dcb8e0d..55f2059 100644
--- a/tool/transport_common.cc
+++ b/tool/transport_common.cc
@@ -91,33 +91,6 @@
   }
 }
 
-static std::string GetLastSocketErrorString() {
-#if defined(OPENSSL_WINDOWS)
-  int error = WSAGetLastError();
-  char *buffer;
-  DWORD len = FormatMessageA(
-      FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, 0, error, 0,
-      reinterpret_cast<char *>(&buffer), 0, nullptr);
-  if (len == 0) {
-    char buf[256];
-    snprintf(buf, sizeof(buf), "unknown error (0x%x)", error);
-    return buf;
-  }
-  std::string ret(buffer, len);
-  LocalFree(buffer);
-  return ret;
-#else
-  return strerror(errno);
-#endif
-}
-
-static void PrintSocketError(const char *function) {
-  // On Windows, |perror| and |errno| are part of the C runtime, while sockets
-  // are separate, so we must print errors manually.
-  std::string error = GetLastSocketErrorString();
-  fprintf(stderr, "%s: %s\n", function, error.c_str());
-}
-
 // Connect sets |*out_sock| to be a socket connected to the destination given
 // in |hostname_and_port|, which should be of the form "www.example.com:123".
 // It returns true on success and false otherwise.
@@ -148,7 +121,7 @@
   *out_sock =
       socket(result->ai_family, result->ai_socktype, result->ai_protocol);
   if (*out_sock < 0) {
-    PrintSocketError("socket");
+    perror("socket");
     goto out;
   }
 
@@ -172,7 +145,7 @@
   }
 
   if (connect(*out_sock, result->ai_addr, result->ai_addrlen) != 0) {
-    PrintSocketError("connect");
+    perror("connect");
     goto out;
   }
   ok = true;
@@ -215,18 +188,18 @@
 
   server_sock_ = socket(addr.sin6_family, SOCK_STREAM, 0);
   if (server_sock_ < 0) {
-    PrintSocketError("socket");
+    perror("socket");
     return false;
   }
 
   if (setsockopt(server_sock_, SOL_SOCKET, SO_REUSEADDR, (const char *)&enable,
                  sizeof(enable)) < 0) {
-    PrintSocketError("setsockopt");
+    perror("setsockopt");
     return false;
   }
 
   if (bind(server_sock_, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
-    PrintSocketError("connect");
+    perror("connect");
     return false;
   }
 
@@ -377,7 +350,7 @@
 #else
   WSAEVENT socket_handle = WSACreateEvent();
   if (socket_handle == WSA_INVALID_EVENT ||
-      WSAEventSelect(sock, socket_handle, FD_READ | FD_CLOSE) != 0) {
+      WSAEventSelect(sock, socket_handle, FD_READ) != 0) {
     WSACloseEvent(socket_handle);
     return false;
   }
@@ -406,26 +379,11 @@
 #endif
 }
 
-void PrintSSLError(FILE *file, const char *msg, int ssl_err, int ret) {
-  switch (ssl_err) {
-    case SSL_ERROR_SSL:
-      fprintf(file, "%s: %s\n", msg, ERR_reason_error_string(ERR_peek_error()));
-      break;
-    case SSL_ERROR_SYSCALL:
-      if (ret == 0) {
-        fprintf(file, "%s: peer closed connection\n", msg);
-      } else {
-        std::string error = GetLastSocketErrorString();
-        fprintf(file, "%s: %s\n", msg, error.c_str());
-      }
-      break;
-    case SSL_ERROR_ZERO_RETURN:
-      fprintf(file, "%s: received close_notify\n", msg);
-      break;
-    default:
-      fprintf(file, "%s: unknown error type (%d)\n", msg, ssl_err);
-  }
-  ERR_print_errors_fp(file);
+// PrintErrorCallback is a callback function from OpenSSL's
+// |ERR_print_errors_cb| that writes errors to a given |FILE*|.
+int PrintErrorCallback(const char *str, size_t len, void *ctx) {
+  fwrite(str, len, 1, reinterpret_cast<FILE*>(ctx));
+  return 1;
 }
 
 bool TransferData(SSL *ssl, int sock) {
@@ -469,18 +427,17 @@
       }
 #endif
       int ssl_ret = SSL_write(ssl, buffer, n);
-      if (ssl_ret <= 0) {
-        int ssl_err = SSL_get_error(ssl, ssl_ret);
-        PrintSSLError(stderr, "Error while writing", ssl_err, ssl_ret);
-        return false;
-      } else if (ssl_ret != n) {
-        fprintf(stderr, "Short write from SSL_write.\n");
+      if (!SocketSetNonBlocking(sock, true)) {
         return false;
       }
 
-      // Note we handle errors before restoring the non-blocking state. On
-      // Windows, |SocketSetNonBlocking| internally clears the last error.
-      if (!SocketSetNonBlocking(sock, true)) {
+      if (ssl_ret <= 0) {
+        int ssl_err = SSL_get_error(ssl, ssl_ret);
+        fprintf(stderr, "Error while writing: %d\n", ssl_err);
+        ERR_print_errors_cb(PrintErrorCallback, stderr);
+        return false;
+      } else if (ssl_ret != n) {
+        fprintf(stderr, "Short write from SSL_write.\n");
         return false;
       }
     }
@@ -494,7 +451,8 @@
         if (ssl_err == SSL_ERROR_WANT_READ) {
           continue;
         }
-        PrintSSLError(stderr, "Error while reading", ssl_err, ssl_ret);
+        fprintf(stderr, "Error while reading: %d\n", ssl_err);
+        ERR_print_errors_cb(PrintErrorCallback, stderr);
         return false;
       } else if (ssl_ret == 0) {
         return true;