Browse Source

Fix OpenSSL error handling

Paul-Louis Ageneau 2 years ago
parent
commit
e017c7e873
2 changed files with 26 additions and 10 deletions
  1. 25 9
      src/impl/tls.cpp
  2. 1 1
      src/impl/tls.hpp

+ 25 - 9
src/impl/tls.cpp

@@ -85,24 +85,33 @@ void init() {
 	}
 }
 
-string error_string(unsigned long err) {
+string error_string(unsigned long error) {
 	const size_t bufferSize = 256;
 	char buffer[bufferSize];
-	ERR_error_string_n(err, buffer, bufferSize);
+	ERR_error_string_n(error, buffer, bufferSize);
 	return string(buffer);
 }
 
 bool check(int success, const string &message) {
-	if (success)
+	unsigned long last_error = ERR_peek_last_error();
+	ERR_clear_error();
+
+	if (success > 0)
 		return true;
 
-	string str = error_string(ERR_get_error());
-	PLOG_ERROR << message << ": " << str;
-	throw std::runtime_error(message + ": " + str);
+	string str = message;
+	if (last_error != 0)
+		str += ": " + error_string(last_error);
+
+	PLOG_ERROR << str;
+	throw std::runtime_error(str);
 }
 
 bool check(SSL *ssl, int ret, const string &message) {
-	unsigned long err = SSL_get_error(ssl, ret);
+	unsigned long last_error = ERR_peek_last_error();
+	ERR_clear_error();
+
+	int err = SSL_get_error(ssl, ret);
 	if (err == SSL_ERROR_NONE || err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {
 		return true;
 	}
@@ -110,9 +119,16 @@ bool check(SSL *ssl, int ret, const string &message) {
 		PLOG_DEBUG << "OpenSSL connection cleanly closed";
 		return false;
 	}
-	string str = error_string(err);
+
+	string str = message;
+	if (err == SSL_ERROR_SYSCALL) {
+		str += ": fatal I/O error";
+	} else if (err == SSL_ERROR_SSL) {
+		if (last_error != 0)
+			str += ": " + error_string(last_error);
+	}
 	PLOG_ERROR << str;
-	throw std::runtime_error(message + ": " + str);
+	throw std::runtime_error(str);
 }
 
 BIO *BIO_new_from_file(const string &filename) {

+ 1 - 1
src/impl/tls.hpp

@@ -64,7 +64,7 @@ gnutls_datum_t make_datum(char *data, size_t size);
 namespace rtc::openssl {
 
 void init();
-string error_string(unsigned long err);
+string error_string(unsigned long error);
 
 bool check(int success, const string &message = "OpenSSL error");
 bool check(SSL *ssl, int ret, const string &message = "OpenSSL error");