This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 1.3.x in repository https://gitbox.apache.org/repos/asf/tomcat-native.git
commit bdaef8e7792da4a8a31a092869e8ea50509705fa Author: Chenjp <[email protected]> AuthorDate: Mon Jan 26 11:03:38 2026 +0800 Centralize cleanup Avoid sslconf mem-leak with tcn_throw ex, which is unlikely to happen in real world. --- native/src/sslconf.c | 73 +++++++++++++++++++++------------------ xdocs/miscellaneous/changelog.xml | 4 +++ 2 files changed, 43 insertions(+), 34 deletions(-) diff --git a/native/src/sslconf.c b/native/src/sslconf.c index 68e15faf6..06a457cb7 100644 --- a/native/src/sslconf.c +++ b/native/src/sslconf.c @@ -155,16 +155,16 @@ TCN_IMPLEMENT_CALL(jint, SSLConf, check)(TCN_STDARGS, jlong cctx, TCN_ASSERT(c->cctx != 0); if (!J2S(cmd)) { tcn_Throw(e, "Can not check null SSL_CONF command"); - return SSL_THROW_RETURN; + rc = SSL_THROW_RETURN; + goto cleanup; } if (!strcmp(J2S(cmd), "NO_OCSP_CHECK")) { if (!strcasecmp(J2S(value), "false")) c->no_ocsp_check = 0; else c->no_ocsp_check = 1; - TCN_FREE_CSTRING(cmd); - TCN_FREE_CSTRING(value); - return 1; + rc = 1; + goto cleanup; } if (!strcmp(J2S(cmd), "OCSP_SOFT_FAIL")) { @@ -172,9 +172,8 @@ TCN_IMPLEMENT_CALL(jint, SSLConf, check)(TCN_STDARGS, jlong cctx, c->ocsp_soft_fail = 0; else c->ocsp_soft_fail = 1; - TCN_FREE_CSTRING(cmd); - TCN_FREE_CSTRING(value); - return 1; + rc = 1; + goto cleanup; } if (!strcmp(J2S(cmd), "OCSP_TIMEOUT")) { @@ -185,9 +184,8 @@ TCN_IMPLEMENT_CALL(jint, SSLConf, check)(TCN_STDARGS, jlong cctx, // Tomcat configures timeout is millisecond. APR uses microseconds. c->ocsp_timeout = i * 1000; } - TCN_FREE_CSTRING(cmd); - TCN_FREE_CSTRING(value); - return 1; + rc = 1; + goto cleanup; } if (!strcmp(J2S(cmd), "OCSP_VERIFY_FLAGS")) { @@ -197,9 +195,8 @@ TCN_IMPLEMENT_CALL(jint, SSLConf, check)(TCN_STDARGS, jlong cctx, if (!errno) { c->ocsp_verify_flags = i; } - TCN_FREE_CSTRING(cmd); - TCN_FREE_CSTRING(value); - return 1; + rc = 1; + goto cleanup; } SSL_ERR_clear(); @@ -209,35 +206,42 @@ TCN_IMPLEMENT_CALL(jint, SSLConf, check)(TCN_STDARGS, jlong cctx, char err[TCN_OPENSSL_ERROR_STRING_LENGTH]; ERR_error_string_n(ec, err, TCN_OPENSSL_ERROR_STRING_LENGTH); tcn_Throw(e, "Could not determine SSL_CONF command type for '%s' (%s)", J2S(cmd), err); - return 0; + rc = 0; + goto cleanup; } if (value_type == SSL_CONF_TYPE_UNKNOWN) { tcn_Throw(e, "Invalid SSL_CONF command '%s', type unknown", J2S(cmd)); - return SSL_THROW_RETURN; + rc = SSL_THROW_RETURN; + goto cleanup; } if (value_type == SSL_CONF_TYPE_FILE) { if (!J2S(value)) { tcn_Throw(e, "SSL_CONF command '%s' needs a non-empty file argument", J2S(cmd)); - return SSL_THROW_RETURN; + rc = SSL_THROW_RETURN; + goto cleanup; } if (check_file(c->pool, J2S(value))) { tcn_Throw(e, "SSL_CONF command '%s' file '%s' does not exist or is empty", J2S(cmd), J2S(value)); - return SSL_THROW_RETURN; + rc = SSL_THROW_RETURN; + goto cleanup; } } else if (value_type == SSL_CONF_TYPE_DIR) { if (!J2S(value)) { tcn_Throw(e, "SSL_CONF command '%s' needs a non-empty directory argument", J2S(cmd)); - return SSL_THROW_RETURN; + rc = SSL_THROW_RETURN; + goto cleanup; } if (check_dir(c->pool, J2S(value))) { tcn_Throw(e, "SSL_CONF command '%s' directory '%s' does not exist", J2S(cmd), J2S(value)); - return SSL_THROW_RETURN; + rc = SSL_THROW_RETURN; + goto cleanup; } } +cleanup: TCN_FREE_CSTRING(cmd); TCN_FREE_CSTRING(value); return rc; @@ -279,7 +283,8 @@ TCN_IMPLEMENT_CALL(jint, SSLConf, apply)(TCN_STDARGS, jlong cctx, TCN_ASSERT(c->cctx != 0); if (!J2S(cmd)) { tcn_Throw(e, "Can not apply null SSL_CONF command"); - return SSL_THROW_RETURN; + rc = SSL_THROW_RETURN; + goto cleanup; } #ifndef HAVE_EXPORT_CIPHERS if (!strcmp(J2S(cmd), "CipherString")) { @@ -291,7 +296,8 @@ TCN_IMPLEMENT_CALL(jint, SSLConf, apply)(TCN_STDARGS, jlong cctx, buf = malloc(len * sizeof(char)); if (buf == NULL) { tcn_Throw(e, "Could not allocate memory to adjust cipher string"); - return SSL_THROW_RETURN; + rc = SSL_THROW_RETURN; + goto cleanup; } memcpy(buf, SSL_CIPHERS_ALWAYS_DISABLED, strlen(SSL_CIPHERS_ALWAYS_DISABLED)); memcpy(buf + strlen(SSL_CIPHERS_ALWAYS_DISABLED), J2S(value), strlen(J2S(value))); @@ -303,18 +309,16 @@ TCN_IMPLEMENT_CALL(jint, SSLConf, apply)(TCN_STDARGS, jlong cctx, c->no_ocsp_check = 0; else c->no_ocsp_check = 1; - TCN_FREE_CSTRING(cmd); - TCN_FREE_CSTRING(value); - return 1; + rc = 1; + goto cleanup; } if (!strcmp(J2S(cmd), "OCSP_SOFT_FAIL")) { if (!strcasecmp(J2S(value), "false")) c->ocsp_soft_fail = 0; else c->ocsp_soft_fail = 1; - TCN_FREE_CSTRING(cmd); - TCN_FREE_CSTRING(value); - return 1; + rc = 1; + goto cleanup; } if (!strcmp(J2S(cmd), "OCSP_TIMEOUT")) { int i; @@ -324,9 +328,8 @@ TCN_IMPLEMENT_CALL(jint, SSLConf, apply)(TCN_STDARGS, jlong cctx, // Tomcat configures timeout is millisecond. APR uses microseconds. c->ocsp_timeout = i * 1000; } - TCN_FREE_CSTRING(cmd); - TCN_FREE_CSTRING(value); - return 1; + rc = 1; + goto cleanup; } if (!strcmp(J2S(cmd), "OCSP_VERIFY_FLAGS")) { int i; @@ -335,9 +338,8 @@ TCN_IMPLEMENT_CALL(jint, SSLConf, apply)(TCN_STDARGS, jlong cctx, if (!errno) { c->ocsp_verify_flags = i; } - TCN_FREE_CSTRING(cmd); - TCN_FREE_CSTRING(value); - return 1; + rc = 1; + goto cleanup; } SSL_ERR_clear(); rc = SSL_CONF_cmd(c->cctx, J2S(cmd), buf != NULL ? buf : J2S(value)); @@ -350,8 +352,11 @@ TCN_IMPLEMENT_CALL(jint, SSLConf, apply)(TCN_STDARGS, jlong cctx, } else { tcn_Throw(e, "Could not apply SSL_CONF command '%s' with value '%s'", J2S(cmd), buf != NULL ? buf : J2S(value)); } - return SSL_THROW_RETURN; + rc = SSL_THROW_RETURN; + goto cleanup; } + +cleanup: #ifndef HAVE_EXPORT_CIPHERS if (buf != NULL) { free(buf); diff --git a/xdocs/miscellaneous/changelog.xml b/xdocs/miscellaneous/changelog.xml index 2fdd0159c..6792d07a4 100644 --- a/xdocs/miscellaneous/changelog.xml +++ b/xdocs/miscellaneous/changelog.xml @@ -41,6 +41,10 @@ Fix unnecessarily large buffer allocation when filtering out NULL and export ciphers. Pull request <pr>35</pr> provided by chenjp. (markt) </fix> + <fix> + Fix a potential memory leak if an invalid <code>OpenSSLConf</code> is + provided. Pull request <pr>36</pr> provided by chenjp. (markt) + </fix> </changelog> </section> <section name="1.3.5" rtext="2026-01-19"> --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
