diff options
author | George Joseph <george.joseph@fairview5.com> | 2015-12-12 10:08:50 -0700 |
---|---|---|
committer | George Joseph <george.joseph@fairview5.com> | 2015-12-12 10:12:22 -0700 |
commit | 5b867fa9043dec7aee8fbe21a6537efb103e4d92 (patch) | |
tree | bbf97a87268ba089a48501bcc4b6849ed649a97f /main | |
parent | 14b41115e363766633aec67f67e9764521b74f5c (diff) |
pjsip/config_transport: Check pjproject version at runtime for async ops
pjproject < 2.5.0 will segfault on a tls transport if async_operations
is greater than 1. A runtime version check has been added to throw
an error if the version is < 2.5.0 and async_operations > 1.
To assist in the check, a new api "ast_compare_versions" was added
to utils which compares 2 major.minor.patch.extra version strings.
ASTERISK-25615 #close
Change-Id: I8e88bb49cbcfbca88d9de705496d6f6a8c938a98
Reported-by: George Joseph
Tested-by: George Joseph
Diffstat (limited to 'main')
-rw-r--r-- | main/utils.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/main/utils.c b/main/utils.c index 3eeafed4f..82e3701d6 100644 --- a/main/utils.c +++ b/main/utils.c @@ -2949,3 +2949,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; + } +} |