Explorar el Código

- call tls_shutdown() only if tls_set_fd() was succesfull
(fixes a tricky bug that can appear on low memory conditions)A
- tls_dump_cert_info takes into account the possibility of a failing
X609_NAME_oneline() (can happen on low memory)

Andrei Pelinescu-Onciul hace 18 años
padre
commit
5777d8667f
Se han modificado 1 ficheros con 12 adiciones y 7 borrados
  1. 12 7
      modules/tls/tls_server.c

+ 12 - 7
modules/tls/tls_server.c

@@ -144,13 +144,18 @@ static void tls_dump_cert_info(char* s, X509* cert)
 	char* subj;
 	char* subj;
 	char* issuer;
 	char* issuer;
 	
 	
+	subj=issuer=0;
 	subj = X509_NAME_oneline(X509_get_subject_name(cert), 0 , 0);
 	subj = X509_NAME_oneline(X509_get_subject_name(cert), 0 , 0);
 	issuer = X509_NAME_oneline(X509_get_issuer_name(cert), 0 , 0);
 	issuer = X509_NAME_oneline(X509_get_issuer_name(cert), 0 , 0);
 	
 	
-	LOG(tls_log, "%s subject:%s\n", s ? s : "", subj);
-	LOG(tls_log, "%s issuer:%s\n", s ? s : "", issuer);
-	OPENSSL_free(subj);
-	OPENSSL_free(issuer);
+	if (subj){
+		LOG(tls_log, "%s subject:%s\n", s ? s : "", subj);
+		OPENSSL_free(subj);
+	}
+	if (issuer){
+		LOG(tls_log, "%s issuer:%s\n", s ? s : "", issuer);
+		OPENSSL_free(issuer);
+	}
 }
 }
 
 
 
 
@@ -631,8 +636,8 @@ void tls_h_close(struct tcp_connection *c, int fd)
 	      */
 	      */
 	DBG("Closing SSL connection\n");
 	DBG("Closing SSL connection\n");
 	if (c->extra_data) {
 	if (c->extra_data) {
-		tls_update_fd(c, fd);
-		tls_shutdown(c);
+		if (tls_update_fd(c, fd)==0)
+			tls_shutdown(c); /* shudown only on succesfull set fd */
 	}
 	}
 }
 }
 
 
@@ -800,7 +805,7 @@ int tls_h_read(struct tcp_connection * c)
 			TLS_ERR_RET(ssl_err, "tls_read:");
 			TLS_ERR_RET(ssl_err, "tls_read:");
 			if (!ssl_err) {
 			if (!ssl_err) {
 				if (bytes_read == 0) {
 				if (bytes_read == 0) {
-					LOG(L_WARN, "WARNING: tls_read: improper EOF on tls"
+					LOG(tls_log, "WARNING: tls_read: improper EOF on tls"
 					    " (harmless)\n");
 					    " (harmless)\n");
 					c->state = S_CONN_EOF;
 					c->state = S_CONN_EOF;
 					return 0;
 					return 0;