diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h index 832500c31e7bd423d3aa8526e3b0d87a4f49b4b2..cfb78c02792d813ca4c2cf55e031e699f9649311 100644 --- a/include/asterisk/utils.h +++ b/include/asterisk/utils.h @@ -1099,4 +1099,16 @@ int ast_crypt_validate(const char *key, const char *expected); */ int ast_file_is_readable(const char *filename); +/* + * \brief Compare 2 major.minor.patch.extra version strings. + * \since 13.7.0 + * + * \param version1. + * \param version2. + * \return -1 if version 1 < version 2. + * \return 0 if version 1 = version 2. + * \return 1 if version 1 > version 2. + */ +int ast_compare_versions(const char *version1, const char *version2); + #endif /* _ASTERISK_UTILS_H */ diff --git a/main/utils.c b/main/utils.c index 74932b8c27dca48132a90e4e0ba44b00979e485e..87241f197663b3ca3fee1c7f85e01201f5577425 100644 --- a/main/utils.c +++ b/main/utils.c @@ -2944,3 +2944,26 @@ int ast_file_is_readable(const char *filename) return 1; #endif } + +int ast_compare_versions(const char *version1, const char *version2) +{ + u_int64_t major[2] = { 0 }; + u_int64_t minor[2] = { 0 }; + u_int64_t patch[2] = { 0 }; + u_int64_t extra[2] = { 0 }; + u_int64_t v1, v2; + + sscanf(version1, "%lu.%lu.%lu.%lu", &major[0], &minor[0], &patch[0], &extra[0]); + sscanf(version2, "%lu.%lu.%lu.%lu", &major[1], &minor[1], &patch[1], &extra[1]); + + v1 = major[0] << 48 | minor[0] << 32 | patch[0] << 16 | extra[0]; + v2 = major[1] << 48 | minor[1] << 32 | patch[1] << 16 | extra[1]; + + if (v1 < v2) { + return -1; + } else if (v1 > v2) { + return 1; + } else { + return 0; + } +} diff --git a/res/res_pjsip/config_transport.c b/res/res_pjsip/config_transport.c index d8ece1509441e114a2fa97c8531d885bb6c4ba4c..840824bd945b0d294488791bc52ea7dd477b8329 100644 --- a/res/res_pjsip/config_transport.c +++ b/res/res_pjsip/config_transport.c @@ -217,11 +217,8 @@ static int transport_apply(const struct ast_sorcery *sorcery, void *obj) res = pjsip_tcp_transport_start3(ast_sip_get_pjsip_endpoint(), &cfg, &transport->state->factory); } else if (transport->type == AST_TRANSPORT_TLS) { - /* The following check is a work-around for ASTERISK-25615. - * When that issue is resolved in upstream pjproject, this check can be removed. - */ - if (transport->async_operations > 1) { - ast_log(LOG_ERROR, "Transport: %s: When protocol=tls, async_operations can't be > 1 (ASTERISK-25615)\n", + if (transport->async_operations > 1 && ast_compare_versions(pj_get_version(), "2.5.0") < 0) { + ast_log(LOG_ERROR, "Transport: %s: When protocol=tls and pjproject version < 2.5.0, async_operations can't be > 1\n", ast_sorcery_object_get_id(obj)); return -1; }