From 68fbb81eab46dca65fb7c8bae8b7d3ad936a193a Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Thu, 12 Mar 2026 09:37:19 +0100 Subject: [PATCH] New upstream version 6.0.6 --- CMakeLists.txt | 2 +- ChangeLog | 733 ++++++++++++++++++ cmake/compiler-specific.cmake | 14 +- cmake/defs.cmake | 73 +- cmake/groups.cmake | 6 +- cmake/lock_methods.cmake | 161 ++++ cmake/modules/FindErlang.cmake | 100 ++- cmake/modules/FindNETSNMP.cmake | 23 +- cmake/os-specific/linux.cmake | 41 - pkg/kamailio/alpine/APKBUILD | 2 +- pkg/kamailio/deb/bionic/changelog | 6 + pkg/kamailio/deb/bookworm/changelog | 6 + pkg/kamailio/deb/bullseye/changelog | 6 + pkg/kamailio/deb/buster/changelog | 6 + pkg/kamailio/deb/debian/changelog | 6 + pkg/kamailio/deb/focal/changelog | 6 + pkg/kamailio/deb/jammy/changelog | 6 + pkg/kamailio/deb/jessie/changelog | 6 + pkg/kamailio/deb/noble/changelog | 6 + pkg/kamailio/deb/precise/changelog | 6 + pkg/kamailio/deb/sid/changelog | 6 + pkg/kamailio/deb/stretch/changelog | 6 + pkg/kamailio/deb/trixie/changelog | 6 + pkg/kamailio/deb/trusty/changelog | 6 + pkg/kamailio/deb/wheezy/changelog | 6 + pkg/kamailio/deb/xenial/changelog | 6 + pkg/kamailio/obs/kamailio.spec | 2 +- src/Makefile.defs | 6 +- src/Makefile.groups | 3 +- src/core/atomic_ops.h | 4 +- src/core/autover.h | 4 +- src/core/basex.c | 24 +- src/core/cfg.y | 1 - src/core/futexlock.h | 1 + src/core/lock_alloc.h | 3 +- src/core/mem/q_malloc.c | 4 +- src/core/parser/parse_addr_spec.c | 9 +- src/core/parser/parse_addr_spec.h | 14 +- src/core/parser/parse_identityinfo.c | 3 +- src/core/parser/parse_uri.c | 6 +- src/core/strutils.c | 7 +- src/core/tcp_read.c | 35 +- src/core/ut.h | 5 + src/modules/app_ruby/CMakeLists.txt | 6 + src/modules/app_ruby_proc/CMakeLists.txt | 5 +- src/modules/async/README | 2 +- src/modules/async/async_mod.c | 2 +- src/modules/async/doc/async_admin.xml | 2 +- src/modules/auth_ephemeral/CMakeLists.txt | 4 + src/modules/cdp/CMakeLists.txt | 8 +- src/modules/corex/corex_mod.c | 10 +- src/modules/db2_ldap/CMakeLists.txt | 4 +- src/modules/db_text/dbt_lib.h | 2 +- src/modules/dialog/dlg_profile.c | 3 +- src/modules/erlang/CMakeLists.txt | 3 +- src/modules/geoip2/CMakeLists.txt | 2 +- .../ims_diameter_server/CMakeLists.txt | 8 + src/modules/ims_ipsec_pcscf/CMakeLists.txt | 4 +- src/modules/ims_ipsec_pcscf/cmd.c | 6 +- src/modules/ims_ocs/CMakeLists.txt | 8 + src/modules/ims_qos/CMakeLists.txt | 8 + src/modules/ims_qos_npn/CMakeLists.txt | 8 + .../ims_registrar_pcscf/CMakeLists.txt | 8 +- .../ims_registrar_scscf/CMakeLists.txt | 8 +- .../ims_registrar_scscf/registrar_notify.c | 8 +- src/modules/ims_registrar_scscf/save.c | 7 +- src/modules/jsonrpcc/CMakeLists.txt | 5 +- src/modules/kazoo/CMakeLists.txt | 7 +- src/modules/microhttpd/CMakeLists.txt | 2 +- src/modules/misctest/CMakeLists.txt | 3 + src/modules/nats/README | 2 +- src/modules/nats/doc/nats_admin.xml | 2 +- src/modules/phonenum/CMakeLists.txt | 3 + src/modules/pv/pv_core.c | 22 +- src/modules/rabbitmq/CMakeLists.txt | 16 +- src/modules/rtpengine/README | 6 +- src/modules/rtpengine/doc/rtpengine_admin.xml | 4 +- src/modules/rtpengine/rtpengine.c | 2 + src/modules/rtpengine/rtpengine_hash.c | 6 +- src/modules/sipdump/CMakeLists.txt | 4 + src/modules/tls/CMakeLists.txt | 2 +- src/modules/tls_wolfssl/tls_server.c | 34 +- src/modules/tlsa/CMakeLists.txt | 47 +- src/modules/tm/t_reply.c | 2 +- .../topos_htable/topos_htable_storage.c | 46 +- src/modules/uac/replace.c | 48 +- src/modules/usrloc/udomain.c | 7 +- src/modules/websocket/CMakeLists.txt | 9 +- src/modules/xcap_client/xcap_client.c | 5 +- src/modules/xcap_client/xcap_functions.c | 4 + src/modules/xhttp_prom/prom_metric.c | 63 +- 91 files changed, 1528 insertions(+), 331 deletions(-) create mode 100644 cmake/lock_methods.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a1c1021d..237797f80 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.13) # Set the project name project( kamailio - VERSION 6.0.5 + VERSION 6.0.6 DESCRIPTION "Kamailio SIP Server" HOMEPAGE_URL "https://www.kamailio.org" ) diff --git a/ChangeLog b/ChangeLog index e46175171..4ec5c974c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,736 @@ +===================== 2026-03-05 Version 6.0.6 Released ===================== + +===================== Changes Since Version 6.0.5 =========================== + +commit 0d7a4b072cd649b7109451e15f2611461f35cdb5 +Author: Daniel-Constantin Mierla +Date: Sun Mar 1 22:55:21 2026 +0100 + + core: tcp read - check coontent lenght for max int limit + + (cherry picked from commit 2c47fe1625b57e04252230e0e783ba4182afbebb) + (cherry picked from commit 4076b32435b32205460e4d5fbcbef3ed8500e8c7) + +commit 196a8e38cd09663ecaab33c0a3b507989f06637b +Author: Daniel-Constantin Mierla +Date: Thu Mar 5 09:19:14 2026 +0100 + + src: version set to 6.0.6 + +commit 73916b1eb9614bffe58b1be0258cb146e2d75e07 +Author: Daniel-Constantin Mierla +Date: Thu Mar 5 08:58:09 2026 +0100 + + pkg/kamailio: version set 6.0.6 for rpms and alpine [skip ci] + +commit ad78dbb3d13abcc0535a08f580b3f7f0c3c11191 +Author: Victor Seva +Date: Thu Mar 5 08:46:52 2026 +0100 + + pkg/kamailio/deb: version set 6.0.6 [skip ci] + +commit b4cde3ba4bb36da81f8ac8c1aceae2bab7bd63f1 +Author: Daniel-Constantin Mierla +Date: Wed Mar 4 17:33:54 2026 +0100 + + db2_ldap: cmake - link libldap + + (cherry picked from commit ce7c002c6ccf6f7b0a369c73a66c25b566080420) + (cherry picked from commit 5f02ed54a24e08b0ebbf9816f15c80213f3b666d) + +commit 25dc203de73236e698db9bd304b0b1d712575610 +Author: Daniel-Constantin Mierla +Date: Wed Mar 4 17:25:01 2026 +0100 + + kazoo: cmake - link with libevent + + (cherry picked from commit 6b51a80f70a524eaadd2d52fc13594006d41d1bb) + (cherry picked from commit 2bfbac1574692ff54e9647159ee9473ee95bc7d1) + +commit c35d28a7ba7a819758f0787a508168a99be4f8a5 +Author: Daniel-Constantin Mierla +Date: Wed Mar 4 17:23:45 2026 +0100 + + jsonrpcc: cmake - link with libevent + + (cherry picked from commit 69b4b70f38ec0458dd58f3c9fe1f522daad57279) + (cherry picked from commit 78a3b9c22a6212ab619c3e20ee0513a3d43b90fe) + +commit 4df0071a8c80941ecc62f4576db2445b7998158f +Author: Daniel-Constantin Mierla +Date: Wed Mar 4 17:23:20 2026 +0100 + + db2_ldap: cmake - define OPENLDAP23 + + (cherry picked from commit 88df34e4aa711140f63dfec6db1d185459fdd1aa) + (cherry picked from commit 43014286810a7777dd6cedb61586056861c3ff2a) + +commit 57a6d6f969ceebcb652c6aa261fff4d5062a2cce +Author: Daniel-Constantin Mierla +Date: Thu Mar 5 06:21:11 2026 +0100 + + src: updates to modules groups + +commit c907c964647ff0a3125a060d8ac64715d9b60b49 +Author: Joel Serrano +Date: Fri Jan 30 01:38:30 2026 -0800 + + xhttp_prom: include global tags in user-defined metrics + + (cherry picked from commit 9f7838561daece724a9fa877cd140f744c81d452) + (cherry picked from commit 361c7ac0dc35f9907bcb1e151c0cc6e7971367d8) + +commit 396fe7478706d62ecb4e0fc67304f14abb366d42 +Author: Xenofon Karamanos +Date: Wed Mar 4 09:13:12 2026 +0000 + + phonenum: cmake: Add missing cpp files for compilation + + (cherry picked from commit a5a63fdca5a676b4317a21b95214ebed262f9b14) + +commit bb790fd7c3eec3deb16196517fe510322e0a8d31 +Author: Kamailio Dev +Date: Mon Mar 2 17:01:26 2026 +0100 + + modules: readme files regenerated - modules ... [skip ci] + +commit 79f3a1fdc1cc9e816171a87811d08c6f7c1c3fc8 +Author: Norm Brandinger +Date: Fri Feb 13 15:00:33 2026 -0500 + + dialog: fix race condition in link_dlg_profile + + Move link_profile() call inside the dialog entry lock in + link_dlg_profile(). Without this, a linker added to the dialog's + profile list becomes visible to destroy_linkers() before it is + inserted into the profile hash table. If destroy_linkers() runs in + that window, it sees hash_linker.next as NULL, skips the hash table + unlink, and frees the linker. The subsequent link_profile() call + then operates on freed memory, corrupting the profile hash table. + + This causes SIGSEGV in get_profile_size() (NULL pointer in hash + chain traversal) or an infinite loop when hash buckets become + cross-linked. + + GH #2923 + + (cherry picked from commit c958cc7a1dcad00c4bb36f79d539bbb96f135642) + (cherry picked from commit c3fd3592257edbb2bd4d74cb438e6576cac7a079) + +commit 99d67106cb608feed5c89111f2642db3336baaa2 +Author: Daniel-Constantin Mierla +Date: Fri Feb 13 09:59:11 2026 +0100 + + pv: manage if changing uri to from/to needs enclosing + + (cherry picked from commit b29086966d6ab8b69c0fada8b6b379a0b3268bbb) + (cherry picked from commit 5182a677a078dd89f16dd85fb0941577a6e7f3a4) + +commit 96e5e0a82d850392169fe88937ee0f874a1660a4 +Author: Daniel-Constantin Mierla +Date: Fri Feb 13 08:46:28 2026 +0100 + + tls_wolfssl: replace asserts with error logs + + - do not crash, try to run further + - GH #4391 + + (cherry picked from commit 8239d541503ce43c58d7f7ab54ba8ee70f557821) + (cherry picked from commit e8a43d551523e232c90214cc05929b35e5898d20) + +commit 06d806320c565f13db359f490409b2979d664e5e +Author: Daniel-Constantin Mierla +Date: Thu Feb 12 20:23:42 2026 +0100 + + uac: replace - enclose new uri if needed + + (cherry picked from commit d9e6bb39cabc963468326731d99423eaa65da278) + (cherry picked from commit f3a00a3051b709580d7df75e8c91a438c195060c) + +commit 9e3df334e32c8014b572d575b37f0e0d0a74c937 +Author: Xenofon Karamanos +Date: Thu Feb 12 10:42:28 2026 +0000 + + uac: Fix 2 spaces when replacing empty display name + + (cherry picked from commit 1018ff6934879658ec045a6c2165e412c711a2c7) + (cherry picked from commit 966d92ff34a892757aec7036dba0085abae3ff12) + +commit 18a872b76aa6a84cea2a52922304400e9cac2734 +Author: Daniel-Constantin Mierla +Date: Tue Feb 10 22:09:15 2026 +0100 + + core: parser - field to keep the style of the to_body + + - enclosed URI or quoted display + + (cherry picked from commit b1f0091b17707c5e04e7cc370ceb52d84bbd1aae) + (cherry picked from commit e4a1693906780e1c7141cec228f5ee1e5172f212) + +commit 88b4f8c3fd2e1be08ea246057b2f59f7d6d67cc1 +Author: Daniel-Constantin Mierla +Date: Tue Jan 27 14:20:31 2026 +0100 + + xcap_client: check return for curl_easy_init() + + (cherry picked from commit 7ebb826040d63b4d55f11fb685a6c201739cd4b2) + (cherry picked from commit 8b3872b7ddb9653e59e627cbd2e4399813b71abc) + +commit 28ed3259bd2a1e1b50923beed9330cdb8803f16e +Author: Daniel-Constantin Mierla +Date: Tue Jan 27 13:25:20 2026 +0100 + + xcap_client: check the return for curl_global_init() + + (cherry picked from commit 898cdbb4e37f8451c19b7be676d49e3aacd404a2) + (cherry picked from commit e96b51fb988b43d7050669c9b598790ee577701e) + +commit e1e5e50cbd79c94177dd3414285d76b04f9785c3 +Author: Henning Westerholt +Date: Thu Jan 22 12:06:07 2026 +0000 + + db_text: fix conflicting comment about db_mode + + (cherry picked from commit 9c6606d335a92b2ef75e106ee958e43cd9c2aff1) + +commit 133b7c1dfdc853307513370daaeaadd715a83dc9 +Author: Victor Seva +Date: Thu Jan 22 11:41:25 2026 +0100 + + core: avoid unpredictable parsing behavior on platorms where char is signed + + * cast unsigned char before calling isalnum(), isdigit(), tolower() + + fixes #4563 + + (cherry picked from commit 8247b56401401f258995ade7edd8602937a96b19) + +commit 439ffa6dcedce96f7eef0569d9c2a12568fca046 +Author: Daniel-Constantin Mierla +Date: Wed Jan 21 09:50:14 2026 +0100 + + corex: use the data type for internal message flags + + (cherry picked from commit 9cc994d57f9a2a298bc4cbd5dda507b2fe261670) + +commit a552ffb0380596e4a750cc4f4cf48a3b8c31a1c7 +Author: Michal Popovič +Date: Mon Jan 19 13:54:15 2026 +0100 + + rtpengine: update documentation for rtp_inst_pvar variable + + (cherry picked from commit 8712ef21db9109d392c71e64c49fc0255d75decb) + +commit d01b0fde219c5fd1be3af95f184339fed1fa57aa +Author: Daniel-Constantin Mierla +Date: Mon Jan 19 10:03:00 2026 +0100 + + core: cfg.y - removed unused tocken APPEND_BRANCH + + (cherry picked from commit d3bbbbfa15c849bb1f1d7aef7a0dfc5d9120a380) + +commit 52e23ef0ccd9940aadd0cf47deef77706ca37cdb +Author: Daniel-Constantin Mierla +Date: Sat Jan 17 07:53:09 2026 +0100 + + core: ut - pkg_str_dup() skip memcpy when dst->len is 0 + + (cherry picked from commit fc1004506098e302cba9819179b76a62e245aba0) + +commit dbbfe1541f73ba49592da6df2bc18b1c81a1c77a +Author: Daniel-Constantin Mierla +Date: Tue Jan 13 12:56:02 2026 +0100 + + tm: remove module prefix from log message + + (cherry picked from commit 436b6a3de1797f90ae50fa4730567c3b31d6f660) + +commit 2e7e2d449a266a43c76723ce0233ea4d817bfcc0 +Author: Daniel-Constantin Mierla +Date: Mon Jan 12 13:23:12 2026 +0100 + + usrloc: small code update for clarity + + (cherry picked from commit 29e06a63289b70d7fc46fde16cc7ef6ad49f53f7) + +commit 4815912fd4e931f4a6710cd94defa5ba1fe86d30 +Author: Richard Fuchs +Date: Wed Feb 25 09:23:42 2026 -0400 + + rtpengine: add "directional" flag + + Closes #4599 + + (cherry picked from commit a02f07ecf24564b7f0eb555cce0bdf88727ebdd3) + +commit 3253177f525fd322e4e5e25f85efa6d39563bed5 +Author: Kamailio Dev +Date: Thu Feb 26 14:01:29 2026 +0100 + + modules: readme files regenerated - modules ... [skip ci] + +commit 962028fb3cc5fd72c0ec244eb5be246403207fb2 +Author: Victor Seva +Date: Thu Feb 26 13:53:16 2026 +0100 + + async: fix typo on use example of async_task_group_data cmd [skip ci] + + related #4606 + + (cherry picked from commit 6f29228e07eddf155a97a403b66c60dbcf2e051e) + (cherry picked from commit 422449360dd6b83f7847a942364665b5b3650ce8) + +commit a9055ac8d8fe0e344b1fc73a302b1edfb37f6877 +Author: Victor Seva +Date: Thu Feb 26 13:49:15 2026 +0100 + + async: fix processing of 3rd parameter of async_task_group_data cmd + + fixes #4606 + + (cherry picked from commit 9ae78f8bb918324f4303f769ba79c6e2910d2eab) + (cherry picked from commit 59799ab4c3d337e64cddbe4c87ea08c8a38cf9a4) + +commit c22ffcab6b7b544cc9ae6c3cb055ef74b56a5933 +Author: Morten Tryfoss +Date: Mon Feb 23 21:23:19 2026 +0100 + + auth_ephemeral: Add link to OpenSSL in CMakeLists + + (cherry picked from commit 3fd1afe60fe37e0ed87fe3b3c5acb6da9dd613f0) + +commit a440d2151bf70ceb4d9ff2e2585e89984fb8960e +Author: Morten Tryfoss +Date: Mon Feb 23 21:00:24 2026 +0100 + + geoip2: Fix typo in CMakeLists + + (cherry picked from commit 2c9e3138d2e5ada1b52e8e66af7df0dae4dce0f8) + +commit 43e5af11f3a0c91a28b85095038812e281b37500 +Author: Daniel-Constantin Mierla +Date: Fri Feb 20 09:13:46 2026 +0100 + + core: skip warning for no-native locks on aarch64 + +commit ee02200c2f4d8820fc9e165925ee25acbb1e3447 +Author: Daniel-Constantin Mierla +Date: Fri Feb 20 06:58:22 2026 +0100 + + core: tcp read - checks for MSRP first line + + (cherry picked from commit 045bf283c095d72e69986403c5835afeca9af4f1) + (cherry picked from commit a64fd75c148ab1e224587da9b60ed048366d208a) + +commit 58109a52b91c852feda76261fa0c3cedff9e9ce5 +Author: Xenofon Karamanos +Date: Mon Feb 9 08:17:03 2026 +0000 + + cmake: netsnmp: Use correct option for discovering linking libraries + + (cherry picked from commit 92540376d1ab794802f7a047389f68a079a23021) + +commit 4fe55009757be0de60bffe647eef9a8cc1257d0b +Author: eddie2072 +Date: Wed Feb 4 19:44:33 2026 +0800 + + rtpengine: avoid use-after-free when logging duplicate hash entry + + (cherry picked from commit 94ce539038df5565e88bfa8105cfc289575105cd) + +commit dc03baff3bb13214c8715905f34bfedfbe57f958 +Author: Federico Cabiddu +Date: Wed Jan 28 04:59:27 2026 +0100 + + uac: copy uac_flag to transaction's uas request in replace_callback + + (cherry picked from commit 3da94a1920f0dfafc553c0d7519fd9733ce00899) + +commit 761c4f0d354fbe58f7412fcd0ea4aa4d429be6da +Author: Kamailio Dev +Date: Fri Jan 30 12:31:29 2026 +0100 + + modules: readme files regenerated - modules ... [skip ci] + +commit 4407527432a5a33763dcb62b5d397a868262d461 +Author: Victor Seva +Date: Fri Jan 30 11:52:45 2026 +0100 + + nats: fix typo at nats_url example [skip ci] + + (cherry picked from commit cc0362dc78eedd8f88d546d3d4e58555717d8088) + (cherry picked from commit bbd698b2e591e6b70337911d93d0385329cffa76) + +commit 0d1eb775b65981936debdd3f22bdd692746c930b +Author: Xenofon Karamanos +Date: Tue Jan 20 17:11:37 2026 +0000 + + cmake: Update mutex option for TLS support and clean up unused code + + (cherry picked from commit c992bc7621ee1d18ceddf8866a8b38a852d1a1a9) + +commit 4b3c53265e0a073d1d3453a014f3fa43b6eef19d +Author: Xenofon Karamanos +Date: Tue Jan 20 17:04:57 2026 +0000 + + sipdump: cmake: Add missing dependencies + + (cherry picked from commit 98d6e8df16778e60e2b71f7d1c6bdff2b3a3df61) + +commit 23e2d5c5a6daf67e7c41ef20a3d0c757c71ce481 +Author: Xenofon Karamanos +Date: Tue Jan 20 17:04:33 2026 +0000 + + misctest: cmake: Add missing dependencies + + (cherry picked from commit 983f8cdc8af95b7bfb7d443c58427b8cff733003) + +commit 9f3d18d7ad8180a098224dd14defa23bd863114c +Author: Xenofon Karamanos +Date: Tue Jan 20 17:04:10 2026 +0000 + + ims_registrar_scscf: cmake: Add missing dependencies + + (cherry picked from commit 53ddd2411960606821dddd8db8b8fe7abc5704ba) + +commit 93785b09c8c09cf686abd84590639cccd5722195 +Author: Xenofon Karamanos +Date: Tue Jan 20 17:02:48 2026 +0000 + + ims_registrar_pcscf: cmake: Add missing dependencies + + (cherry picked from commit 7269a4c281d3e4f1a5d89e62c97bc17a04779201) + +commit b99def4d6ebc32e3113dc94c1ee8eb50b8afc6e9 +Author: Xenofon Karamanos +Date: Tue Jan 20 17:01:19 2026 +0000 + + ims_qos_npn: cmake: Add missing dependencies + + (cherry picked from commit 5cf2f4ecde080d6ab1402b9c94bcb33f7b91b8dc) + +commit f10715bb3fa82627a1804cfc62dafaee73c662c1 +Author: Xenofon Karamanos +Date: Tue Jan 20 17:00:58 2026 +0000 + + ims_qos: cmake: Add missing dependencies + + (cherry picked from commit cd5ad0b7f0f14bcdafa0ec7597d7a0a802260429) + +commit 4f2ed2db5f1364525e5e2d7df402556f885b6264 +Author: Xenofon Karamanos +Date: Tue Jan 20 17:00:35 2026 +0000 + + ims_ocs: cmake: Add missing dependencies + + (cherry picked from commit 5a3874b0140527eacbb1c90ea53a6c8560cbb892) + +commit 26c2c3bf1bdab22166f0f3b434557b240e7072b6 +Author: Xenofon Karamanos +Date: Tue Jan 20 17:00:08 2026 +0000 + + ims_ipsec_pcscf: cmake: Add missing dependencies + + (cherry picked from commit a4589658e78a79a4d9561ee50eae208360513f86) + +commit 0c152bfb9f2b8819b37c66cfc3213f08508b08d5 +Author: Xenofon Karamanos +Date: Tue Jan 20 16:58:43 2026 +0000 + + ims_diameter_server: cmake: Add missing dependencies + + (cherry picked from commit a284b855016eaeed430c79db9300f0c167aa7dc3) + +commit ddf2cdd70a851661769f6e6e9492cac1a544be70 +Author: Xenofon Karamanos +Date: Tue Jan 20 16:58:27 2026 +0000 + + erlang: cmake: Add missing dependencies + + (cherry picked from commit 441b7c861e0d1324b642493175e28b7d8a41a974) + +commit b9a03d970ae1cf180ba6a6f261744c0ab9861749 +Author: Xenofon Karamanos +Date: Wed Jan 21 01:35:21 2026 +0000 + + cmake: erlang: Adopt for newer Erlang/OTP version + + - libinterface.a deprecated in OTP Version 23 + - Allow custom installation paths + + (cherry picked from commit 13d22450cdf99c6bbc31dfae51d874361b8f78f6) + +commit 27018e007d045a0d9e2b10479136b31d9e22a1d4 +Author: Xenofon Karamanos +Date: Tue Jan 20 16:57:32 2026 +0000 + + cdp: cmake: Add missing dependencies + + (cherry picked from commit d13fcc0300c6bed9f531d0db9a513e116ca4d89a) + +commit 00296194d1fda096000441083886e11d51e5c099 +Author: Xenofon Karamanos +Date: Tue Jan 20 16:57:05 2026 +0000 + + app_ruby_proc: cmake: Add missing dependencies + + (cherry picked from commit 7d86a9b2d20bb0b8a550498be44bb904066c00a9) + +commit 59cb58305afa84ebdee1ca63708920ead855635e +Author: Xenofon Karamanos +Date: Tue Jan 20 16:56:21 2026 +0000 + + app_ruby: cmake: Add missing dependencies + + (cherry picked from commit f87fd704d4ec4d6c470fc49be799a460937de806) + +commit f2d67fb3e1abdf03834c179f0747b9bd31896151 +Author: Xenofon Karamanos +Date: Mon Jan 19 09:15:33 2026 +0000 + + tlsa: cmake: Add build workaround for riscv64 + + (cherry picked from commit ba74e43074eaf9df80f6b2d231c658bbc4b85db6) + +commit 6380082df413958166f5413dcfe42c5914dae1d6 +Author: Xenofon Karamanos +Date: Fri Jan 16 11:07:02 2026 +0000 + + tlsa: cmake: Search for static openssl with find_package + + (cherry picked from commit acf5882c6142674a8f44de208f60f8d586eefb11) + +commit 075aba703ae7cb287ffff600dfa35ad3ce3670b4 +Author: Daniel-Constantin Mierla +Date: Wed Jan 14 23:21:37 2026 +0100 + + tlsa: CMakeLists.txt - search and link to static ssl, crypto and z libs + + - GH #4552 + + (cherry picked from commit 73d2ffe0f39d27376ea2e4082d1cbf317a80623d) + +commit 5d6372dccf8739e7ae10edb5890ef5832750ca0f +Author: Daniel-Constantin Mierla +Date: Wed Jan 14 19:25:39 2026 +0100 + + tls: CMakeLists.txt - added scope to target_compile_definitions() + + (cherry picked from commit aa64948ab69ce4ea7c0210de42b357353ff9aee4) + +commit 379d15587b8f8e24a631426eed95831165f0a08b +Author: Daniel-Constantin Mierla +Date: Wed Jan 14 19:24:01 2026 +0100 + + tlsa: CMakeLists.txt - the module has to be always linked with static libs + + - removed condition on LIBSSL_STATIC + + (cherry picked from commit 8006cc7d72b71b1e65c7f6eabead72593d03fcd6) + +commit 4d67fbf0d297f7c93f206a42fe74297939ec2c2e +Author: Xenofon Karamanos +Date: Tue Jan 13 15:28:41 2026 +0000 + + microhttpd: Lower acceptable version + + - bookworm builds fine with 0.9.72 + + (cherry picked from commit 8e3e3499c15c77403974d94f8602384e7455cbed) + +commit 7bbbd0a5f93e7a70671784048cc593acab4327df +Author: Xenofon Karamanos +Date: Tue Jan 13 16:00:59 2026 +0000 + + cmake: netsnmp: Don't require the cflags + + - It was using wrong interface property + - kamailio modules do not require them + + (cherry picked from commit 884208172dd50fcbda1010be1e5cff66a484cfbc) + +commit d74ac6f65d20332692ee70809dca206cfbfe6275 +Author: Xenofon Karamanos +Date: Tue Jan 13 10:54:44 2026 +0000 + + rabbitmq: cmake: Use pkgconfig to find it + + - v0.11 (bookworm) reports wrong version (4.5.0) when used which adds the defintion and breaks the build + + (cherry picked from commit c13053e0d015391ceb76161375ca8389af40158d) + +commit 5f0de9fef869f4b312842bf71009e7f19fad9c39 +Author: Xenofon Karamanos +Date: Wed Dec 17 11:53:27 2025 +0000 + + cmake: Add default and per arch priority list for lock methods + + - Add aarch64 support for futexlock + - Add default priority according to lock_ops.h + - Add per-arch priorrity list, if not exist back to default + - Add aarch64 priority list + - Add some compile warnings + + (cherry picked from commit 18119539680183d5815df84c67d64a94357afbfd) + +commit eca78e86d21c7cb571e4fe1b7c76a10e9942b14d +Author: Xenofon Karamanos +Date: Fri Dec 12 13:02:20 2025 +0000 + + cmake: Update futex and fast_lock arch support + + - Remove futex support for arm + - Add fast_lock support for arm + + (cherry picked from commit 4b3ac98cd29b3fbe9856e9b83e92e49031fe081a) + +commit dff8a9c266c7676af7d809579f4fce85dddd9f1a +Author: Xenofon Karamanos +Date: Thu Dec 11 15:54:06 2025 +0000 + + cmake: Update arch that support futex locking mechanism + + (cherry picked from commit 9ad781bb519182cb13b63be5bc2c68944a75c1d3) + +commit 37379eff106f2746a360dcbf91fa0bc4ec780400 +Author: Xenofon Karamanos +Date: Tue Dec 9 11:09:50 2025 +0000 + + cmake: Don't USE_FUTEX for arm64/aarch64 + + (cherry picked from commit a326b57363754e2ba5e1824e02b2a1ce80584fc7) + +commit 38d9c40e646f820404c422518690e1af7d824729 +Author: Xenofon Karamanos +Date: Wed Sep 24 15:38:35 2025 +0000 + + core: Add missing USE_FUTEX check in locks + + (cherry picked from commit da4e0d2dab0678374abbe6fa2274a6a434cf39c5) + +commit 80bc8665dcc185f5301b93283560a890eac73ac4 +Author: Xenofon Karamanos +Date: Tue Aug 12 14:13:05 2025 +0000 + + cmake: Update locking method detection + + (cherry picked from commit b4df3a4e9586e5a583fbee089993f9eb25e2d417) + +commit bca81cc5694cf05a669637cefb94faf0ce1b5a5d +Author: Xenofon Karamanos +Date: Mon Dec 8 16:30:46 2025 +0000 + + cmake: Respect KTLS_INCLUDE_TLSA env variable + + - KTLS group will include TLSA modules as well when defined + - KTLSA group exists when not defined + + (cherry picked from commit 0f67c919e2a0b06e6a398867aff47cef7a7db679) + +commit 8621578197b44fe2f6794b16ec20bfb1d048dd88 +Author: Xenofon Karamanos +Date: Mon Aug 18 09:40:50 2025 +0000 + + websocket: cmake: Replace definition as an option for visibility + + - EMBEDDED_UTF8_DECODE option + + (cherry picked from commit acae32534942bd50436ec5e615193bd8f55f42cc) + +commit 9efb4c9ed558e7054f98e52abe1db2c4f9c0e132 +Author: Nathan Bruning +Date: Fri Jan 23 12:10:36 2026 +0100 + + core: qm: fix bookkeeping of used and real_used in case of fragment split + + (cherry picked from commit 412dcbfc9e2079c16ca23e423beb12b867ab4709) + +commit f8df3ff98392c63733e0eb7e2c47e502730ee9dc +Author: herlesupreeth +Date: Mon Jan 26 13:25:04 2026 +0000 + + ims_ipsec_pcscf: reuse IPSec tunnel params only if Ck and Ik stays the same + + (cherry picked from commit e728b7b8ec58cbd4c322fac076ef24572e895d0a) + +commit 800895cb5d069268016812a0174ca3ed2dc6b479 +Author: Victor Seva +Date: Wed Jan 21 08:36:46 2026 +0100 + + ims_registrar_scscf: unlock_udomain using the proper identity + + related #4553 + +commit 8529975a9e2fc9f61dcde50955db02c78c7157b4 +Author: Victor Seva +Date: Thu Jan 15 09:54:19 2026 +0100 + + ims_registrar_scscf: fix missing unlocks at update_contacts() + + issue introduced at 75904895577d0329ba0d30d10e645b8769451e51 + + fix #4553 + + (cherry picked from commit dacfbbf4d919c3004827bc7a0107c37a9bf77655) + +commit 5ae059af990782f7f38b6738d01fa59e961e54f7 +Author: herlesupreeth +Date: Tue Nov 11 19:15:17 2025 +0000 + + ims_registrar_scscf: check event type before populating Subscription-State in NOTIFY from S-CSCF + + (cherry picked from commit 913dce948729cdd0f9e45e7d71da8c3936719c58) + +commit 96dc055e5bc08791e30296faa8a0f60867268aa5 +Author: herlesupreeth +Date: Tue Nov 11 18:15:33 2025 +0000 + + ims_registrar_scscf: fix populating of Subscription-State in NOTIFY from S-CSCF + + (cherry picked from commit b4e07a290b7cbf369762c579a81182a1f9edf6e4) + +commit 288639366a56235c4a09266d734c9520e78a9f0f +Author: Xenofon Karamanos +Date: Mon Nov 17 17:16:48 2025 +0000 + + cmake: Demote fatal errors to warning for compilers + + (cherry picked from commit f7da6becd8bdb6446ea7ca4b681b694283f02102) + +commit d467d91eea3eaee4822e130588c86fd3cc5d662b +Author: Henning Westerholt +Date: Wed Nov 26 09:39:54 2025 +0000 + + topos_htable: fix PRACK routing + + - fix PRACK routing + - related to GH #4466 + + (cherry picked from commit e893703d2b319468ca9d5f9ff51d8b74a29ca190) + +commit 6a8ccf7841e016f7d2c219469f517343281e09bd +Author: Stefan Mititelu +Date: Tue Oct 7 13:55:19 2025 +0300 + + topos_htable: remove smethod from transaction key + + (cherry picked from commit b8db6e6ee1ff61ca517c209a202f5db05865c3ab) + +commit 6e51390db6b60178b58c2a9f619011aae4f35eea +Author: Daniel-Constantin Mierla +Date: Thu Jan 8 21:10:17 2026 +0100 + + core: split input/output parameters validation for base64url_enc()/_dec() + + - update after commit d7210bc1102ae820f9e6f8998694271ac2a320fe, allowing + again null input with lenght 0 that is used by some modules (e.g., + topos_htable) + - GH #4546 + + (cherry picked from commit 21f84cd08052a656ffc74480ee22b2ab6b7a02f0) + + + ===================== 2026-01-08 Version 6.0.5 Released ===================== ===================== Changes Since Version 6.0.4 =========================== diff --git a/cmake/compiler-specific.cmake b/cmake/compiler-specific.cmake index 51679f963..2b41cd154 100644 --- a/cmake/compiler-specific.cmake +++ b/cmake/compiler-specific.cmake @@ -149,8 +149,8 @@ elseif(TARGET_ARCH MATCHES "ppc64$") "GCC version ${CMAKE_C_COMPILER_VERSION} is too old for ppc64. Try GCC 3.0 or newer." ) endif() - # else() - # message(FATAL_ERROR "Unsupported compiler (${CMAKE_C_COMPILER_ID}) for ppc64. Try GCC.") + else() + message(WARNING "Unsupported compiler (${CMAKE_C_COMPILER_ID}) for ppc64. Try GCC.") endif() elseif(TARGET_ARCH STREQUAL "ppc") # PowerPC 32-bit specific flags @@ -197,7 +197,7 @@ elseif(TARGET_ARCH STREQUAL "arm7") ) endif() else() - message(FATAL_ERROR "Unsupported compiler (${CMAKE_C_COMPILER_ID}) for arm7. Try GCC.") + message(WARNING "Unsupported compiler (${CMAKE_C_COMPILER_ID}) for arm7. Try GCC.") endif() elseif(TARGET_ARCH STREQUAL "arm6") if(CMAKE_C_COMPILER_ID STREQUAL "GNU") @@ -235,7 +235,7 @@ elseif(TARGET_ARCH STREQUAL "arm") ) endif() else() - message(FATAL_ERROR "Unsupported compiler (${CMAKE_C_COMPILER_ID}) for arm. Try GCC.") + message(WARNING "Unsupported compiler (${CMAKE_C_COMPILER_ID}) for arm. Try GCC.") endif() elseif(TARGET_ARCH STREQUAL "sparc64") if(CMAKE_C_COMPILER_ID STREQUAL "GNU") @@ -269,9 +269,7 @@ elseif(TARGET_ARCH STREQUAL "sparc64") -xc99 ) else() - message( - FATAL_ERROR "Unsupported compiler (${CMAKE_C_COMPILER_ID}) for sparc64. Try GCC or Sun." - ) + message(WARNING "Unsupported compiler (${CMAKE_C_COMPILER_ID}) for sparc64. Try GCC or Sun.") endif() elseif(TARGET_ARCH STREQUAL "sparc") if(CMAKE_C_COMPILER_ID STREQUAL "GNU") @@ -294,7 +292,7 @@ elseif(TARGET_ARCH STREQUAL "sparc") common_compiler_flags INTERFACE -xO3 -xtarget=native -xmemalign=4i -fma=fused -fns=yes -xc99 ) else() - message(FATAL_ERROR "Unsupported compiler (${CMAKE_C_COMPILER_ID}) for sparc. Try GCC or Sun.") + message(WARNING "Unsupported compiler (${CMAKE_C_COMPILER_ID}) for sparc. Try GCC or Sun.") endif() elseif(TARGET_ARCH STREQUAL "mips") if(CMAKE_C_COMPILER_ID STREQUAL "GNU") diff --git a/cmake/defs.cmake b/cmake/defs.cmake index 177198111..99f036554 100644 --- a/cmake/defs.cmake +++ b/cmake/defs.cmake @@ -125,16 +125,6 @@ option(USE_DNS_FAILOVER "Use DNS failover" ON) option(USE_DST_BLOCKLIST "Use destination blacklist" ON) option(HAVE_RESOLV_RES "Have resolv_res" ON) -option(KSR_PTHREAD_MUTEX_SHARED "Use shared mutex for TLS" ON) - -# if(${MEMPKG}) -# target_compile_definitions(common INTERFACE PKG_MALLOC) -# else() -# if(${MEMDBGSYS}) -# target_compile_definitions(common INTERFACE DDBG_SYS_MEMORY) -# endif() -# endif() - # ----------------------- # TLS support # ----------------------- @@ -154,10 +144,8 @@ else() set(TLS_HOOKS ON) endif() -set(LIBSSL_SET_MUTEX_SHARED - ON - CACHE BOOL "enable workaround for libssl 1.1+ to set shared mutex attribute" -) +option(LIBSSL_SET_MUTEX_SHARED "enable workaround for libssl 1.1+ to set shared mutex attribute" ON) + if(NOT ${LIBSSL_SET_MUTEX_SHARED}) message(STATUS "Checking if can enable workaround for libssl 1.1+ to set shared mutex attribute") @@ -180,61 +168,10 @@ if(NOT ${LIBSSL_SET_MUTEX_SHARED}) endif() # ----------------------- -# Locking mechanism macro +# Locking mechanism # ----------------------- -option(USE_FAST_LOCK "Use fast locking if available" ON) - -# TODO: Discuss if we need to expose this to the user to choose between -# different locking methods - -# set(locking_methods FAST_LOCK USE_FUTEX USE_PTHREAD_MUTEX USE_POSIX_SEM -# USE_SYSV_SEM) -# set(LOCK_METHOD -# "" -# CACHE STRING "Locking method to use. Fast-lock if available is default") -# # List of locking methods in option -# set_property(CACHE LOCK_METHOD PROPERTY STRINGS ${locking_methods}) -# mark_as_advanced(LOCK_METHOD) - -# Fast-lock not available for all platforms like mips -# Check the system processor type and set USE_FAST_LOCK accordingly -if(USE_FAST_LOCK) - if(TARGET_ARCH MATCHES "i386$|x86_64$|sparc64$|sparc$|ppc$|ppc64$|mips2$|mips64$") - set(USE_FAST_LOCK YES) - elseif(TARGET_ARCH MATCHES "aarch64$") - set(USE_FAST_LOCK YES) - target_compile_definitions(common INTERFACE NOSMP) # memory barriers not - # implemented for arm - elseif(TARGET_ARCH MATCHES "arm6$|arm7$") - set(USE_FAST_LOCK YES) - elseif(TARGET_ARCH MATCHES "arm$") - set(USE_FAST_LOCK YES) - target_compile_definitions(common INTERFACE NOSMP) # memory barriers not - # implemented for arm - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "mips$") - set(USE_FAST_LOCK NO) - target_compile_definitions(common INTERFACE MIPS_HAS_LLSC) # likely - target_compile_definitions(common INTERFACE NOSMP) # very likely - elseif(TARGET_ARCH MATCHES "alpha$") - set(USE_FAST_LOCK YES) - target_compile_definitions(common INTERFACE NOSMP) # very likely - else() - message(STATUS "Fast locking not available for this platform, disabling USE_FAST_LOCK") - set(USE_FAST_LOCK NO) - endif() -endif() - -# Add definitions if USE_FAST_LOCK is YES -message(STATUS "Fast lock available: USE_FAST_LOCK=${USE_FAST_LOCK}") -if(USE_FAST_LOCK) - # If fast lock is available, add the definitions for it, else each OS will - # have its own locking method - target_compile_definitions(common INTERFACE FAST_LOCK ADAPTIVE_WAIT ADAPTIVE_WAIT_LOOPS=1024) -endif() - -# set(LOCKING_DEFINITION "${locking_method}") -# message(STATUS "Locking method: ${LOCK_METHOD}") +include(${CMAKE_SOURCE_DIR}/cmake/lock_methods.cmake) # ----------------------- # Setting all the flags from options @@ -338,7 +275,7 @@ if(NO_DEV_POLL) target_compile_definitions(common INTERFACE NO_DEV_POLL) endif() -if(KSR_PTHREAD_MUTEX_SHARED) +if(LIBSSL_SET_MUTEX_SHARED) target_compile_definitions(common INTERFACE KSR_PTHREAD_MUTEX_SHARED) endif() diff --git a/cmake/groups.cmake b/cmake/groups.cmake index 353611f03..03c89579b 100644 --- a/cmake/groups.cmake +++ b/cmake/groups.cmake @@ -104,6 +104,8 @@ set(MOD_LIST_EXTRA dlgs sworker influxdbc + pvtpl + siprepo ) # * common modules depending on database @@ -292,6 +294,7 @@ set(MOD_LIST_IMS ims_isc ims_icscf ims_qos + ims_qos_npn ims_registrar_pcscf ims_registrar_scscf ims_usrloc_pcscf @@ -545,7 +548,7 @@ set(MODULE_GROUP_KMEMCACHED ${MOD_LIST_MEMCACHED}) set(MODULE_GROUP_KTLS_BASIC ${MOD_LIST_TLSDEPS}) # pkg tls module with curl -if(KTLS_INCLUDE_TLSA) +if(DEFINED ENV{KTLS_INCLUDE_TLSA}) set(MODULE_GROUP_KTLS ${MOD_LIST_TLSDEPS} ${MOD_LIST_TLSA}) else() set(MODULE_GROUP_KTLS ${MOD_LIST_TLSDEPS}) @@ -706,6 +709,7 @@ set(MODULE_GROUP_PACKAGE_GROUPS KMEMCACHED KTLS_BASIC KTLS + KTLSA KTLS_WOLFSSL KWEBSOCKET KPRESENCE diff --git a/cmake/lock_methods.cmake b/cmake/lock_methods.cmake new file mode 100644 index 000000000..f2b07f380 --- /dev/null +++ b/cmake/lock_methods.cmake @@ -0,0 +1,161 @@ +# Locking method selection + +# Default Priority list (auto): FUTEX > FAST_LOCK > PTHREAD_MUTEX > POSIX_SEM > SYSV_SEM +set(DEFAULT_LOCK_PRIORITY FUTEX FAST_LOCK PTHREAD_MUTEX POSIX_SEM SYSV_SEM) + +# Architecture-specific priorities (can be extended) +# Example: On aarch64, prefer PTHREAD_MUTEX > FAST_LOCK > FUTEX +set(aarch64_LOCK_PRIORITY PTHREAD_MUTEX FAST_LOCK FUTEX POSIX_SEM SYSV_SEM) +# Add more as needed +# set(x86_64_LOCK_PRIORITY FUTEX FAST_LOCK PTHREAD_MUTEX ...) + +# Public cache variable (user may force one); AUTO means detect +set(locking_methods "AUTO" "FAST_LOCK" "FUTEX" "PTHREAD_MUTEX" "POSIX_SEM" "SYSV_SEM") +set(LOCK_METHOD + "AUTO" + CACHE + STRING + "Locking method to use (AUTO, or one of: FUTEX FAST_LOCK PTHREAD_MUTEX POSIX_SEM SYSV_SEM)" +) +# List of locking methods in option +set_property(CACHE LOCK_METHOD PROPERTY STRINGS ${locking_methods}) +mark_as_advanced(LOCK_METHOD) + +# Determine the priority list for the current architecture +if(DEFINED ${TARGET_ARCH}_LOCK_PRIORITY) + set(_LOCK_PRIORITY ${${TARGET_ARCH}_LOCK_PRIORITY}) +else() + set(_LOCK_PRIORITY ${DEFAULT_LOCK_PRIORITY}) +endif() +message(DEBUG "Lock priority for architecture ${TARGET_ARCH}: ${_LOCK_PRIORITY}") + +# Set default locking method if not set +if(NOT LOCK_METHOD) + message(STATUS "No locking method specified, using default: AUTO") + set(LOCK_METHOD "AUTO") +endif() + +# Validate the selected locking method +if(NOT LOCK_METHOD IN_LIST locking_methods) + message( + FATAL_ERROR + "Invalid locking method selected: ${LOCK_METHOD}. Methods available are: ${locking_methods}" + ) +endif() + +# Availability checks +# FUTEX: linux/futex.h +find_path(FUTEX_HEADER_DIR linux/futex.h) +if(FUTEX_HEADER_DIR) + set(_HAVE_FUTEX TRUE) + # This conditional checks if the TARGET_ARCH does not match any of the specified supported architectures. + # The supported architectures include see atomic_native.h and atomic_(arhitecture).h files: + # - Alpha: alpha: atomic_alpha.h + # - ARM variants: arm6, and arm7: atomic_arm.h + # - MIPS variants: mips, mips2, and mips64: atomic_mips.h + # - PowerPC variants: ppc and ppc64: atomic_ppc.h + # - SPARC variants: sparc and sparc64: atomic_sparc.h and atomic_sparc64.h + # - x86 variants: i386 and x86_64: atomic_x86.h + if(NOT + "${TARGET_ARCH}" + MATCHES + "^(i386|x86_64)$|^(mips|mips2|mips64)$|^(ppc|ppc64)$|^(sparc|sparc64)$|^(arm6|arm7|aarch64)$|^alpha$" + ) + set(_HAVE_FUTEX FALSE) + endif() +else() + set(_HAVE_FUTEX FALSE) +endif() + +# PTHREAD: pthread.h (assume present on typical systems) +find_path(PTHREAD_HEADER_DIR pthread.h) +if(PTHREAD_HEADER_DIR) + set(_HAVE_PTHREAD_MUTEX TRUE) +else() + set(_HAVE_PTHREAD_MUTEX FALSE) +endif() + +# POSIX SEM: semaphore.h +find_path(SEM_HEADER_DIR semaphore.h) +if(SEM_HEADER_DIR) + set(_HAVE_POSIX_SEM TRUE) +else() + set(_HAVE_POSIX_SEM FALSE) +endif() + +# SYSV SEM: sys/sem.h +find_path(SYSV_SEM_HEADER_DIR sys/sem.h) +if(SYSV_SEM_HEADER_DIR) + set(_HAVE_SYSV_SEM TRUE) +else() + set(_HAVE_SYSV_SEM FALSE) +endif() + +# check fast-lock arch support +if("${TARGET_ARCH}" MATCHES + "i386$|x86_64$|aarch64$|arm$|arm6$|arm7$|ppc$|ppc64$|sparc64$|sparc$|alpha$|mips2$|mips64$" +) + set(_HAVE_FAST_LOCK TRUE) +elseif("${TARGET_ARCH}" MATCHES "mips$") + # explicitly unsupported (old code added extra defs) + set(_HAVE_FAST_LOCK FALSE) +else() + set(_HAVE_FAST_LOCK FALSE) +endif() + +message( + STATUS + "Locking Methods for this platform: FUTEX=${_HAVE_FUTEX} FAST_LOCK=${_HAVE_FAST_LOCK} PTHREAD_MUTEX=${_HAVE_PTHREAD_MUTEX} POSIX_SEM=${_HAVE_POSIX_SEM} SYSV_SEM=${_HAVE_SYSV_SEM}" +) + +# Final locking method selection logic +set(_SELECTED_LOCK_METHOD "") + +if("${LOCK_METHOD}" STREQUAL "AUTO") + # Iterate through the priority list for the current arch + foreach(method IN LISTS _LOCK_PRIORITY) + if(_HAVE_${method}) + set(_SELECTED_LOCK_METHOD "${method}") + break() + endif() + endforeach() + + if(_SELECTED_LOCK_METHOD STREQUAL "") + message(FATAL_ERROR "No supported locking method found for this platform.") + endif() +else() + set(_SELECTED_LOCK_METHOD "${LOCK_METHOD}") +endif() + +message(STATUS "Selected locking method: ${_SELECTED_LOCK_METHOD}") + +# Set compile definitions based on the selected method +if("${_SELECTED_LOCK_METHOD}" STREQUAL "FUTEX") + target_compile_definitions(common INTERFACE USE_FUTEX) +elseif("${_SELECTED_LOCK_METHOD}" STREQUAL "FAST_LOCK") + target_compile_definitions(common INTERFACE FAST_LOCK ADAPTIVE_WAIT ADAPTIVE_WAIT_LOOPS=1024) + if("${TARGET_ARCH}" MATCHES "mips$") + # Add special definitions for mips + FAST_LOCK + target_compile_definitions(common INTERFACE MIPS_HAS_LLSC) # likely + target_compile_definitions(common INTERFACE NOSMP) # very likely + elseif("${TARGET_ARCH}" MATCHES "arm$|aarch64$") + target_compile_definitions(common INTERFACE NOSMP) # memory barriers not implemented for arm + endif() +elseif("${_SELECTED_LOCK_METHOD}" STREQUAL "PTHREAD_MUTEX") + target_compile_definitions(common INTERFACE USE_PTHREAD_MUTEX) + target_link_libraries(common INTERFACE pthread) +elseif("${_SELECTED_LOCK_METHOD}" STREQUAL "POSIX_SEM") + target_compile_definitions(common INTERFACE USE_POSIX_SEM) + target_link_libraries(common INTERFACE pthread) +elseif("${_SELECTED_LOCK_METHOD}" STREQUAL "SYSV_SEM") + target_compile_definitions(common INTERFACE USE_SYSV_SEM) +else() + message(FATAL_ERROR "Unknown locking method: ${_SELECTED_LOCK_METHOD}") +endif() + +# Cache the final locking method for use in other parts of the build +# This is an internal cache variable, not meant for user modification +set(LOCK_METHOD_FINAL + "${_SELECTED_LOCK_METHOD}" + CACHE INTERNAL "Final locking method selected" +) diff --git a/cmake/modules/FindErlang.cmake b/cmake/modules/FindErlang.cmake index 5335853b4..963b3803d 100644 --- a/cmake/modules/FindErlang.cmake +++ b/cmake/modules/FindErlang.cmake @@ -49,7 +49,10 @@ This will define the following variables: #]=======================================================================] include(FindPackageHandleStandardArgs) -set(Erlang_BIN_PATH $ENV{ERLANG_HOME}/bin /opt/bin /sw/bin /usr/bin /usr/local/bin /opt/local/bin) +set(Erlang_BIN_PATH + "$ENV{ERLANG_HOME}/bin;/opt/bin;/sw/bin;/usr/bin;/usr/local/bin;/opt/local/bin" + CACHE STRING "Semicolon-separated list of paths to search for Erlang binaries" +) find_program( Erlang_RUNTIME @@ -63,25 +66,50 @@ find_program( PATHS ${Erlang_BIN_PATH} ) -execute_process( - COMMAND erl -noshell -eval "io:format(\"~s\", [code:lib_dir()])" -s erlang halt - OUTPUT_VARIABLE Erlang_OTP_LIB_DIR +set(Erlang_OTP_LIB_DIR + "" + CACHE STRING "Erlang OTP library directory. Will be determined by erl bin if not set." ) - -execute_process( - COMMAND erl -noshell -eval "io:format(\"~s\", [code:root_dir()])" -s erlang halt - OUTPUT_VARIABLE Erlang_OTP_ROOT_DIR +if(NOT Erlang_OTP_LIB_DIR) + execute_process( + COMMAND erl -noshell -eval "io:format(\"~s\", [code:lib_dir()])" -s erlang halt + OUTPUT_VARIABLE Erlang_OTP_LIB_DIR + ) +endif() + +set(Erlang_OTP_ROOT_DIR + "" + CACHE STRING "Erlang OTP root directory. Will be determined by erl bin if not set." ) - -execute_process( - COMMAND erl -noshell -eval "io:format(\"~s\",[filename:basename(code:lib_dir('erl_interface'))])" - -s erlang halt OUTPUT_VARIABLE Erlang_EI_DIR +if(NOT Erlang_OTP_ROOT_DIR) + execute_process( + COMMAND erl -noshell -eval "io:format(\"~s\", [code:root_dir()])" -s erlang halt + OUTPUT_VARIABLE Erlang_OTP_ROOT_DIR + ) +endif() + +set(Erlang_EI_DIR + "" + CACHE STRING "Erlang erl_interface directory name. Will be determined by erl bin if not set." ) - -execute_process( - COMMAND erl -noshell -eval "io:format(\"~s\",[filename:basename(code:lib_dir('erts'))])" -s erlang - halt OUTPUT_VARIABLE Erlang_ERTS_DIR +if(NOT Erlang_EI_DIR) + execute_process( + COMMAND erl -noshell -eval + "io:format(\"~s\",[filename:basename(code:lib_dir('erl_interface'))])" -s erlang halt + OUTPUT_VARIABLE Erlang_EI_DIR + ) +endif() + +set(Erlang_ERTS_DIR + "" + CACHE STRING "Erlang ERTS directory name. Will be determined by erl bin if not set." ) +if(NOT Erlang_ERTS_DIR) + execute_process( + COMMAND erl -noshell -eval "io:format(\"~s\",[filename:basename(code:lib_dir('erts'))])" -s + erlang halt OUTPUT_VARIABLE Erlang_ERTS_DIR + ) +endif() set(Erlang_EI_PATH ${Erlang_OTP_LIB_DIR}/${Erlang_EI_DIR}) set(Erlang_EI_INCLUDE_DIRS ${Erlang_OTP_LIB_DIR}/${Erlang_EI_DIR}/include) @@ -91,15 +119,21 @@ set(Erlang_ERTS_PATH ${Erlang_OTP_ROOT_DIR}/${Erlang_ERTS_DIR}) set(Erlang_ERTS_INCLUDE_DIRS ${Erlang_OTP_ROOT_DIR}/${Erlang_ERTS_DIR}/include) set(Erlang_ERTS_LIBRARY_PATH ${Erlang_OTP_ROOT_DIR}/${Erlang_ERTS_DIR}/lib) +# Find the version of Erlang +execute_process( + COMMAND + erl -eval + "{ok, Version} = file:read_file(filename:join([code:root_dir(), 'releases', erlang:system_info(otp_release), 'OTP_VERSION'])), io:fwrite(Version), halt()." + -noshell + OUTPUT_VARIABLE Erlang_VERSION +) +string(STRIP "${Erlang_VERSION}" Erlang_VERSION) + find_package_handle_standard_args( Erlang - DEFAULT_MSG - Erlang_RUNTIME - Erlang_COMPILE - Erlang_OTP_LIB_DIR - Erlang_OTP_ROOT_DIR - Erlang_EI_DIR - Erlang_ERTS_DIR + REQUIRED_VARS Erlang_RUNTIME Erlang_COMPILE Erlang_OTP_LIB_DIR Erlang_OTP_ROOT_DIR Erlang_EI_DIR + Erlang_ERTS_DIR + VERSION_VAR Erlang_VERSION ) if(Erlang_FOUND) @@ -119,15 +153,23 @@ if(Erlang_FOUND) endif() if(NOT TARGET Erlang::EI) + add_library(Erlang::EI INTERFACE IMPORTED) + add_library(erlang_ei STATIC IMPORTED) set_property(TARGET erlang_ei PROPERTY IMPORTED_LOCATION ${Erlang_EI_LIBRARY_PATH}/libei.a) - add_library(erlang_erl_interface STATIC IMPORTED) + if(Erlang_VERSION VERSION_LESS "23") + add_library(erlang_erl_interface STATIC IMPORTED) + set_property( + TARGET erlang_erl_interface PROPERTY IMPORTED_LOCATION + ${Erlang_EI_LIBRARY_PATH}/liberl_interface.a + ) + set_property(TARGET Erlang::EI PROPERTY INTERFACE_LINK_LIBRARIES erlang_erl_interface) + endif() + set_property(TARGET Erlang::EI PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${Erlang_EI_INCLUDE_DIRS}) set_property( - TARGET erlang_erl_interface PROPERTY IMPORTED_LOCATION - ${Erlang_EI_LIBRARY_PATH}/liberl_interface.a + TARGET Erlang::EI + APPEND + PROPERTY INTERFACE_LINK_LIBRARIES erlang_ei ) - add_library(Erlang::EI INTERFACE IMPORTED) - set_property(TARGET Erlang::EI PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${Erlang_EI_INCLUDE_DIRS}) - set_property(TARGET Erlang::EI PROPERTY INTERFACE_LINK_LIBRARIES erlang_ei erlang_erl_interface) endif() endif(Erlang_FOUND) diff --git a/cmake/modules/FindNETSNMP.cmake b/cmake/modules/FindNETSNMP.cmake index eed4d28d3..2fd4ff500 100644 --- a/cmake/modules/FindNETSNMP.cmake +++ b/cmake/modules/FindNETSNMP.cmake @@ -38,12 +38,15 @@ endif(NETSNMP_LIBS) find_program(NETSNMP_CONFIG_BIN net-snmp-config) if(NETSNMP_CONFIG_BIN) - execute_process(COMMAND ${NETSNMP_CONFIG_BIN} --cflags OUTPUT_VARIABLE _NETSNMP_CFLAGS) - execute_process(COMMAND ${NETSNMP_CONFIG_BIN} --libs OUTPUT_VARIABLE _NETSNMP_LIBS) + # Find libs required + execute_process(COMMAND ${NETSNMP_CONFIG_BIN} --netsnmp-agent-libs OUTPUT_VARIABLE _NETSNMP_LIBS) # Strip trailing and leading whitespaces - string(STRIP "${_NETSNMP_CFLAGS}" _NETSNMP_CFLAGS) string(STRIP "${_NETSNMP_LIBS}" _NETSNMP_LIBS) + # Create a list from the flags to be used in target_link_libraries and + # not quoted as a single argument + separate_arguments(_NETSNMP_LIBS UNIX_COMMAND "${_NETSNMP_LIBS}") + set(_NETSNMP_CFLAGS " ") set(NETSNMP_CFLAGS ${_NETSNMP_CFLAGS} CACHE STRING "CFLAGS for net-snmp lib" @@ -55,10 +58,16 @@ if(NETSNMP_CONFIG_BIN) set(NETSNMP_FOUND TRUE BOOL "net-snmp is found") add_library(NETSNMP::NETSNMP INTERFACE IMPORTED) - set_target_properties( - NETSNMP::NETSNMP PROPERTIES COMPILE_FLAGS "${NETSNMP_CFLAGS}" INTERFACE_LINK_LIBRARIES - "${NETSNMP_LIBS}" - ) + set_target_properties(NETSNMP::NETSNMP PROPERTIES INTERFACE_LINK_LIBRARIES "${NETSNMP_LIBS}") + + # Find cflags required if ever needed. kamailio modules don't need them currently. + # execute_process(COMMAND ${NETSNMP_CONFIG_BIN} --cflags OUTPUT_VARIABLE _NETSNMP_CFLAGS) + # string(STRIP "${_NETSNMP_CFLAGS}" _NETSNMP_CFLAGS) + # # string(REPLACE " " ";" _NETSNMP_CFLAGS "${_NETSNMP_CFLAGS}") + # separate_arguments(_NETSNMP_CFLAGS UNIX_COMMAND "${_NETSNMP_CFLAGS}") + # set_target_properties( + # NETSNMP::NETSNMP PROPERTIES INTERFACE_COMPILE_OPTIONS "${NETSNMP_CFLAGS}" + # ) if(NOT TARGET NETSNMP::NETSNMP) message( diff --git a/cmake/os-specific/linux.cmake b/cmake/os-specific/linux.cmake index b55603cef..b96b406ab 100644 --- a/cmake/os-specific/linux.cmake +++ b/cmake/os-specific/linux.cmake @@ -20,44 +20,3 @@ target_link_libraries(common_utils INTERFACE resolv) if(${RAW_SOCKS}) target_compile_definitions(common INTERFACE USE_RAW_SOCKS) endif() - -if(NOT ${USE_FAST_LOCK}) - target_compile_definitions(common INTERFACE USE_PTHREAD_MUTEX) - target_link_libraries(common INTERFACE pthread) - message(STATUS "FAST_LOCK not available on this platform, using: USE_PTHREAD_MUTEX") -else() - # TODO: Check if this can be reached. Right now it is not possible to set - # LOCK_METHOD, only USE_FAST_LOCK. This branch is reached when USE_FAST_LOCK - # is set to true (meaning it is available on platform). - # Check if lock_method is posix or pthread - # if(LOCK_METHOD STREQUAL "USE_POSIX_SEM" OR LOCK_METHOD STREQUAL - # "USE_PTHREAD_MUTEX") - # message(STATUS "Using ${LOCK_METHOD} for locks") - # target_link_libraries(common INTERFACE pthread) - # endif() -endif() - -if(NOT NO_SELECT) - target_compile_definitions(common INTERFACE HAVE_SELECT) -endif() - -# TODO introduce check for epoll -if(NOT NO_EPOLL) - target_compile_definitions(common INTERFACE HAVE_EPOLL) -endif() - -# TODO introduce check for sigio -if(NOT NO_SIGIO_RT) - target_compile_definitions(common INTERFACE HAVE_SIGIO_RT SIGINFO64_WORKAROUND) -endif() - -# TODO This is placed here to match the Makefiles where both -# FAST_LOCK and USE_FUTEX are defined unconditionally. -# This also had the side effect that futex also uses the definitions -# defined for FAST_LOCK like ADAPTIVE_WAIT[_LOOPS]. -# https://github.com/kamailio/kamailio/pull/4363 aims to fix this -# and we should decide whether to also apply the definitions for USE_FUTEX case. -find_path(FUTEX_HEADER_DIR linux/futex.h) -if(FUTEX_HEADER_DIR) - target_compile_definitions(common INTERFACE USE_FUTEX) -endif() diff --git a/pkg/kamailio/alpine/APKBUILD b/pkg/kamailio/alpine/APKBUILD index 7f6ca909a..115de9757 100644 --- a/pkg/kamailio/alpine/APKBUILD +++ b/pkg/kamailio/alpine/APKBUILD @@ -5,7 +5,7 @@ # Maintainer: Nathan Angelacos pkgname=kamailio -pkgver=6.0.5 +pkgver=6.0.6 pkgrel=0 # If building from a git snapshot, specify the gitcommit diff --git a/pkg/kamailio/deb/bionic/changelog b/pkg/kamailio/deb/bionic/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/bionic/changelog +++ b/pkg/kamailio/deb/bionic/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/bookworm/changelog b/pkg/kamailio/deb/bookworm/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/bookworm/changelog +++ b/pkg/kamailio/deb/bookworm/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/bullseye/changelog b/pkg/kamailio/deb/bullseye/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/bullseye/changelog +++ b/pkg/kamailio/deb/bullseye/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/buster/changelog b/pkg/kamailio/deb/buster/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/buster/changelog +++ b/pkg/kamailio/deb/buster/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/debian/changelog b/pkg/kamailio/deb/debian/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/debian/changelog +++ b/pkg/kamailio/deb/debian/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/focal/changelog b/pkg/kamailio/deb/focal/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/focal/changelog +++ b/pkg/kamailio/deb/focal/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/jammy/changelog b/pkg/kamailio/deb/jammy/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/jammy/changelog +++ b/pkg/kamailio/deb/jammy/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/jessie/changelog b/pkg/kamailio/deb/jessie/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/jessie/changelog +++ b/pkg/kamailio/deb/jessie/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/noble/changelog b/pkg/kamailio/deb/noble/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/noble/changelog +++ b/pkg/kamailio/deb/noble/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/precise/changelog b/pkg/kamailio/deb/precise/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/precise/changelog +++ b/pkg/kamailio/deb/precise/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/sid/changelog b/pkg/kamailio/deb/sid/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/sid/changelog +++ b/pkg/kamailio/deb/sid/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/stretch/changelog b/pkg/kamailio/deb/stretch/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/stretch/changelog +++ b/pkg/kamailio/deb/stretch/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/trixie/changelog b/pkg/kamailio/deb/trixie/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/trixie/changelog +++ b/pkg/kamailio/deb/trixie/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/trusty/changelog b/pkg/kamailio/deb/trusty/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/trusty/changelog +++ b/pkg/kamailio/deb/trusty/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/wheezy/changelog b/pkg/kamailio/deb/wheezy/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/wheezy/changelog +++ b/pkg/kamailio/deb/wheezy/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/deb/xenial/changelog b/pkg/kamailio/deb/xenial/changelog index bbe05ce57..4ec5781a8 100644 --- a/pkg/kamailio/deb/xenial/changelog +++ b/pkg/kamailio/deb/xenial/changelog @@ -1,3 +1,9 @@ +kamailio (6.0.6) unstable; urgency=medium + + * version set 6.0.6 + + -- Victor Seva Thu, 05 Mar 2026 08:46:20 +0100 + kamailio (6.0.5) unstable; urgency=medium * version set 6.0.5 diff --git a/pkg/kamailio/obs/kamailio.spec b/pkg/kamailio/obs/kamailio.spec index fa5c1beb3..d9785d66d 100644 --- a/pkg/kamailio/obs/kamailio.spec +++ b/pkg/kamailio/obs/kamailio.spec @@ -1,5 +1,5 @@ %define name kamailio -%define ver 6.0.5 +%define ver 6.0.6 %define rel dev1.0%{dist} %if 0%{?fedora} diff --git a/src/Makefile.defs b/src/Makefile.defs index d7520fe05..594af778b 100644 --- a/src/Makefile.defs +++ b/src/Makefile.defs @@ -106,7 +106,7 @@ INSTALL_FLAVOUR=$(FLAVOUR) # version number VERSION = 6 PATCHLEVEL = 0 -SUBLEVEL = 5 +SUBLEVEL = 6 EXTRAVERSION = # memory manager switcher @@ -1883,7 +1883,9 @@ ifeq ($(OS), linux) # check for >= 2.5.70 ifeq ($(shell [ $(OSREL_N) -ge 2005070 ] && echo has_futex), has_futex) ifeq ($(use_futex), yes) - C_DEFS+=-DUSE_FUTEX + ifneq ($(ARCH), aarch64) + C_DEFS+=-DUSE_FUTEX + endif endif endif ifeq ($(NO_SELECT),) diff --git a/src/Makefile.groups b/src/Makefile.groups index b6fed63d2..181ca22fc 100644 --- a/src/Makefile.groups +++ b/src/Makefile.groups @@ -23,7 +23,8 @@ mod_list_extra=avp auth_diameter call_control call_obj dmq domainpolicy msrp \ carrierroute pdb qos sca seas sms sst timer tmrec uac_redirect \ xhttp xhttp_rpc xprint jsonrpcs nosip dmq_usrloc statsd rtjson \ log_custom keepalive ss7ops acc_diameter evrexec file_out \ - sipjson lrkproxy math posops xhttp_prom dlgs sworker influxdbc + sipjson lrkproxy math posops xhttp_prom dlgs sworker influxdbc \ + pvtpl siprepo # - common modules depending on database mod_list_db=acc alias_db auth_db avpops cfg_db db_text db_flatstore \ diff --git a/src/core/atomic_ops.h b/src/core/atomic_ops.h index 444f7c3dd..b8bfa9164 100644 --- a/src/core/atomic_ops.h +++ b/src/core/atomic_ops.h @@ -176,7 +176,9 @@ /*! \brief if no native operations, emulate them using locks */ #if !defined HAVE_ASM_INLINE_ATOMIC_OPS || !defined HAVE_ASM_INLINE_MEMBAR - +#ifndef __CPU_aarch64 +#warning "no native atomic ops, atomic_unknown.h will be used" +#endif #include "atomic/atomic_unknown.h" #endif /* if HAVE_ASM_INLINE_ATOMIC_OPS */ diff --git a/src/core/autover.h b/src/core/autover.h index c48653569..e9d8af122 100644 --- a/src/core/autover.h +++ b/src/core/autover.h @@ -2,6 +2,6 @@ * DO NOT EDIT IT */ -#define REPO_VER "900efe" -#define REPO_HASH "900efe" +#define REPO_VER "9b4746" +#define REPO_HASH "9b4746" #define REPO_STATE "" diff --git a/src/core/basex.c b/src/core/basex.c index 554600564..d30353f5e 100644 --- a/src/core/basex.c +++ b/src/core/basex.c @@ -497,27 +497,26 @@ int base64url_enc(char *in, int ilen, char *out, int osize) unsigned int block; int olen; - - /* Add input validation */ - if(!in || !out) { - LM_ERR("null pointer parameter\n"); + if(!out) { + LM_ERR("null output pointer parameter\n"); return -1; } - if(ilen < 0) { LM_ERR("invalid input length %d\n", ilen); return -1; } - if(osize < 1) { LM_ERR("invalid output size %d\n", osize); return -1; } - if(ilen == 0) { out[0] = '\0'; return 0; } + if(!in) { + LM_ERR("null input pointer parameter\n"); + return -1; + } /* Protect against integer overflow Max safe ilen: (INT_MAX >> 2) to avoid overflow @@ -563,12 +562,10 @@ int base64url_dec(char *in, int ilen, char *out, int osize) char c; int olen; - /* Early error and input validation */ - if(!in || !out) { - LM_ERR("invalid input parameters\n"); + if(!out) { + LM_ERR("null output pointer parameter\n"); return -1; } - if(ilen < 0) { LM_ERR("invalid input length %d\n", ilen); return -1; @@ -577,11 +574,14 @@ int base64url_dec(char *in, int ilen, char *out, int osize) LM_ERR("invalid output size %d\n", osize); return -1; } - if(ilen == 0) { out[0] = '\0'; return 0; } + if(!in) { + LM_ERR("null input pointer parameter\n"); + return -1; + } for(n = 0, i = ilen - 1; i >= 0 && in[i] == '='; i--) n++; diff --git a/src/core/cfg.y b/src/core/cfg.y index a5bb2004d..b90b8602d 100644 --- a/src/core/cfg.y +++ b/src/core/cfg.y @@ -249,7 +249,6 @@ extern char *default_routename; %token STRIP %token STRIP_TAIL %token SET_USERPHONE -%token APPEND_BRANCH %token REMOVE_BRANCH %token CLEAR_BRANCHES %token SET_USER diff --git a/src/core/futexlock.h b/src/core/futexlock.h index 63e633055..c595a99aa 100644 --- a/src/core/futexlock.h +++ b/src/core/futexlock.h @@ -149,6 +149,7 @@ static inline int futex_try(futex_lock_t *lock) #else /*HAVE_ASM_INLINE_ATOMIC_OPS*/ +#warning "futex locks not suppported. undefining USE_FUTEX" #undef USE_FUTEX #endif /*HAVE_ASM_INLINE_ATOMIC_OPS*/ diff --git a/src/core/lock_alloc.h b/src/core/lock_alloc.h index 9efe666a0..bf3574e5b 100644 --- a/src/core/lock_alloc.h +++ b/src/core/lock_alloc.h @@ -56,7 +56,8 @@ Implements: (see also locking.h) #include "mem/mem.h" #include "mem/shm_mem.h" -#if defined(FAST_LOCK) || defined(USE_PTHREAD_MUTEX) || defined(USE_POSIX_SEM) +#if defined(FAST_LOCK) || defined(USE_PTHREAD_MUTEX) || defined(USE_POSIX_SEM) \ + || defined(USE_FUTEX) /* simple locks*/ #define lock_alloc() shm_malloc(sizeof(gen_lock_t)) #define lock_dealloc(lock) shm_free((void *)lock) diff --git a/src/core/mem/q_malloc.c b/src/core/mem/q_malloc.c index 5850c07a0..fa5ef9fb2 100644 --- a/src/core/mem/q_malloc.c +++ b/src/core/mem/q_malloc.c @@ -693,10 +693,10 @@ void *qm_realloc(void *qmp, void *p, size_t size) #ifdef DBG_QM_MALLOC MDBG("shrinking from %lu to %lu\n", f->size, (unsigned long)size); if(split_frag(qm, f, size, file, "fragm. from qm_realloc", line, mname) - != 0) { + == 0) { MDBG("shrinked successful\n"); #else - if(split_frag(qm, f, size) != 0) { + if(split_frag(qm, f, size) == 0) { #endif /* update used sizes: freed the splited frag */ /* split frag already adds FRAG_OVERHEAD for the newly created diff --git a/src/core/parser/parse_addr_spec.c b/src/core/parser/parse_addr_spec.c index e9ed00a16..d57e0a21a 100644 --- a/src/core/parser/parse_addr_spec.c +++ b/src/core/parser/parse_addr_spec.c @@ -530,7 +530,7 @@ static char *parse_to_param(char *const buffer, const char *const end, goto error; } } /*switch*/ - } /*for*/ + } /*for*/ if(!(status == F_CR || status == F_LF || status == F_CRLF)) saved_status = status; @@ -724,21 +724,25 @@ char *parse_addr_spec(char *const buffer, const char *const end, switch(status) { case START_TO: to_b->body.s = tmp; + to_b->style |= TBS_URI_ENCLOSED; status = S_URI_ENCLOSED; break; case DISPLAY_QUOTED: break; case E_DISPLAY_QUOTED: + to_b->style |= TBS_URI_ENCLOSED; status = S_URI_ENCLOSED; break; case URI_OR_TOKEN: case DISPLAY_TOKEN: to_b->display.len = tmp - to_b->display.s; + to_b->style |= TBS_URI_ENCLOSED; status = S_URI_ENCLOSED; break; case DISPLAY_TOKEN_SP: case MAYBE_URI_END: to_b->display.len = foo - to_b->display.s; + to_b->style |= TBS_URI_ENCLOSED; status = S_URI_ENCLOSED; break; case F_CRLF: @@ -782,6 +786,7 @@ char *parse_addr_spec(char *const buffer, const char *const end, case START_TO: to_b->body.s = tmp; to_b->display.s = tmp; + to_b->style |= TBS_DISPLAY_QUOTED; status = DISPLAY_QUOTED; break; case DISPLAY_QUOTED: @@ -888,7 +893,7 @@ char *parse_addr_spec(char *const buffer, const char *const end, goto error; } } /*char switch*/ - } /*for*/ + } /*for*/ /* Reached end of buffer */ switch(status) { diff --git a/src/core/parser/parse_addr_spec.h b/src/core/parser/parse_addr_spec.h index ae1942907..5363c1ef0 100644 --- a/src/core/parser/parse_addr_spec.h +++ b/src/core/parser/parse_addr_spec.h @@ -47,13 +47,17 @@ typedef struct to_param } to_param_t; +#define TBS_URI_ENCLOSED 1 /*!< URI is enclodes in angle brackets */ +#define TBS_DISPLAY_QUOTED 2 /*!< Display name is quoted */ + typedef struct to_body { - int error; /*!< Error code */ - str body; /*!< The whole header field body */ - str uri; /*!< URI */ - str display; /*!< Display Name */ - str tag_value; /*!< Value of tag */ + int error; /*!< Error code */ + str body; /*!< The whole header field body */ + str uri; /*!< URI */ + str display; /*!< Display Name */ + str tag_value; /*!< Value of tag */ + unsigned int style; /*!< Styles for the fields */ struct sip_uri parsed_uri; struct to_param *param_lst; /*!< Linked list of parameters */ struct to_param *last_param; /*!< Last parameter in the list */ diff --git a/src/core/parser/parse_identityinfo.c b/src/core/parser/parse_identityinfo.c index c28d0e809..110c32fa7 100644 --- a/src/core/parser/parse_identityinfo.c +++ b/src/core/parser/parse_identityinfo.c @@ -299,7 +299,8 @@ void parse_identityinfo(char *buffer, char *end, struct identityinfo_body *ii_b) status = II_URI_IPV4; case II_URI_IPV4: case II_URI_IPV6: - if(isalnum(*p) || *p == '-' || *p == '.' || *p == ':') + if(isalnum((unsigned char)(*p)) || *p == '-' + || *p == '.' || *p == ':') break; case II_START: goto parseerror; diff --git a/src/core/parser/parse_uri.c b/src/core/parser/parse_uri.c index 718f67354..e9e167ad4 100644 --- a/src/core/parser/parse_uri.c +++ b/src/core/parser/parse_uri.c @@ -632,7 +632,7 @@ int parse_uri(char *buf, int len, struct sip_uri *uri) if(*p == '[') { state = URI_HOST6_P; } else { - if(isalnum(*p)) { + if(isalnum((unsigned char)(*p))) { state = URI_HOST_P; } else { goto error_bad_host; @@ -643,8 +643,8 @@ int parse_uri(char *buf, int len, struct sip_uri *uri) switch(*p) { check_host_end; default: - if(!isalnum(*p) && (*p != '.') && (*p != '-') - && !uri_host_char_allowed(*p)) { + if(!isalnum((unsigned char)(*p)) && (*p != '.') + && (*p != '-') && !uri_host_char_allowed(*p)) { goto error_bad_host; } } diff --git a/src/core/strutils.c b/src/core/strutils.c index 50b7b0730..e6d60f74b 100644 --- a/src/core/strutils.c +++ b/src/core/strutils.c @@ -846,7 +846,9 @@ int reg_replace(char *pattern, char *replacement, char *string, str *result) /* Converts a hex character to its integer value */ char hex_to_char(char hex_code) { - return isdigit(hex_code) ? hex_code - '0' : tolower(hex_code) - 'a' + 10; + return isdigit((unsigned char)hex_code) + ? hex_code - '0' + : tolower((unsigned char)hex_code) - 'a' + 10; } /* Converts an integer value to its hex character */ @@ -871,7 +873,8 @@ int urlencode(str *sin, str *sout) p = sin->s; while(p < sin->s + sin->len) { - if(isalnum(*p) || *p == '-' || *p == '_' || *p == '.' || *p == '~') + if(isalnum((unsigned char)(*p)) || *p == '-' || *p == '_' || *p == '.' + || *p == '~') *at++ = *p; else *at++ = '%', *at++ = char_to_hex((unsigned char)(*p) >> 4), diff --git a/src/core/tcp_read.c b/src/core/tcp_read.c index 2cf24246b..c6ce4c735 100644 --- a/src/core/tcp_read.c +++ b/src/core/tcp_read.c @@ -859,7 +859,16 @@ int tcp_read_headers(struct tcp_connection *c, rd_conn_flags_t *read_flags) case '7': case '8': case '9': - r->content_len = r->content_len * 10 + (*p - '0'); + if(r->content_len >= INT_MAX / 10) { + LM_ERR("large Content-Length header value %d in" + " state %d\n", + r->content_len, r->state); + r->content_len = 0; + r->error = TCP_REQ_BAD_LEN; + r->state = H_SKIP; /* skip now */ + } else { + r->content_len = r->content_len * 10 + (*p - '0'); + } break; case '\r': case ' ': @@ -1042,11 +1051,31 @@ int tcp_read_headers(struct tcp_connection *c, rd_conn_flags_t *read_flags) /* locate transaction id in first line * -- first line exists, that's why we are here */ mfline = q_memchr(r->start, '\n', r->pos - r->start); - mtransid.s = q_memchr( - r->start + 5 /* 'MSRP ' */, ' ', mfline - r->start); + if(mfline == NULL || mfline - r->start < 8) { + r->error = TCP_READ_ERROR; + r->state = H_SKIP; /* skip now */ + goto skip; + } + mtransid.s = q_memchr(r->start + 5 /* 'MSRP ' */, ' ', + mfline - r->start - 5); + if(mtransid.s == NULL) { + r->error = TCP_READ_ERROR; + r->state = H_SKIP; /* skip now */ + goto skip; + } mtransid.len = mtransid.s - r->start - 5; + if(mtransid.len <= 0) { + r->error = TCP_READ_ERROR; + r->state = H_SKIP; /* skip now */ + goto skip; + } mtransid.s = r->start + 5; trim(&mtransid); + if(mtransid.len <= 0) { + r->error = TCP_READ_ERROR; + r->state = H_SKIP; /* skip now */ + goto skip; + } if(memcmp(mtransid.s, p - 1 /*\r*/ - 1 /* '+'|'#'|'$' */ - mtransid.len, diff --git a/src/core/ut.h b/src/core/ut.h index 87b15e828..50c20bdd0 100644 --- a/src/core/ut.h +++ b/src/core/ut.h @@ -1006,6 +1006,11 @@ static inline int pkg_str_dup(str *dst, const str *src) return -1; } + if(dst->len == 0) { + dst->s[0] = 0; + return 0; + } + /* avoid memcpy from NULL source - undefined behaviour */ if(src->s == NULL) { LM_WARN("pkg_str_dup fallback; skip memcpy for src->s == NULL\n"); diff --git a/src/modules/app_ruby/CMakeLists.txt b/src/modules/app_ruby/CMakeLists.txt index 9c8de9639..8651e1bb2 100644 --- a/src/modules/app_ruby/CMakeLists.txt +++ b/src/modules/app_ruby/CMakeLists.txt @@ -1,3 +1,9 @@ file(GLOB MODULE_SOURCES "*.c") add_library(${module_name} SHARED ${MODULE_SOURCES}) + +find_package(Ruby REQUIRED) +find_package(Threads REQUIRED) + +target_include_directories(${module_name} PRIVATE ${RUBY_INCLUDE_DIRS}) +target_link_libraries(${module_name} PRIVATE ${RUBY_LIBRARY} Threads::Threads ${CMAKE_DL_LIBS}) diff --git a/src/modules/app_ruby_proc/CMakeLists.txt b/src/modules/app_ruby_proc/CMakeLists.txt index af56b01cf..f8a70a0ad 100644 --- a/src/modules/app_ruby_proc/CMakeLists.txt +++ b/src/modules/app_ruby_proc/CMakeLists.txt @@ -4,6 +4,7 @@ add_library(${module_name} SHARED ${MODULE_SOURCES}) # ruby-dev package find_package(Ruby REQUIRED) +find_package(Threads REQUIRED) -target_include_directories(${module_name} PRIVATE ${Ruby_INCLUDE_DIRS}) -target_link_libraries(${module_name} PRIVATE ${Ruby_LIBRARIES}) +target_include_directories(${module_name} PRIVATE ${RUBY_INCLUDE_DIRS}) +target_link_libraries(${module_name} PRIVATE ${RUBY_LIBRARY} Threads::Threads ${CMAKE_DL_LIBS}) diff --git a/src/modules/async/README b/src/modules/async/README index 7e55054fd..20f62f8e9 100644 --- a/src/modules/async/README +++ b/src/modules/async/README @@ -428,7 +428,7 @@ async_workers_group="name=abc;workers=4;nonblock=0;usleep=0" ... request_route { ... - async_task_data("RESUME", "abc", "caller: $fU - callee: $tU"); + async_task_group_data("RESUME", "abc", "caller: $fU - callee: $tU"); ... } route[RESUME] { diff --git a/src/modules/async/async_mod.c b/src/modules/async/async_mod.c index 722eb0cdb..1f0241907 100644 --- a/src/modules/async/async_mod.c +++ b/src/modules/async/async_mod.c @@ -557,7 +557,7 @@ static int fixup_async_task_route(void **param, int param_no) return -1; } - if(param_no == 1 || param_no == 2 || param_no == 2) { + if(param_no == 1 || param_no == 2 || param_no == 3) { if(fixup_spve_null(param, 1) < 0) return -1; return 0; diff --git a/src/modules/async/doc/async_admin.xml b/src/modules/async/doc/async_admin.xml index 4bfa5da48..87382145c 100644 --- a/src/modules/async/doc/async_admin.xml +++ b/src/modules/async/doc/async_admin.xml @@ -476,7 +476,7 @@ async_workers_group="name=abc;workers=4;nonblock=0;usleep=0" ... request_route { ... - async_task_data("RESUME", "abc", "caller: $fU - callee: $tU"); + async_task_group_data("RESUME", "abc", "caller: $fU - callee: $tU"); ... } route[RESUME] { diff --git a/src/modules/auth_ephemeral/CMakeLists.txt b/src/modules/auth_ephemeral/CMakeLists.txt index 9c8de9639..e584457c6 100644 --- a/src/modules/auth_ephemeral/CMakeLists.txt +++ b/src/modules/auth_ephemeral/CMakeLists.txt @@ -1,3 +1,7 @@ file(GLOB MODULE_SOURCES "*.c") add_library(${module_name} SHARED ${MODULE_SOURCES}) + +find_package(OpenSSL REQUIRED) + +target_link_libraries(${module_name} PRIVATE OpenSSL::SSL OpenSSL::Crypto) \ No newline at end of file diff --git a/src/modules/cdp/CMakeLists.txt b/src/modules/cdp/CMakeLists.txt index 7d48b3af4..e8297a8df 100644 --- a/src/modules/cdp/CMakeLists.txt +++ b/src/modules/cdp/CMakeLists.txt @@ -4,5 +4,11 @@ add_library(${module_name} SHARED ${MODULE_SOURCES}) find_package(LibXml2 REQUIRED) find_package(OpenSSL REQUIRED) +find_package(Threads REQUIRED) -target_link_libraries(${module_name} PRIVATE LibXml2::LibXml2 OpenSSL::SSL) +find_library(LIBRT rt) +if(LIBRT) + target_link_libraries(${module_name} PRIVATE ${LIBRT}) +endif() + +target_link_libraries(${module_name} PRIVATE LibXml2::LibXml2 OpenSSL::SSL Threads::Threads) diff --git a/src/modules/corex/corex_mod.c b/src/modules/corex/corex_mod.c index 9f22b445e..36fd13d5e 100644 --- a/src/modules/corex/corex_mod.c +++ b/src/modules/corex/corex_mod.c @@ -644,7 +644,7 @@ error: typedef struct _msg_iflag_name { str name; - int value; + msg_flags_t value; } msg_iflag_name_t; /* clang-format off */ @@ -660,7 +660,7 @@ static msg_iflag_name_t _msg_iflag_list[] = { /** * */ -static unsigned long long msg_lookup_flag(str *fname) +static msg_flags_t msg_lookup_flag(str *fname) { int i; @@ -694,7 +694,7 @@ static unsigned long long msg_lookup_flag(str *fname) */ static int w_msg_iflag_set(sip_msg_t *msg, char *pflag, char *p2) { - unsigned long long fv; + msg_flags_t fv; str fname; if(fixup_get_svalue(msg, (gparam_t *)pflag, &fname)) { LM_ERR("cannot get the msg flag name parameter\n"); @@ -714,7 +714,7 @@ static int w_msg_iflag_set(sip_msg_t *msg, char *pflag, char *p2) */ static int w_msg_iflag_reset(sip_msg_t *msg, char *pflag, char *p2) { - unsigned long long fv; + msg_flags_t fv; str fname; if(fixup_get_svalue(msg, (gparam_t *)pflag, &fname)) { LM_ERR("cannot get the msg flag name parameter\n"); @@ -734,7 +734,7 @@ static int w_msg_iflag_reset(sip_msg_t *msg, char *pflag, char *p2) */ static int w_msg_iflag_is_set(sip_msg_t *msg, char *pflag, char *p2) { - unsigned long long fv; + msg_flags_t fv; str fname; if(fixup_get_svalue(msg, (gparam_t *)pflag, &fname)) { LM_ERR("cannot get the msg flag name parameter\n"); diff --git a/src/modules/db2_ldap/CMakeLists.txt b/src/modules/db2_ldap/CMakeLists.txt index f948c5bc1..96af6452a 100644 --- a/src/modules/db2_ldap/CMakeLists.txt +++ b/src/modules/db2_ldap/CMakeLists.txt @@ -11,6 +11,6 @@ add_library(libsasl2::libsasl2 ALIAS PkgConfig::libsasl2) find_package(Ldap REQUIRED) # LDAP_DEPRECATED is required for LDAP support else it will throw compile error -target_compile_definitions(${module_name} PRIVATE LDAP_DEPRECATED) +target_compile_definitions(${module_name} PRIVATE OPENLDAP23 LDAP_DEPRECATED) target_include_directories(${module_name} PRIVATE ${Ldap_INCLUDE_DIRS}) -target_link_libraries(${module_name} PRIVATE ${LDAP_LIBRARIES} libsasl2::libsasl2) +target_link_libraries(${module_name} PRIVATE Ldap::Ldap libsasl2::libsasl2) diff --git a/src/modules/db_text/dbt_lib.h b/src/modules/db_text/dbt_lib.h index be1e7027b..46f6b2d55 100644 --- a/src/modules/db_text/dbt_lib.h +++ b/src/modules/db_text/dbt_lib.h @@ -49,7 +49,7 @@ /* * * Module parameters variables * */ -extern int db_mode; /* Database usage mode: 0 = no cache, 1 = cache */ +extern int db_mode; /* Database usage mode: 0 = cache, 1 = no cache */ extern int empty_string; /* If TRUE, an empty string is an empty string, otherwise NULL */ extern int diff --git a/src/modules/dialog/dlg_profile.c b/src/modules/dialog/dlg_profile.c index 9fc1a9795..80fac2d59 100644 --- a/src/modules/dialog/dlg_profile.c +++ b/src/modules/dialog/dlg_profile.c @@ -518,15 +518,16 @@ static void link_dlg_profile( linker->next = dlg->profile_links; dlg->profile_links = linker; linker->hash_linker.dlg = dlg; + link_profile(linker, &dlg->callid); dlg_unlock(d_table, d_entry); } else { linker->next = dlg->profile_links; dlg->profile_links = linker; linker->hash_linker.dlg = dlg; + link_profile(linker, &dlg->callid); } atomic_or_int((volatile int *)&dlg->dflags, DLG_FLAG_CHANGED_PROF); - link_profile(linker, &dlg->callid); } diff --git a/src/modules/erlang/CMakeLists.txt b/src/modules/erlang/CMakeLists.txt index db92655b4..86cb1593d 100644 --- a/src/modules/erlang/CMakeLists.txt +++ b/src/modules/erlang/CMakeLists.txt @@ -4,7 +4,8 @@ add_library(${module_name} SHARED ${MODULE_SOURCES}) # erlang-dev find_package(Erlang REQUIRED) +find_package(Threads REQUIRED) -target_link_libraries(${module_name} PRIVATE Erlang::Erlang) +target_link_libraries(${module_name} PRIVATE Erlang::Erlang Erlang::EI Threads::Threads) target_include_directories(${module_name} PRIVATE ${Erlang_INCLUDE_DIRS}) target_compile_definitions(${module_name} PRIVATE _REENTRANT) diff --git a/src/modules/geoip2/CMakeLists.txt b/src/modules/geoip2/CMakeLists.txt index ba4d03c2c..64ec4a9ad 100644 --- a/src/modules/geoip2/CMakeLists.txt +++ b/src/modules/geoip2/CMakeLists.txt @@ -6,4 +6,4 @@ find_package(PkgConfig REQUIRED) pkg_check_modules(geoip2 REQUIRED IMPORTED_TARGET libmaxminddb) target_include_directories(${module_name} PRIVATE ${geoip2_INCLUDE_DIRS}) -target_link_libraries(${module_name} PRIVATE ${geip2_LIBRARIES}) +target_link_libraries(${module_name} PRIVATE ${geoip2_LIBRARIES}) diff --git a/src/modules/ims_diameter_server/CMakeLists.txt b/src/modules/ims_diameter_server/CMakeLists.txt index 9c8de9639..a9da9cb7e 100644 --- a/src/modules/ims_diameter_server/CMakeLists.txt +++ b/src/modules/ims_diameter_server/CMakeLists.txt @@ -1,3 +1,11 @@ file(GLOB MODULE_SOURCES "*.c") add_library(${module_name} SHARED ${MODULE_SOURCES}) + +find_package(Threads REQUIRED) +target_link_libraries(${module_name} PRIVATE Threads::Threads) + +find_library(LIBRT rt) +if(LIBRT) + target_link_libraries(${module_name} PRIVATE ${LIBRT}) +endif() diff --git a/src/modules/ims_ipsec_pcscf/CMakeLists.txt b/src/modules/ims_ipsec_pcscf/CMakeLists.txt index d7df85ac7..e93f160ae 100644 --- a/src/modules/ims_ipsec_pcscf/CMakeLists.txt +++ b/src/modules/ims_ipsec_pcscf/CMakeLists.txt @@ -6,4 +6,6 @@ find_package(PkgConfig REQUIRED) pkg_check_modules(libmnl REQUIRED IMPORTED_TARGET libmnl) add_library(libmnl::libmnl ALIAS PkgConfig::libmnl) -target_link_libraries(${module_name} PRIVATE libmnl::libmnl) +find_package(Threads REQUIRED) + +target_link_libraries(${module_name} PRIVATE libmnl::libmnl Threads::Threads) diff --git a/src/modules/ims_ipsec_pcscf/cmd.c b/src/modules/ims_ipsec_pcscf/cmd.c index 8871a76c6..ccd5a7f1d 100644 --- a/src/modules/ims_ipsec_pcscf/cmd.c +++ b/src/modules/ims_ipsec_pcscf/cmd.c @@ -461,8 +461,10 @@ static int update_contact_ipsec_params( memcpy(s->ik.s, ik.s, ik.len); s->ik.len = ik.len; - // Generate SPI - if(s_old) { + // Reuse only if both CK and IK match. + if(s_old && s_old->ck.s != NULL && s_old->ik.s != NULL + && strcmp(s_old->ck.s, s->ck.s) == 0 + && strcmp(s_old->ik.s, s->ik.s) == 0) { if(s_old->spi_pc && s_old->spi_ps && s_old->port_pc && s_old->port_ps) { LM_INFO("Reusing IPSEC tunnel\n"); s->spi_pc = s_old->spi_pc; diff --git a/src/modules/ims_ocs/CMakeLists.txt b/src/modules/ims_ocs/CMakeLists.txt index 9c8de9639..a9da9cb7e 100644 --- a/src/modules/ims_ocs/CMakeLists.txt +++ b/src/modules/ims_ocs/CMakeLists.txt @@ -1,3 +1,11 @@ file(GLOB MODULE_SOURCES "*.c") add_library(${module_name} SHARED ${MODULE_SOURCES}) + +find_package(Threads REQUIRED) +target_link_libraries(${module_name} PRIVATE Threads::Threads) + +find_library(LIBRT rt) +if(LIBRT) + target_link_libraries(${module_name} PRIVATE ${LIBRT}) +endif() diff --git a/src/modules/ims_qos/CMakeLists.txt b/src/modules/ims_qos/CMakeLists.txt index 9c8de9639..a9da9cb7e 100644 --- a/src/modules/ims_qos/CMakeLists.txt +++ b/src/modules/ims_qos/CMakeLists.txt @@ -1,3 +1,11 @@ file(GLOB MODULE_SOURCES "*.c") add_library(${module_name} SHARED ${MODULE_SOURCES}) + +find_package(Threads REQUIRED) +target_link_libraries(${module_name} PRIVATE Threads::Threads) + +find_library(LIBRT rt) +if(LIBRT) + target_link_libraries(${module_name} PRIVATE ${LIBRT}) +endif() diff --git a/src/modules/ims_qos_npn/CMakeLists.txt b/src/modules/ims_qos_npn/CMakeLists.txt index 9c8de9639..a9da9cb7e 100644 --- a/src/modules/ims_qos_npn/CMakeLists.txt +++ b/src/modules/ims_qos_npn/CMakeLists.txt @@ -1,3 +1,11 @@ file(GLOB MODULE_SOURCES "*.c") add_library(${module_name} SHARED ${MODULE_SOURCES}) + +find_package(Threads REQUIRED) +target_link_libraries(${module_name} PRIVATE Threads::Threads) + +find_library(LIBRT rt) +if(LIBRT) + target_link_libraries(${module_name} PRIVATE ${LIBRT}) +endif() diff --git a/src/modules/ims_registrar_pcscf/CMakeLists.txt b/src/modules/ims_registrar_pcscf/CMakeLists.txt index 41758eb30..193b74765 100644 --- a/src/modules/ims_registrar_pcscf/CMakeLists.txt +++ b/src/modules/ims_registrar_pcscf/CMakeLists.txt @@ -3,5 +3,11 @@ file(GLOB MODULE_SOURCES "*.c") add_library(${module_name} SHARED ${MODULE_SOURCES}) find_package(LibXml2 REQUIRED) +find_package(Threads REQUIRED) -target_link_libraries(${module_name} PRIVATE LibXml2::LibXml2) +find_library(LIBRT rt) +if(LIBRT) + target_link_libraries(${module_name} PRIVATE ${LIBRT}) +endif() + +target_link_libraries(${module_name} PRIVATE LibXml2::LibXml2 Threads::Threads) diff --git a/src/modules/ims_registrar_scscf/CMakeLists.txt b/src/modules/ims_registrar_scscf/CMakeLists.txt index 41758eb30..193b74765 100644 --- a/src/modules/ims_registrar_scscf/CMakeLists.txt +++ b/src/modules/ims_registrar_scscf/CMakeLists.txt @@ -3,5 +3,11 @@ file(GLOB MODULE_SOURCES "*.c") add_library(${module_name} SHARED ${MODULE_SOURCES}) find_package(LibXml2 REQUIRED) +find_package(Threads REQUIRED) -target_link_libraries(${module_name} PRIVATE LibXml2::LibXml2) +find_library(LIBRT rt) +if(LIBRT) + target_link_libraries(${module_name} PRIVATE ${LIBRT}) +endif() + +target_link_libraries(${module_name} PRIVATE LibXml2::LibXml2 Threads::Threads) diff --git a/src/modules/ims_registrar_scscf/registrar_notify.c b/src/modules/ims_registrar_scscf/registrar_notify.c index 63bd3ea59..bcb9c72d7 100644 --- a/src/modules/ims_registrar_scscf/registrar_notify.c +++ b/src/modules/ims_registrar_scscf/registrar_notify.c @@ -1709,7 +1709,9 @@ void create_notifications(udomain_t *_t, impurecord_t *r_passed, create_notification = 0; - if(s->expires > act_time) { + if((event_type != IMS_REGISTRAR_CONTACT_EXPIRED + && event_type != IMS_REGISTRAR_CONTACT_UNREGISTERED) + && s->expires > act_time) { subscription_state.s = (char *)pkg_malloc(32 * sizeof(char *)); subscription_state.len = 0; if(subscription_state.s) { @@ -1726,8 +1728,8 @@ void create_notifications(udomain_t *_t, impurecord_t *r_passed, } else { STR_PKG_DUP(subscription_state, subs_terminated, "pkg subs state"); - LM_DBG("Expires is past than current time! Subscription state: " - "[%.*s]\n", + LM_DBG("Expires is past than current time or UE deregistered! " + "Subscription state: [%.*s]\n", subscription_state.len, subscription_state.s); } diff --git a/src/modules/ims_registrar_scscf/save.c b/src/modules/ims_registrar_scscf/save.c index 0836740ce..1656a88ec 100644 --- a/src/modules/ims_registrar_scscf/save.c +++ b/src/modules/ims_registrar_scscf/save.c @@ -954,6 +954,7 @@ int update_contacts(struct sip_msg *msg, udomain_t *_d, str *public_identity, != 0) { LM_DBG("Contact does not exist <%.*s>\n", chi->uri.len, chi->uri.s); + ul.unlock_udomain(_d, public_identity); goto error; } event_reg(0, impu_rec, ucontact, @@ -1091,6 +1092,7 @@ int update_contacts(struct sip_msg *msg, udomain_t *_d, str *public_identity, != 0) { LM_DBG("Contact does not exist <%.*s>\n", chi->uri.len, chi->uri.s); + ul.unlock_udomain(_d, public_identity); goto error; } event_reg(0, impu_rec, ucontact, @@ -1229,6 +1231,8 @@ int update_contacts(struct sip_msg *msg, udomain_t *_d, str *public_identity, LM_DBG("Contact does not exist " "<%.*s>\n", chi->uri.len, chi->uri.s); + ul.unlock_udomain( + _d, &pi->public_identity); goto error; } notify_subscribers(tmp_impu_rec, ucontact, @@ -1251,7 +1255,8 @@ int update_contacts(struct sip_msg *msg, udomain_t *_d, str *public_identity, LM_ERR("Error trying to determine if " "this is a sos contact <%.*s>\n", chi->uri.len, chi->uri.s); - ul.unlock_udomain(_d, public_identity); + ul.unlock_udomain( + _d, &pi->public_identity); goto error; } calc_contact_expires(chi, expires_hdr, sos); diff --git a/src/modules/jsonrpcc/CMakeLists.txt b/src/modules/jsonrpcc/CMakeLists.txt index 314f48a5c..15331a22d 100644 --- a/src/modules/jsonrpcc/CMakeLists.txt +++ b/src/modules/jsonrpcc/CMakeLists.txt @@ -16,4 +16,7 @@ pkg_check_modules(json-c REQUIRED IMPORTED_TARGET json-c) add_library(json-c::json-c ALIAS PkgConfig::json-c) # endif() -target_link_libraries(${module_name} PRIVATE json-c::json-c) +pkg_check_modules(EVENT REQUIRED IMPORTED_TARGET libevent) +add_library(event::event ALIAS PkgConfig::EVENT) + +target_link_libraries(${module_name} PRIVATE json-c::json-c event::event) diff --git a/src/modules/kazoo/CMakeLists.txt b/src/modules/kazoo/CMakeLists.txt index d05ff7546..53d4d6d70 100644 --- a/src/modules/kazoo/CMakeLists.txt +++ b/src/modules/kazoo/CMakeLists.txt @@ -30,4 +30,9 @@ endif() pkg_check_modules(UUID REQUIRED IMPORTED_TARGET uuid) add_library(uuid::uuid ALIAS PkgConfig::UUID) -target_link_libraries(${module_name} PRIVATE json-c::json-c rabbitmq::rabbitmq uuid::uuid) +pkg_check_modules(EVENT REQUIRED IMPORTED_TARGET libevent) +add_library(event::event ALIAS PkgConfig::EVENT) + +target_link_libraries( + ${module_name} PRIVATE json-c::json-c rabbitmq::rabbitmq event::event uuid::uuid +) diff --git a/src/modules/microhttpd/CMakeLists.txt b/src/modules/microhttpd/CMakeLists.txt index 337b095f0..025db053e 100644 --- a/src/modules/microhttpd/CMakeLists.txt +++ b/src/modules/microhttpd/CMakeLists.txt @@ -4,7 +4,7 @@ add_library(${module_name} SHARED ${MODULE_SOURCES}) find_package(PkgConfig REQUIRED) # TODO: https://github.com/kamailio/kamailio/issues/3618 -pkg_check_modules(libmicrohttpd REQUIRED IMPORTED_TARGET libmicrohttpd>=0.9.75) +pkg_check_modules(libmicrohttpd REQUIRED IMPORTED_TARGET libmicrohttpd>=0.9.72) add_library(microhttpd::microhttpd ALIAS PkgConfig::libmicrohttpd) target_link_libraries(${module_name} PRIVATE microhttpd::microhttpd) diff --git a/src/modules/misctest/CMakeLists.txt b/src/modules/misctest/CMakeLists.txt index 9c8de9639..3fae3f5ea 100644 --- a/src/modules/misctest/CMakeLists.txt +++ b/src/modules/misctest/CMakeLists.txt @@ -1,3 +1,6 @@ file(GLOB MODULE_SOURCES "*.c") add_library(${module_name} SHARED ${MODULE_SOURCES}) + +find_package(Threads REQUIRED) +target_link_libraries(${module_name} PRIVATE Threads::Threads) diff --git a/src/modules/nats/README b/src/modules/nats/README index 5da04ae8e..55da4014b 100644 --- a/src/modules/nats/README +++ b/src/modules/nats/README @@ -131,7 +131,7 @@ Chapter 1. Admin Guide Example 1.1. Set nats_url parameter ... modparam("nats", "nats_url", "nats://127.0.0.1:4222") -modparam("nats", "nats_url", "nats://user1:pass1127.0.1.2:4222") // with auth +modparam("nats", "nats_url", "nats://user1:pass1@127.0.1.2:4222") // with auth modparam("nats", "nats_url", "nats://127.1.2.3:4222") ... diff --git a/src/modules/nats/doc/nats_admin.xml b/src/modules/nats/doc/nats_admin.xml index d03efa7e2..d8c2da1ce 100644 --- a/src/modules/nats/doc/nats_admin.xml +++ b/src/modules/nats/doc/nats_admin.xml @@ -114,7 +114,7 @@ ... modparam("nats", "nats_url", "nats://127.0.0.1:4222") -modparam("nats", "nats_url", "nats://user1:pass1127.0.1.2:4222") // with auth +modparam("nats", "nats_url", "nats://user1:pass1@127.0.1.2:4222") // with auth modparam("nats", "nats_url", "nats://127.1.2.3:4222") ... diff --git a/src/modules/phonenum/CMakeLists.txt b/src/modules/phonenum/CMakeLists.txt index ef82b9dfe..ed26b71d9 100644 --- a/src/modules/phonenum/CMakeLists.txt +++ b/src/modules/phonenum/CMakeLists.txt @@ -1,4 +1,7 @@ file(GLOB MODULE_SOURCES "*.c") +file(GLOB MODULE_CPP_SOURCES "*.cpp") + +list(APPEND MODULE_SOURCES ${MODULE_CPP_SOURCES}) add_library(${module_name} SHARED ${MODULE_SOURCES}) diff --git a/src/modules/pv/pv_core.c b/src/modules/pv/pv_core.c index 56d96b20d..f32257ae2 100644 --- a/src/modules/pv/pv_core.c +++ b/src/modules/pv/pv_core.c @@ -3636,6 +3636,7 @@ int pv_set_xto_attr(struct sip_msg *msg, pv_param_t *param, int op, int llen = 0; int llen_uri = 0; int is_enclosed = 0; + char *p; if(msg == NULL || param == NULL) { LM_ERR("bad parameters\n"); @@ -3653,13 +3654,28 @@ int pv_set_xto_attr(struct sip_msg *msg, pv_param_t *param, int op, return -1; } - buf.s = pkg_malloc(val->rs.len); + buf.len = val->rs.len; + if(!(tb->style & TBS_URI_ENCLOSED)) { + /* existing uri not enclosed - check if new one has parameters */ + for(p = val->rs.s + val->rs.len - 1; p > val->rs.s; p--) { + if(*p == ';') { + buf.len += 2; + break; + } + } + } + buf.s = pkg_malloc(buf.len); if(buf.s == NULL) { LM_ERR("no more pkg mem\n"); goto error; } - buf.len = val->rs.len; - memcpy(buf.s, val->rs.s, val->rs.len); + if(buf.len == val->rs.len + 2) { + buf.s[0] = '<'; + memcpy(buf.s + 1, val->rs.s, val->rs.len); + buf.s[buf.len - 1] = '>'; + } else { + memcpy(buf.s, val->rs.s, val->rs.len); + } loffset = tb->uri.s - msg->buf; llen = tb->uri.len; break; diff --git a/src/modules/rabbitmq/CMakeLists.txt b/src/modules/rabbitmq/CMakeLists.txt index e9bcef86b..4c023f1a7 100644 --- a/src/modules/rabbitmq/CMakeLists.txt +++ b/src/modules/rabbitmq/CMakeLists.txt @@ -3,15 +3,15 @@ file(GLOB MODULE_SOURCES "*.c") add_library(${module_name} SHARED ${MODULE_SOURCES}) # rabbitmq provides cmake support for versions 0.13 and above. -find_package(rabbitmq-c QUIET) -if(NOT rabbitmq-c_FOUND) - message(STATUS "rabbitmq-c not found. looking with pkg-config") - find_package(PkgConfig REQUIRED) - pkg_check_modules(rabbitmq-c REQUIRED IMPORTED_TARGET librabbitmq) - add_library(rabbitmq::rabbitmq ALIAS PkgConfig::rabbitmq-c) -endif() - +# 0.11 provides cmake files but they are broken (report wrong version). +# https://github.com/alanxz/rabbitmq-c/commit/20bebf423bd3686fe73634ae239d09e5d21abde4 +# Use pkg-config for all versions +# TODO: When we have a proper cmake config file for rabbitmq-c for most OS, we can +# use that instead of pkg-config. find_package(PkgConfig REQUIRED) +pkg_check_modules(rabbitmq-c REQUIRED IMPORTED_TARGET librabbitmq) +add_library(rabbitmq::rabbitmq ALIAS PkgConfig::rabbitmq-c) + pkg_check_modules(UUID REQUIRED IMPORTED_TARGET uuid) add_library(uuid::uuid ALIAS PkgConfig::UUID) diff --git a/src/modules/rtpengine/README b/src/modules/rtpengine/README index 99c613cd7..25f18f2f4 100644 --- a/src/modules/rtpengine/README +++ b/src/modules/rtpengine/README @@ -891,9 +891,9 @@ route { 5.14. rtp_inst_pvar (string) - A pseudo variable to store the chosen RTP Engine IP address. If this - parameter is set, the IP address and port of the instance chosen will - be stored in the given variable. + A pseudo variable to store the chosen RTP Engine URI. If this parameter + is set, the URI of the instance chosen will be stored in the given + variable. By default, this parameter is not set. diff --git a/src/modules/rtpengine/doc/rtpengine_admin.xml b/src/modules/rtpengine/doc/rtpengine_admin.xml index 9df4f20c0..44b7ec7de 100644 --- a/src/modules/rtpengine/doc/rtpengine_admin.xml +++ b/src/modules/rtpengine/doc/rtpengine_admin.xml @@ -528,8 +528,8 @@ route {
<varname>rtp_inst_pvar</varname> (string) - A pseudo variable to store the chosen RTP Engine IP address. - If this parameter is set, the IP address and port of the instance chosen will be stored in the given variable. + A pseudo variable to store the chosen RTP Engine URI. + If this parameter is set, the URI of the instance chosen will be stored in the given variable. By default, this parameter is not set. diff --git a/src/modules/rtpengine/rtpengine.c b/src/modules/rtpengine/rtpengine.c index 3d6fa1aee..101669d0f 100644 --- a/src/modules/rtpengine/rtpengine.c +++ b/src/modules/rtpengine/rtpengine.c @@ -2992,6 +2992,8 @@ static int parse_from_to_tags(struct ng_flags_parse *ng_flags, if(ng_flags->to && ng_flags->to_tag.s && ng_flags->to_tag.len) bencode_dictionary_add_str( ng_flags->dict, "to-tag", &ng_flags->to_tag); + if(ng_flags->flags) + bencode_list_add_string(ng_flags->flags, "directional"); } } else if(op == OP_SUBSCRIBE_REQUEST || op == OP_UNSUBSCRIBE) { bencode_dictionary_add_str( diff --git a/src/modules/rtpengine/rtpengine_hash.c b/src/modules/rtpengine/rtpengine_hash.c index 2c7f8f2f0..5e5970d9a 100644 --- a/src/modules/rtpengine/rtpengine_hash.c +++ b/src/modules/rtpengine/rtpengine_hash.c @@ -240,10 +240,12 @@ int rtpengine_hash_table_insert( && STR_EQ(entry->viabranch, new_entry->viabranch)) { // unlock lock_release(rtpengine_hash_table->row_locks[hash_index]); + + // entry may have been freed by a concurrent DELETE operation; + // use function parameters which are guaranteed to be valid LM_NOTICE("callid=%.*s, viabranch=%.*s already in hashtable, " "ignore new value\n", - entry->callid.len, entry->callid.s, entry->viabranch.len, - entry->viabranch.s); + callid.len, callid.s, viabranch.len, viabranch.s); return 0; } diff --git a/src/modules/sipdump/CMakeLists.txt b/src/modules/sipdump/CMakeLists.txt index 9c8de9639..0b1d4e114 100644 --- a/src/modules/sipdump/CMakeLists.txt +++ b/src/modules/sipdump/CMakeLists.txt @@ -1,3 +1,7 @@ file(GLOB MODULE_SOURCES "*.c") add_library(${module_name} SHARED ${MODULE_SOURCES}) + +find_package(Threads REQUIRED) + +target_link_libraries(${module_name} PRIVATE Threads::Threads) diff --git a/src/modules/tls/CMakeLists.txt b/src/modules/tls/CMakeLists.txt index bf59de34f..7d758e53b 100644 --- a/src/modules/tls/CMakeLists.txt +++ b/src/modules/tls/CMakeLists.txt @@ -18,7 +18,7 @@ find_package(Threads REQUIRED) # will fail and ask to set variables like OPENSSL_ROOT_DIR, OPENSSL_INCLUDE_DIR # and LIBRARIES if(LIBSSL_STATIC) - target_compile_definitions(${module_name} KSR_LIBSSL_STATIC) + target_compile_definitions(${module_name} PRIVATE KSR_LIBSSL_STATIC) if(LIBSSL_STATIC_SRCLIB) target_include_directories(${module_name} PRIVATE ${LIBSSL_STATIC_SRCPATH}/include) target_link_directories(${module_name} PRIVATE ${LIBSSL_STATIC_SRCPATH}) diff --git a/src/modules/tls_wolfssl/tls_server.c b/src/modules/tls_wolfssl/tls_server.c index f3c69839e..50a2c59e3 100644 --- a/src/modules/tls_wolfssl/tls_server.c +++ b/src/modules/tls_wolfssl/tls_server.c @@ -678,8 +678,12 @@ void tls_h_tcpconn_close_f(struct tcp_connection *c, int fd) break; nr += npos; } - assert(nr == wr_used); - _tcpconn_write_nb(fd, c, (char *)wr_buf, wr_used); + if(nr == wr_used) { + _tcpconn_write_nb(fd, c, (char *)wr_buf, wr_used); + } else { + LM_ERR("skip tcp con write - nr(%lu) != wr_used(%lu)\n", + (unsigned long)nr, (unsigned long)wr_used); + } } /* we don't bother reading anything (we don't want to wait on close) */ @@ -925,7 +929,11 @@ end: break; nr += npos; } - assert(nr == wr_used); + if(unlikely(nr != wr_used)) { + LM_ERR("failure - nr(%lu) != wr_used(%lu)\n", (unsigned long)nr, + (unsigned long)wr_used); + goto error; + } *plen = wr_used; *pbuf = (const char *)wr_buf; TLS_WR_TRACE("(%p) end (offs %d, rest_buf=%p rest_len=%d 0x%0x) => %d \n", @@ -949,7 +957,11 @@ ssl_eof: break; nr += npos; } - assert(nr == wr_used); + if(unlikely(nr != wr_used)) { + LM_ERR("failure - nr(%lu) != wr_used(%lu)\n", (unsigned long)nr, + (unsigned long)wr_used); + return -1; + } *plen = wr_used; *pbuf = (const char *)wr_buf; DBG("TLS connection has been closed\n"); @@ -1053,7 +1065,11 @@ redo_read: break; nw += npos; } - assert(nw == bytes_read); + if(unlikely(nw != bytes_read)) { + LM_ERR("failure - nw(%lu) != bytes_read(%lu)\n", (unsigned long)nw, + (unsigned long)bytes_read); + goto error; + } } continue_ssl_read: ssl_error = WOLFSSL_ERROR_NONE; @@ -1204,7 +1220,13 @@ continue_ssl_read: break; nr += npos; } - assert(nr == wr_used); + if(unlikely(nr != wr_used)) { + LM_ERR("failure - nr(%lu) != wr_used(%lu)\n", (unsigned long)nr, + (unsigned long)wr_used); + lock_release(&c->write_lock); + TLS_RD_TRACE("(%p, %p) tcpconn_send_unsafe failure\n", c, flags); + goto error_send; + } if(unlikely(tcpconn_send_unsafe( c->fd, c, (char *)wr_buf, wr_used, c->send_flags) < 0)) { diff --git a/src/modules/tlsa/CMakeLists.txt b/src/modules/tlsa/CMakeLists.txt index a72f900d8..2527da510 100644 --- a/src/modules/tlsa/CMakeLists.txt +++ b/src/modules/tlsa/CMakeLists.txt @@ -2,29 +2,32 @@ file(GLOB MODULE_SOURCES "*.c") add_library(${module_name} SHARED ${MODULE_SOURCES}) -# Find packages -find_package(ZLIB REQUIRED) -find_package(Threads REQUIRED) +# unset to avoid finding shared library from previous find_package calls +# that are cached +unset(OPENSSL_CRYPTO_LIBRARY CACHE) +unset(OPENSSL_INCLUDE_DIR CACHE) +unset(OPENSSL_SSL_LIBRARY CACHE) +set(OPENSSL_USE_STATIC_LIBS TRUE) -# TODO: Probably all thesse are not need because if OpenSSL can't be found it -# will fail and ask to set variables like OPENSSL_ROOT_DIR, OPENSSL_INCLUDE_DIR -# and LIBRARIES -if(LIBSSL_STATIC) - target_compile_definitions(${module_name} KSR_LIBSSL_STATIC) - if(LIBSSL_STATIC_SRCLIB) - target_include_directories(${module_name} PRIVATE ${LIBSSL_STATIC_SRCPATH}/include) - target_link_directories(${module_name} PRIVATE ${LIBSSL_STATIC_SRCPATH}) - else() - # Static linking with system libraries Note: This assumes the static - # libraries are installed in a standard location - set(OPENSSL_USE_STATIC_LIBS TRUE) - find_package(OpenSSL REQUIRED) - # TODO: Check if this is needed: -Wl,-Bstatic - target_link_libraries(${module_name} PRIVATE OpenSSL::SSL OpenSSL::Crypto ZLIB::ZLIB) - endif() +# Find packages +target_compile_definitions(${module_name} PRIVATE KSR_LIBSSL_STATIC) +if(LIBSSL_STATIC_SRCLIB) + target_include_directories(${module_name} PRIVATE ${LIBSSL_STATIC_SRCPATH}/include) + target_link_directories(${module_name} PRIVATE ${LIBSSL_STATIC_SRCPATH}) else() + # Static linking with system libraries Note: This assumes the static + # libraries are installed in a standard location find_package(OpenSSL REQUIRED) - target_link_libraries( - ${module_name} PRIVATE OpenSSL::SSL OpenSSL::Crypto ZLIB::ZLIB Threads::Threads - ) + + # TODO: Check if this is needed: -Wl,-Bstatic + target_link_libraries(${module_name} PRIVATE OpenSSL::SSL OpenSSL::Crypto) + if(TARGET_ARCH STREQUAL "riscv64") + target_link_options(${module_name} PRIVATE "-Wl,-Bsymbolic-functions") + endif() endif() + +# Reset variables to avoid interference with other modules +unset(OPENSSL_CRYPTO_LIBRARY CACHE) +unset(OPENSSL_INCLUDE_DIR CACHE) +unset(OPENSSL_SSL_LIBRARY CACHE) +set(OPENSSL_USE_STATIC_LIBS FALSE) diff --git a/src/modules/tm/t_reply.c b/src/modules/tm/t_reply.c index fba235fcb..121d20a49 100644 --- a/src/modules/tm/t_reply.c +++ b/src/modules/tm/t_reply.c @@ -2486,7 +2486,7 @@ int reply_received(struct sip_msg *p_msg) membar_read(); /* make sure we get the current value of * local_cancel */ /* re-transmit if cancel already built */ - DBG("tm: reply_received: branch CANCEL retransmit\n"); + DBG("branch CANCEL retransmit\n"); if(SEND_BUFFER(&uac->local_cancel) >= 0) { if(unlikely(has_tran_tmcbs(t, TMCB_REQUEST_SENT))) run_trans_callbacks_with_buf(TMCB_REQUEST_SENT, diff --git a/src/modules/topos_htable/topos_htable_storage.c b/src/modules/topos_htable/topos_htable_storage.c index eec48ce76..ad44e9cd7 100644 --- a/src/modules/topos_htable/topos_htable_storage.c +++ b/src/modules/topos_htable/topos_htable_storage.c @@ -143,23 +143,20 @@ static int tps_htable_insert_initial_method_branch( // base64 encode key values if(_tps_base64) { - base64url_enc(md->s_method.s, md->s_method.len, _tps_base64_buf[0], + base64url_enc(md->a_callid.s, md->a_callid.len, _tps_base64_buf[0], TPS_BASE64_SIZE - 1); - base64url_enc(md->a_callid.s, md->a_callid.len, _tps_base64_buf[1], - TPS_BASE64_SIZE - 1); - base64url_enc(md->b_tag.s, md->b_tag.len, _tps_base64_buf[2], + base64url_enc(md->b_tag.s, md->b_tag.len, _tps_base64_buf[1], TPS_BASE64_SIZE - 1); base64url_enc( - xuuid.s, xuuid.len, _tps_base64_buf[3], TPS_BASE64_SIZE - 1); + xuuid.s, xuuid.len, _tps_base64_buf[2], TPS_BASE64_SIZE - 1); - ret = snprintf(ptr, TPS_HTABLE_SIZE_KEY, "%s|%s|%s|x%s", - _tps_base64_buf[0], _tps_base64_buf[1], _tps_base64_buf[2], - _tps_base64_buf[3]); + ret = snprintf(ptr, TPS_HTABLE_SIZE_KEY, "%s|%s|x%s", + _tps_base64_buf[0], _tps_base64_buf[1], _tps_base64_buf[2]); } else { - ret = snprintf(ptr, TPS_HTABLE_SIZE_KEY, "%.*s|%.*s|%.*s|x%.*s", - md->s_method.len, md->s_method.s, md->a_callid.len, - md->a_callid.s, md->b_tag.len, md->b_tag.s, xuuid.len, xuuid.s); + ret = snprintf(ptr, TPS_HTABLE_SIZE_KEY, "%.*s|%.*s|x%.*s", + md->a_callid.len, md->a_callid.s, md->b_tag.len, md->b_tag.s, + xuuid.len, xuuid.s); } if(ret < 0 || ret >= TPS_HTABLE_SIZE_KEY) { @@ -222,7 +219,6 @@ static int tps_htable_load_initial_method_branch(tps_data_t *md, tps_data_t *sd) int i = 0; str xuuid = str_init(""); str xtag = str_init(""); - str smethod = str_init("INVITE"); // checks if(md == NULL || sd == NULL) { @@ -264,31 +260,23 @@ static int tps_htable_load_initial_method_branch(tps_data_t *md, tps_data_t *sd) xuuid.len = sd->b_uuid.len - 1; } - if(md->s_method_id & (METHOD_SUBSCRIBE | METHOD_NOTIFY)) { - smethod.s = "SUBSCRIBE"; - smethod.len = 9; - } - ptr = _tps_htable_key_buf; // base64 encode key values if(_tps_base64) { - base64url_enc(md->s_method.s, md->s_method.len, _tps_base64_buf[0], - TPS_BASE64_SIZE - 1); - base64url_enc(md->a_callid.s, md->a_callid.len, _tps_base64_buf[1], + base64url_enc(md->a_callid.s, md->a_callid.len, _tps_base64_buf[0], TPS_BASE64_SIZE - 1); base64url_enc( - xtag.s, xtag.len, _tps_base64_buf[2], TPS_BASE64_SIZE - 1); + xtag.s, xtag.len, _tps_base64_buf[1], TPS_BASE64_SIZE - 1); base64url_enc( - xuuid.s, xuuid.len, _tps_base64_buf[3], TPS_BASE64_SIZE - 1); + xuuid.s, xuuid.len, _tps_base64_buf[2], TPS_BASE64_SIZE - 1); - ret = snprintf(ptr, TPS_HTABLE_SIZE_KEY, "%s|%s|%s|x%s", - _tps_base64_buf[0], _tps_base64_buf[1], _tps_base64_buf[2], - _tps_base64_buf[3]); + ret = snprintf(ptr, TPS_HTABLE_SIZE_KEY, "%s|%s|x%s", + _tps_base64_buf[0], _tps_base64_buf[1], _tps_base64_buf[2]); } else { - ret = snprintf(ptr, TPS_HTABLE_SIZE_KEY, "%.*s|%.*s|%.*s|x%.*s", - smethod.len, smethod.s, md->a_callid.len, md->a_callid.s, - xtag.len, xtag.s, xuuid.len, xuuid.s); + ret = snprintf(ptr, TPS_HTABLE_SIZE_KEY, "%.*s|%.*s|x%.*s", + md->a_callid.len, md->a_callid.s, xtag.len, xtag.s, xuuid.len, + xuuid.s); } if(ret < 0 || ret >= TPS_HTABLE_SIZE_KEY) { @@ -697,7 +685,7 @@ int tps_htable_update_branch( do_update = 1; if(md->b_rr.len > 0) { - hval.b_rr = md->b_rr; + hval.y_rr = md->b_rr; } if(md->b_tag.len > 0) { hval.b_tag = md->b_tag; diff --git a/src/modules/uac/replace.c b/src/modules/uac/replace.c index 61d57bbfd..8f60a703e 100644 --- a/src/modules/uac/replace.c +++ b/src/modules/uac/replace.c @@ -246,10 +246,11 @@ int replace_uri(struct sip_msg *msg, str *display, str *uri, struct cell *Trans; str replace; char *p; + str luri; str param; str buf; msg_flags_t uac_flag; - int i; + int i, del_offset, del_len; int_str avp_value; struct dlg_cell *dlg = 0; str *dlgvar_names; @@ -313,10 +314,23 @@ int replace_uri(struct sip_msg *msg, str *display, str *uri, l = 0; /* first remove the existing display */ if(body->display.len) { + del_offset = body->display.s - msg->buf; + del_len = body->display.len; + LM_DBG("removing display [%.*s]\n", body->display.len, body->display.s); + + /* if removing display, also remove trailing spaces after it */ + if(!display->len) { + p = body->display.s + body->display.len; + while(p < msg->buf + msg->len && *p == ' ') { + del_len++; + p++; + } + } + /* build del lump */ - l = del_lump(msg, body->display.s - msg->buf, body->display.len, 0); + l = del_lump(msg, del_offset, del_len, 0); if(l == 0) { LM_ERR("display del lump failed\n"); goto error; @@ -359,13 +373,29 @@ int replace_uri(struct sip_msg *msg, str *display, str *uri, LM_ERR("del lump failed\n"); goto error; } - p = pkg_malloc(uri->len); - if(p == 0) { + luri.len = uri->len; + if(!(body->style & TBS_URI_ENCLOSED)) { + /* existing uri not enclosed - check if new one has parameters */ + for(p = uri->s + uri->len - 1; p > uri->s; p--) { + if(*p == ';') { + luri.len += 2; + break; + } + } + } + luri.s = pkg_malloc(luri.len); + if(luri.s == 0) { PKG_MEM_ERROR; goto error; } - memcpy(p, uri->s, uri->len); - if(insert_new_lump_after(l, p, uri->len, 0) == 0) { + if(luri.len == uri->len + 2) { + luri.s[0] = '<'; + memcpy(luri.s + 1, uri->s, uri->len); + luri.s[luri.len - 1] = '>'; + } else { + memcpy(luri.s, uri->s, uri->len); + } + if(insert_new_lump_after(l, luri.s, luri.len, 0) == 0) { LM_ERR("insert new lump failed\n"); pkg_free(p); goto error; @@ -884,6 +914,7 @@ static void replace_callback( int dlgvar_index = 0; int dlgvar_dpindex = 0; str *dlgvar_names; + struct cell *Trans; if(!dlg || !_params || _params->direction == DLG_DIR_NONE || !_params->req) return; @@ -1016,6 +1047,11 @@ static void replace_callback( } msg->msg_flags |= uac_flag; + if((Trans = uac_tmb.t_gett()) != NULL && Trans != T_UNDEFINED + && Trans->uas.request) { + Trans->uas.request->msg_flags |= uac_flag; + } + return; } diff --git a/src/modules/usrloc/udomain.c b/src/modules/usrloc/udomain.c index 9fbef38bd..7f2347560 100644 --- a/src/modules/usrloc/udomain.c +++ b/src/modules/usrloc/udomain.c @@ -1392,10 +1392,13 @@ int get_urecord(udomain_t *_d, str *_aor, struct urecord **_r) && !memcmp(r->aor.s, _aor->s, _aor->len)) { if(ul_handle_lost_tcp) { for(ptr = r->contacts; ptr; ptr = ptr->next) { - if(ptr->expires == UL_EXPIRED_TIME) + if(ptr->expires == UL_EXPIRED_TIME) { continue; - if(is_valid_tcpconn(ptr) && !is_tcp_alive(ptr)) + } + if(is_valid_tcpconn(ptr) && !is_tcp_alive(ptr)) { ptr->expires = UL_EXPIRED_TIME; + continue; + } } } *_r = r; diff --git a/src/modules/websocket/CMakeLists.txt b/src/modules/websocket/CMakeLists.txt index daddc40fa..e0f0383a6 100644 --- a/src/modules/websocket/CMakeLists.txt +++ b/src/modules/websocket/CMakeLists.txt @@ -6,9 +6,10 @@ find_package(OpenSSL REQUIRED) target_link_libraries(websocket PRIVATE OpenSSL::SSL OpenSSL::Crypto) -# TODO: Verify if correct -if(EMBEDDED_UTF8_DECODE EQUAL 0) - target_link_libraries(${module_name} PRIVATE unistring) -else() +option(EMBEDDED_UTF8_DECODE "Use embedded UTF-8 decode (websocket module)" OFF) + +if(EMBEDDED_UTF8_DECODE) target_compile_definitions(${module_name} PRIVATE EMBEDDED_UTF8_DECODE) +else() + target_link_libraries(${module_name} PRIVATE unistring) endif() diff --git a/src/modules/xcap_client/xcap_client.c b/src/modules/xcap_client/xcap_client.c index 602d74cea..e90269c3a 100644 --- a/src/modules/xcap_client/xcap_client.c +++ b/src/modules/xcap_client/xcap_client.c @@ -148,7 +148,10 @@ static int mod_init(void) xcap_dbf.close(xcap_db); xcap_db = NULL; - curl_global_init(CURL_GLOBAL_ALL); + if(curl_global_init(CURL_GLOBAL_ALL)) { + LM_ERR("failed to init global curl\n"); + return -1; + } if(periodical_query) { register_timer(query_xcap_update, 0, query_period); diff --git a/src/modules/xcap_client/xcap_functions.c b/src/modules/xcap_client/xcap_functions.c index 0c67b44cf..1ccf369b2 100644 --- a/src/modules/xcap_client/xcap_functions.c +++ b/src/modules/xcap_client/xcap_functions.c @@ -471,6 +471,10 @@ char *send_http_get(char *path, unsigned int xcap_port, char *match_etag, } curl_handle = curl_easy_init(); + if(curl_handle == NULL) { + LM_ERR("curl_easy_init() failed\n"); + return NULL; + } curl_easy_setopt(curl_handle, CURLOPT_URL, path); diff --git a/src/modules/xhttp_prom/prom_metric.c b/src/modules/xhttp_prom/prom_metric.c index eba18d063..83404ce39 100644 --- a/src/modules/xhttp_prom/prom_metric.c +++ b/src/modules/xhttp_prom/prom_metric.c @@ -1672,13 +1672,12 @@ static int prom_label_print( goto error; } - if(plval->n_elem == 0) { - /* Nothing to print. */ - return 0; - } - - if(!lb_name || lb_name->n_elem == 0) { - /* Nothing to print. */ + if(plval->n_elem == 0 || !lb_name || lb_name->n_elem == 0) { + /* No metric-specific labels, but print global tags if present. */ + if(prom_body_printf(ctx, "%s", xhttp_prom_tags_braces) == -1) { + LM_ERR("Fail to print\n"); + goto error; + } return 0; } @@ -1710,8 +1709,8 @@ static int prom_label_print( plval_node = plval_node->next; } /* while (lb_name_node && plval_node) */ - /* Close labels. */ - if(prom_body_printf(ctx, "}") == -1) { + /* Append global tags and close labels. */ + if(prom_body_printf(ctx, "%s}", xhttp_prom_tags_comma) == -1) { LM_ERR("Fail to print\n"); goto error; } @@ -1769,8 +1768,8 @@ static int prom_label_print_le( goto error; } - /* Close labels. */ - if(prom_body_printf(ctx, "}") == -1) { + /* Append global tags and close labels. */ + if(prom_body_printf(ctx, "%s}", xhttp_prom_tags_comma) == -1) { LM_ERR("Fail to print\n"); goto error; } @@ -1824,10 +1823,44 @@ static int prom_metric_lvalue_print( goto error; } - /* Print labels */ - if(prom_label_print(ctx, p->lb_name, &pvl->lval)) { - LM_ERR("Fail to print labels\n"); - goto error; + + /* Print labels and append global tags if set */ + int has_labels = + (p->lb_name && p->lb_name->n_elem > 0 && pvl->lval.n_elem > 0); + int has_tags = + (xhttp_prom_tags_comma && xhttp_prom_tags_comma[0] != '\0'); + if(has_labels) { + /* Print user labels, then append global tags if set */ + /* Remove closing brace, append comma, then tags, then close */ + if(prom_body_printf(ctx, "{") == -1) + goto error; + prom_lb_node_t *lb_name_node = p->lb_name->lb; + prom_lb_node_t *plval_node = pvl->lval.lb; + int first = 1; + while(lb_name_node && plval_node) { + if(!first) { + if(prom_body_printf(ctx, ", ") == -1) + goto error; + } + if(prom_body_printf(ctx, "%.*s=\"%.*s\"", lb_name_node->n.len, + lb_name_node->n.s, plval_node->n.len, + plval_node->n.s) + == -1) + goto error; + lb_name_node = lb_name_node->next; + plval_node = plval_node->next; + first = 0; + } + if(has_tags) { + if(prom_body_printf(ctx, "%s", xhttp_prom_tags_comma) == -1) + goto error; + } + if(prom_body_printf(ctx, "}") == -1) + goto error; + } else if(has_tags) { + /* Only global tags */ + if(prom_body_printf(ctx, "{%s}", xhttp_prom_tags) == -1) + goto error; } if(prom_body_printf(ctx, " %" PRIu64, pvl->m.cval) == -1) {