Module: kamailio
Branch: master
Commit: 4ec11b1a851d321959a0a38041bc7a6ea8107f39
URL: 
https://github.com/kamailio/kamailio/commit/4ec11b1a851d321959a0a38041bc7a6ea8107f39

Author: Xenofon Karamanos <[email protected]>
Committer: GitHub <[email protected]>
Date: 2023-10-24T20:07:36+02:00

cdp: Add and apply cdp_openssl_clear_errors function (#3612)

* cdp: Add and apply cdp_openssl_clear_errors function
- add new function to clear OpenSSL errors prior to any SSL_* call

---

Modified: src/modules/cdp/cdp_tls.c
Modified: src/modules/cdp/cdp_tls.h
Modified: src/modules/cdp/receiver.c

---

Diff:  
https://github.com/kamailio/kamailio/commit/4ec11b1a851d321959a0a38041bc7a6ea8107f39.diff
Patch: 
https://github.com/kamailio/kamailio/commit/4ec11b1a851d321959a0a38041bc7a6ea8107f39.patch

---

diff --git a/src/modules/cdp/cdp_tls.c b/src/modules/cdp/cdp_tls.c
index 903445b676d..3f1c15fd182 100644
--- a/src/modules/cdp/cdp_tls.c
+++ b/src/modules/cdp/cdp_tls.c
@@ -164,6 +164,22 @@ int load_certificates(SSL_CTX *ctx, str *cert, str *key)
        return 0;
 }
 
+/*
+ * Get any leftover errors from OpenSSL and print them.
+ * ERR_get_error() also removes the error from the OpenSSL error stack.
+ * This is useful to call before any SSL_* IO calls to make sure
+ * we don't have any leftover errors from previous calls (OpenSSL docs).
+ */
+void cdp_openssl_clear_errors(void)
+{
+       int i;
+       char err[256];
+       while((i = ERR_get_error())) {
+               ERR_error_string(i, err);
+               LM_INFO("clearing leftover error before SSL_* calls: %s\n", 
err);
+       }
+}
+
 SSL *init_ssl_conn(int client_fd, SSL_CTX *ctx)
 {
        X509 *cert = NULL;
@@ -184,6 +200,7 @@ SSL *init_ssl_conn(int client_fd, SSL_CTX *ctx)
                goto cleanup;
        }
        /* Perform the TLS handshake */
+       cdp_openssl_clear_errors();
        ssl_ret = SSL_connect(ssl);
        if(ssl_ret != 1) {
                error = SSL_get_error(ssl, ssl_ret);
diff --git a/src/modules/cdp/cdp_tls.h b/src/modules/cdp/cdp_tls.h
index b2e49408b34..a4981fbade9 100644
--- a/src/modules/cdp/cdp_tls.h
+++ b/src/modules/cdp/cdp_tls.h
@@ -67,6 +67,7 @@ static inline int tls_err_ret(char *s, SSL_CTX *ctx)
        } while(0)
 
 int tls_parse_method(str *method);
+void cdp_openssl_clear_errors(void);
 void init_ssl_methods(void);
 SSL_CTX *init_ssl_ctx(int method);
 SSL *init_ssl_conn(int client_fd, SSL_CTX *ctx);
diff --git a/src/modules/cdp/receiver.c b/src/modules/cdp/receiver.c
index ceee98127f6..223d14dd403 100644
--- a/src/modules/cdp/receiver.c
+++ b/src/modules/cdp/receiver.c
@@ -537,6 +537,7 @@ static inline int do_read(serviced_peer_t *sp, char *dst, 
int n)
        char *err_str;
 
        if(sp->tls_conn) {
+               cdp_openssl_clear_errors();
                cnt = SSL_read(sp->tls_conn, dst, n);
                if(unlikely(cnt < 0)) {
                        ssl_err = SSL_get_error(sp->tls_conn, cnt);
@@ -687,6 +688,7 @@ static int do_write(serviced_peer_t *sp, const void *buf, 
int num)
        char *err_str;
 
        if(sp->tls_conn) {
+               cdp_openssl_clear_errors();
                cnt = SSL_write(sp->tls_conn, buf, num);
                if(unlikely(cnt <= 0)) {
                        ssl_err = SSL_get_error(sp->tls_conn, cnt);

_______________________________________________
Kamailio (SER) - Development Mailing List
To unsubscribe send an email to [email protected]

Reply via email to