public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/opensips] f44: OpenSIPS ver. 3.6.7
@ 2026-06-24 17:39 Peter Lemenkov
  0 siblings, 0 replies; only message in thread
From: Peter Lemenkov @ 2026-06-24 17:39 UTC (permalink / raw)
  To: git-commits

            A new commit has been pushed.

            Repo   : rpms/opensips
            Branch : f44
            Commit : 51715504dc4735be585c393af6ec55f45693aba6
            Author : Peter Lemenkov <lemenkov@gmail.com>
            Date   : 2026-06-24T19:01:44+02:00
            Stats  : +700/-2286 in 26 file(s)
            URL    : https://src.fedoraproject.org/rpms/opensips/c/51715504dc4735be585c393af6ec55f45693aba6?branch=f44

            Log:
            OpenSIPS ver. 3.6.7

Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>

---
diff --git a/opensips-0001-Consistently-use-rtpproxy-switches.patch b/opensips-0001-Consistently-use-rtpproxy-switches.patch
index 91a1f48..6bc6ec8 100644
--- a/opensips-0001-Consistently-use-rtpproxy-switches.patch
+++ b/opensips-0001-Consistently-use-rtpproxy-switches.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Consistently use rtpproxy switches
 Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
 
 diff --git a/modules/rtpproxy/doc/rtpproxy_admin.xml b/modules/rtpproxy/doc/rtpproxy_admin.xml
-index 2ae4c9b2b..c17b77d05 100644
+index 2ae4c9b2b0..c17b77d05f 100644
 --- a/modules/rtpproxy/doc/rtpproxy_admin.xml
 +++ b/modules/rtpproxy/doc/rtpproxy_admin.xml
 @@ -637,7 +637,7 @@ modparam("rtpproxy", "generated_sdp_media_ip", "10.0.0.1")
@@ -19,7 +19,7 @@ index 2ae4c9b2b..c17b77d05 100644
  				</para></listitem>
  				<listitem><para>
 diff --git a/modules/rtpproxy/rtpproxy.c b/modules/rtpproxy/rtpproxy.c
-index 8f1682207..b99679df8 100644
+index d6e665e38c..62bc098fea 100644
 --- a/modules/rtpproxy/rtpproxy.c
 +++ b/modules/rtpproxy/rtpproxy.c
 @@ -3696,8 +3696,6 @@ static int rtpproxy_offer_answer(struct sip_msg *msg, struct rtpp_args *args,

diff --git a/opensips-0002-Cleanup-Oracle-s-makefiles.patch b/opensips-0002-Cleanup-Oracle-s-makefiles.patch
index 424409c..eef9f1c 100644
--- a/opensips-0002-Cleanup-Oracle-s-makefiles.patch
+++ b/opensips-0002-Cleanup-Oracle-s-makefiles.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Cleanup Oracle's makefiles
 Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
 
 diff --git a/modules/db_oracle/Makefile b/modules/db_oracle/Makefile
-index 00d2d412e..30592fdf2 100644
+index 00d2d412e0..30592fdf2c 100644
 --- a/modules/db_oracle/Makefile
 +++ b/modules/db_oracle/Makefile
 @@ -4,76 +4,8 @@ include ../../Makefile.defs
@@ -89,7 +89,7 @@ index 00d2d412e..30592fdf2 100644
  include ../../Makefile.modules
  
 diff --git a/utils/db_oracle/Makefile b/utils/db_oracle/Makefile
-index aeaccd710..397727c8e 100644
+index aeaccd7106..397727c8e7 100644
 --- a/utils/db_oracle/Makefile
 +++ b/utils/db_oracle/Makefile
 @@ -9,72 +9,8 @@ NAME=opensips_orasel

diff --git a/opensips-0003-db_ora-null-terminating-string-is-more-safely-most-m.patch b/opensips-0003-db_ora-null-terminating-string-is-more-safely-most-m.patch
index 92923e6..6edd87c 100644
--- a/opensips-0003-db_ora-null-terminating-string-is-more-safely-most-m.patch
+++ b/opensips-0003-db_ora-null-terminating-string-is-more-safely-most-m.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] db_ora: null-terminating string is more safely, most modules
 
 
 diff --git a/modules/db_oracle/res.c b/modules/db_oracle/res.c
-index 97099b4a0..2ced0b3b5 100644
+index 97099b4a08..2ced0b3b5c 100644
 --- a/modules/db_oracle/res.c
 +++ b/modules/db_oracle/res.c
 @@ -216,7 +216,7 @@ set_flt:

diff --git a/opensips-0004-Return-actual-payload-ID-in-case-of-a-dynamic-payloa.patch b/opensips-0004-Return-actual-payload-ID-in-case-of-a-dynamic-payloa.patch
index 2469aff..3e9f9a4 100644
--- a/opensips-0004-Return-actual-payload-ID-in-case-of-a-dynamic-payloa.patch
+++ b/opensips-0004-Return-actual-payload-ID-in-case-of-a-dynamic-payloa.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Return actual payload ID in case of a dynamic payload
 Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
 
 diff --git a/modules/sipmsgops/codecs.c b/modules/sipmsgops/codecs.c
-index b5a6a7a6b..af74e927e 100644
+index b5a6a7a6bd..af74e927e6 100644
 --- a/modules/sipmsgops/codecs.c
 +++ b/modules/sipmsgops/codecs.c
 @@ -28,6 +28,7 @@

diff --git a/opensips-0005-Fix-rabbitmq-c-deprecated-header-warnings.patch b/opensips-0005-Fix-rabbitmq-c-deprecated-header-warnings.patch
index 6b8a34d..b7bf490 100644
--- a/opensips-0005-Fix-rabbitmq-c-deprecated-header-warnings.patch
+++ b/opensips-0005-Fix-rabbitmq-c-deprecated-header-warnings.patch
@@ -89,7 +89,7 @@ Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
 Assisted-by: Claude (Anthropic) <https://claude.ai>
 
 diff --git a/modules/event_rabbitmq/README b/modules/event_rabbitmq/README
-index 698fbf63d..7f742d833 100644
+index 8ad24bf856..359985fc2a 100644
 --- a/modules/event_rabbitmq/README
 +++ b/modules/event_rabbitmq/README
 @@ -130,7 +130,7 @@ Chapter 1. Admin Guide
@@ -102,7 +102,7 @@ index 698fbf63d..7f742d833 100644
  1.5. Exported Parameters
  
 diff --git a/modules/event_rabbitmq/doc/event_rabbitmq_admin.xml b/modules/event_rabbitmq/doc/event_rabbitmq_admin.xml
-index 438967541..6d4619ce5 100644
+index 4389675417..6d4619ce51 100644
 --- a/modules/event_rabbitmq/doc/event_rabbitmq_admin.xml
 +++ b/modules/event_rabbitmq/doc/event_rabbitmq_admin.xml
 @@ -131,7 +131,7 @@
@@ -115,7 +115,7 @@ index 438967541..6d4619ce5 100644
  			</listitem>
  			</itemizedlist>
 diff --git a/modules/event_rabbitmq/event_rabbitmq.c b/modules/event_rabbitmq/event_rabbitmq.c
-index 619ee750c..143f381f0 100644
+index cac53964ef..3028bd96de 100644
 --- a/modules/event_rabbitmq/event_rabbitmq.c
 +++ b/modules/event_rabbitmq/event_rabbitmq.c
 @@ -50,9 +50,7 @@ static unsigned int heartbeat = 0;
@@ -164,7 +164,7 @@ index 619ee750c..143f381f0 100644
  
  	return 0;
 diff --git a/modules/event_rabbitmq/event_rabbitmq.h b/modules/event_rabbitmq/event_rabbitmq.h
-index 5b1158e16..b27c2ad64 100644
+index 5b1158e16f..b27c2ad64d 100644
 --- a/modules/event_rabbitmq/event_rabbitmq.h
 +++ b/modules/event_rabbitmq/event_rabbitmq.h
 @@ -27,13 +27,10 @@
@@ -186,7 +186,7 @@ index 5b1158e16..b27c2ad64 100644
  #include "../tls_mgm/api.h"
  #include "rmq_servers.h"
 diff --git a/modules/event_rabbitmq/rmq_servers.c b/modules/event_rabbitmq/rmq_servers.c
-index d920e599d..d1f6a19ab 100644
+index d920e599d1..d1f6a19ab4 100644
 --- a/modules/event_rabbitmq/rmq_servers.c
 +++ b/modules/event_rabbitmq/rmq_servers.c
 @@ -33,61 +33,7 @@
@@ -355,7 +355,7 @@ index d920e599d..d1f6a19ab 100644
  
  int rmq_basic_server_publish(rmq_connection_t *conn, int max_frames,
 diff --git a/modules/event_rabbitmq/rmq_servers.h b/modules/event_rabbitmq/rmq_servers.h
-index a700d8004..0d853f8f2 100644
+index a700d80049..0d853f8f2b 100644
 --- a/modules/event_rabbitmq/rmq_servers.h
 +++ b/modules/event_rabbitmq/rmq_servers.h
 @@ -40,7 +40,7 @@
@@ -410,7 +410,7 @@ index a700d8004..0d853f8f2 100644
  	int heartbeat;
  	str tls_dom_name;
 diff --git a/modules/rabbitmq_consumer/README b/modules/rabbitmq_consumer/README
-index aed3bf49f..6c760d554 100644
+index aed3bf49fb..6c760d5547 100644
 --- a/modules/rabbitmq_consumer/README
 +++ b/modules/rabbitmq_consumer/README
 @@ -72,8 +72,8 @@ Chapter 1. Admin Guide
@@ -425,7 +425,7 @@ index aed3bf49f..6c760d554 100644
  1.3. Exported Parameters
  
 diff --git a/modules/rabbitmq_consumer/doc/rabbitmq_consumer_admin.xml b/modules/rabbitmq_consumer/doc/rabbitmq_consumer_admin.xml
-index a8da3cb2a..856ed7395 100644
+index a8da3cb2a7..856ed73954 100644
 --- a/modules/rabbitmq_consumer/doc/rabbitmq_consumer_admin.xml
 +++ b/modules/rabbitmq_consumer/doc/rabbitmq_consumer_admin.xml
 @@ -50,7 +50,7 @@
@@ -438,7 +438,7 @@ index a8da3cb2a..856ed7395 100644
  		</para>
  	</section>
 diff --git a/modules/rabbitmq_consumer/rabbitmq_consumer.c b/modules/rabbitmq_consumer/rabbitmq_consumer.c
-index 6462f5708..c6cf2417d 100644
+index 6462f5708c..c6cf2417db 100644
 --- a/modules/rabbitmq_consumer/rabbitmq_consumer.c
 +++ b/modules/rabbitmq_consumer/rabbitmq_consumer.c
 @@ -96,7 +96,9 @@ static int mod_init(void)
@@ -452,7 +452,7 @@ index 6462f5708..c6cf2417d 100644
  
  	return 0;
 diff --git a/modules/rabbitmq_consumer/rmq_connection.h b/modules/rabbitmq_consumer/rmq_connection.h
-index 8aea48710..a34a0deb5 100644
+index 8aea48710a..a34a0deb51 100644
 --- a/modules/rabbitmq_consumer/rmq_connection.h
 +++ b/modules/rabbitmq_consumer/rmq_connection.h
 @@ -22,9 +22,9 @@

diff --git a/opensips-0006-Fix-uninitialized-variable-warnings-in-SQL-API-funct.patch b/opensips-0006-Fix-uninitialized-variable-warnings-in-SQL-API-funct.patch
index c95cffd..a532bf0 100644
--- a/opensips-0006-Fix-uninitialized-variable-warnings-in-SQL-API-funct.patch
+++ b/opensips-0006-Fix-uninitialized-variable-warnings-in-SQL-API-funct.patch
@@ -54,7 +54,7 @@ Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
 Assisted-by: Claude (Anthropic) <https://claude.ai>
 
 diff --git a/modules/sqlops/sqlops_db.c b/modules/sqlops/sqlops_db.c
-index 5de7b5599..cf364593f 100644
+index 5de7b55995..cf364593f8 100644
 --- a/modules/sqlops/sqlops_db.c
 +++ b/modules/sqlops/sqlops_db.c
 @@ -713,7 +713,7 @@ int sql_api_select(struct db_url *url, struct sip_msg* msg, cJSON *Jcols,

diff --git a/opensips-0007-Fix-const-correctness-warnings-in-HTTP-and-FreeSWITC.patch b/opensips-0007-Fix-const-correctness-warnings-in-HTTP-and-FreeSWITC.patch
index 07db783..1eed53d 100644
--- a/opensips-0007-Fix-const-correctness-warnings-in-HTTP-and-FreeSWITC.patch
+++ b/opensips-0007-Fix-const-correctness-warnings-in-HTTP-and-FreeSWITC.patch
@@ -96,7 +96,7 @@ Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
 Assisted-by: Claude (Anthropic) <https://claude.ai>
 
 diff --git a/modules/freeswitch/esl/src/esl_event.c b/modules/freeswitch/esl/src/esl_event.c
-index a12b6d637..f62497388 100644
+index a12b6d637b..f624973884 100644
 --- a/modules/freeswitch/esl/src/esl_event.c
 +++ b/modules/freeswitch/esl/src/esl_event.c
 @@ -425,7 +425,7 @@ static esl_status_t esl_event_base_add_header(esl_event_t *event, esl_stack_t st
@@ -109,10 +109,10 @@ index a12b6d637..f62497388 100644
  		index = atoi(index_ptr);
  		real_header_name = DUP(header_name);
 diff --git a/modules/httpd/httpd_proc.c b/modules/httpd/httpd_proc.c
-index 0d4b43f20..3a3fd8b07 100644
+index 708e00b40d..2646f04147 100644
 --- a/modules/httpd/httpd_proc.c
 +++ b/modules/httpd/httpd_proc.c
-@@ -321,7 +321,7 @@ MHD_RET getConnectionHeader(void *cls, enum MHD_ValueKind kind,
+@@ -326,7 +326,7 @@ MHD_RET getConnectionHeader(void *cls, enum MHD_ValueKind kind,
  	struct post_request *pr = (struct post_request*)cls;
  	str content_length;
  	unsigned int len;
@@ -121,7 +121,7 @@ index 0d4b43f20..3a3fd8b07 100644
  
  	if (cls == NULL) {
  		LM_ERR("Unable to store return data\n");
-@@ -345,24 +345,24 @@ MHD_RET getConnectionHeader(void *cls, enum MHD_ValueKind kind,
+@@ -350,24 +350,24 @@ MHD_RET getConnectionHeader(void *cls, enum MHD_ValueKind kind,
  	if (strcasecmp("Content-Type", key) == 0) {
  		LM_DBG("Content-Type=%s\n", value);
  		/* extract only the mime */

diff --git a/opensips-0008-Fix-uninitialized-va_list-warning-on-ppc64le-and-i68.patch b/opensips-0008-Fix-uninitialized-va_list-warning-on-ppc64le-and-i68.patch
index 8e995df..6c9d628 100644
--- a/opensips-0008-Fix-uninitialized-va_list-warning-on-ppc64le-and-i68.patch
+++ b/opensips-0008-Fix-uninitialized-va_list-warning-on-ppc64le-and-i68.patch
@@ -83,10 +83,10 @@ Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
 Assisted-by: Claude (Anthropic) <https://claude.ai>
 
 diff --git a/modules/cachedb_redis/cachedb_redis_dbase.c b/modules/cachedb_redis/cachedb_redis_dbase.c
-index 38957e4a9..b34e8da83 100644
+index 5ef92c6a5a..5c6a9c72d3 100644
 --- a/modules/cachedb_redis/cachedb_redis_dbase.c
 +++ b/modules/cachedb_redis/cachedb_redis_dbase.c
-@@ -654,9 +654,9 @@ static int redis_run_command(cachedb_con *connection, redisReply **rpl,
+@@ -660,9 +660,9 @@ static int redis_run_command(cachedb_con *connection, redisReply **rpl,
  static int redis_run_command_argv(cachedb_con *connection, redisReply **rpl,
                str *key, int argc, const char **argv, const size_t *argvlen)
  {

diff --git a/opensips-0009-Fix-format-specifier-warnings-on-32-bit-architecture.patch b/opensips-0009-Fix-format-specifier-warnings-on-32-bit-architecture.patch
deleted file mode 100644
index c538f5c..0000000
--- a/opensips-0009-Fix-format-specifier-warnings-on-32-bit-architecture.patch
+++ /dev/null
@@ -1,89 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Peter Lemenkov <lemenkov@gmail.com>
-Date: Fri, 26 Dec 2025 17:49:21 +0100
-Subject: [PATCH] Fix format specifier warnings on 32-bit architectures (i686)
-
-During compilation on i686 (32-bit) architecture with GCC 15, format
-specifier warnings appear due to type size differences between 32-bit
-and 64-bit platforms.
-
-```
-server.c: In function 'on_frame_recv_callback':
-warning: format '%ld' expects argument of type 'long int', but argument 14
-has type 'size_t' {aka 'unsigned int'} [-Wformat=]
-  638 |  LM_DBG("h2 header [%d], %p %ld\n", frame->hd.type, frame->headers.nva, frame->headers.nvlen);
-
-dm_impl.c: In function 'dm_avps2json':
-warning: format '%ld' expects argument of type 'long int', but argument 15
-has type 'int64_t' {aka 'long long int'} [-Wformat=]
-  484 |  LM_DBG("%2d. got int64   AVP %s (%u), value: %ld\n", i, dm_avp.avp_name, h->avp_code, h->avp_value->i64);
-
-warning: format '%lu' expects argument of type 'long unsigned int', but argument 15
-has type 'uint64_t' {aka 'long long unsigned int'} [-Wformat=]
-  494 |  LM_DBG("%2d. got uint64  AVP %s (%u), value: %lu\n", i, dm_avp.avp_name, h->avp_code, h->avp_value->u64);
-```
-
-Type sizes differ between 32-bit and 64-bit architectures:
-
-**On x86_64 (64-bit):**
-- `size_t` = `unsigned long` (8 bytes)
-- `int64_t` = `long int` (8 bytes)
-
-**On i686 (32-bit):**
-- `size_t` = `unsigned int` (4 bytes)
-- `int64_t` = `long long int` (8 bytes)
-- `uint64_t` = `unsigned long long int` (8 bytes)
-
-Use portable C99 format specifiers that work correctly on all
-architectures:
-
-- `%zu` for `size_t` (modules/http2d/server.c line 638)
-- `%" PRId64` for `int64_t` (modules/aaa_diameter/dm_impl.c line 484)
-- `%" PRIu64` for `uint64_t` (modules/aaa_diameter/dm_impl.c line 494)
-
-Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
-Assisted-by: Claude (Anthropic) <https://claude.ai>
-
-diff --git a/modules/aaa_diameter/dm_impl.c b/modules/aaa_diameter/dm_impl.c
-index 5ba697767..927261899 100644
---- a/modules/aaa_diameter/dm_impl.c
-+++ b/modules/aaa_diameter/dm_impl.c
-@@ -20,6 +20,7 @@
- 
- #include <freeDiameter/extension.h>
- #include <sys/eventfd.h>
-+#include <inttypes.h>
- 
- #include "../../ut.h"
- #include "../../lib/list.h"
-@@ -481,7 +482,7 @@ static int dm_avps2json(void *root, cJSON *avps)
- 			break;
- 
- 		case AVP_TYPE_INTEGER64:
--			LM_DBG("%2d. got int64   AVP %s (%u), value: %ld\n", i, dm_avp.avp_name, h->avp_code, h->avp_value->i64);
-+			LM_DBG("%2d. got int64   AVP %s (%u), value: %" PRId64 "\n", i, dm_avp.avp_name, h->avp_code, h->avp_value->i64);
- 			num_val = (double)h->avp_value->i64;
- 			break;
- 
-@@ -491,7 +492,7 @@ static int dm_avps2json(void *root, cJSON *avps)
- 			break;
- 
- 		case AVP_TYPE_UNSIGNED64:
--			LM_DBG("%2d. got uint64  AVP %s (%u), value: %lu\n", i, dm_avp.avp_name, h->avp_code, h->avp_value->u64);
-+			LM_DBG("%2d. got uint64  AVP %s (%u), value: %" PRIu64 "\n", i, dm_avp.avp_name, h->avp_code, h->avp_value->u64);
- 			num_val = (double)h->avp_value->u64;
- 			break;
- 
-diff --git a/modules/http2d/server.c b/modules/http2d/server.c
-index 0154e1e85..870728628 100644
---- a/modules/http2d/server.c
-+++ b/modules/http2d/server.c
-@@ -635,7 +635,7 @@ static int on_frame_recv_callback(nghttp2_session *session,
- 	switch (frame->hd.type) {
- 	case NGHTTP2_DATA:
- 	case NGHTTP2_HEADERS:
--		LM_DBG("h2 header [%d], %p %ld\n", frame->hd.type, frame->headers.nva, frame->headers.nvlen);
-+		LM_DBG("h2 header [%d], %p %zu\n", frame->hd.type, frame->headers.nva, frame->headers.nvlen);
- 		/* Check that the client request has finished */
- 		if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
- 			stream_data =

diff --git a/opensips-0009-Fix-pointer-truncation-warning-on-32-bit-architectur.patch b/opensips-0009-Fix-pointer-truncation-warning-on-32-bit-architectur.patch
new file mode 100644
index 0000000..146a802
--- /dev/null
+++ b/opensips-0009-Fix-pointer-truncation-warning-on-32-bit-architectur.patch
@@ -0,0 +1,291 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Peter Lemenkov <lemenkov@gmail.com>
+Date: Fri, 26 Dec 2025 21:08:00 +0100
+Subject: [PATCH] Fix pointer truncation warning on 32-bit architectures in
+ aaa_diameter
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+During compilation on i686 (32-bit) architecture with GCC 15, a pointer
+truncation warning appears:
+
+```
+aaa_diameter.c: In function 'dm_send_answer':
+aaa_diameter.c:423:73: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
+  423 |  dmsg = _dm_create_message(NULL, AAA_CUSTOM_RPL, appid, cmdcode, (void *)fd_req);
+```
+
+The `dm_message` struct stores a pointer to a FreeDiameter message
+structure in the `fd_req` field, but the type is mismatched across
+different code paths:
+
+1. In `aaa_diameter.c`, a pointer is serialized as `uint64_t` (8 bytes)
+2. It's then cast to `void *` and passed to `_dm_create_message()`
+3. On **i686**, `void *` is only 4 bytes, causing **truncation** of the
+   upper 32 bits
+4. In `dm_peer.c`, it's cast back to `struct msg *` for use
+
+**On x86_64 (64-bit):**
+
+- `uint64_t` = 8 bytes
+- `void *` = 8 bytes
+- No truncation, works fine
+
+**On i686 (32-bit):**
+
+- `uint64_t` = 8 bytes
+- `void *` = 4 bytes
+- **Truncation occurs**, losing upper 32 bits of the pointer!
+
+Change `fd_req` from `void *` to `uintptr_t` throughout the codebase.
+
+`uintptr_t` is:
+
+- **Portable**: Sized correctly for pointers on any architecture (4
+  bytes on 32-bit, 8 bytes on 64-bit)
+- **Standard**: Defined in C99 `<stdint.h>`
+- **Semantic**: Explicitly designed for storing pointer values as
+  integers
+- **Safe**: Guaranteed by C99 to preserve pointer values during
+  round-trip conversions
+
+**1. Struct definition (`modules/aaa_diameter/dm_impl.h` line 93):**
+
+```c
+struct dm_message {
+    // Changed from: void *fd_req;
+    uintptr_t fd_req;
+    // ...
+};
+```
+
+**2. Function signature (`modules/aaa_diameter/dm_impl.h` ~line 165):**
+
+```c
+aaa_message *_dm_create_message(aaa_conn *_, int msg_type,
+    unsigned int app_id, unsigned int cmd_code, uintptr_t fd_req);
+    // Changed from: void *fd_req
+```
+
+**3. Function definition (`modules/aaa_diameter/dm_impl.c` line 1695):**
+
+```c
+aaa_message *_dm_create_message(aaa_conn *_, int msg_type,
+    unsigned int app_id, unsigned int cmd_code, uintptr_t fd_msg)
+    // Changed from: void *fd_msg
+```
+
+**4. Call sites - pointer to uintptr_t:**
+
+```c
+// aaa_diameter.c line 423 - remove void* cast:
+dmsg = _dm_create_message(NULL, AAA_CUSTOM_RPL, appid, cmdcode, fd_req);
+
+// dm_impl.c - add explicit casts when storing pointers:
+dm.fd_req = (uintptr_t)req;
+dm->fd_req = (uintptr_t)fd_msg;
+```
+
+**5. Call sites with NULL - use 0 instead:**
+
+Since `uintptr_t` is an integer type (not a pointer type), we use `0`
+instead of `NULL` to represent "no pointer":
+
+```c
+// Multiple locations in aaa_diameter.c, dm_impl.c:
+dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, *app_id, *cmd_code, 0);
+// Changed from: ..., NULL);
+```
+
+**Note:** In C, `NULL` is typically `((void *)0)` - a pointer type. When
+passing to an integer parameter like `uintptr_t`, we use the integer `0`
+directly to avoid implicit pointer-to-integer conversion warnings.
+
+**6. Usage site - uintptr_t to pointer (`dm_peer.c`):**
+
+```c
+// Changed from: struct msg *ans = (struct msg *)dm->fd_req;
+struct msg *ans = (struct msg *)(uintptr_t)dm->fd_req;
+```
+
+The double cast `(struct msg *)(uintptr_t)value` is required by C99 for
+guaranteed correctness:
+
+1. **C99 guarantees** that any pointer can be converted to `uintptr_t` and back
+2. Direct `integer → pointer` conversion is **implementation-defined** behavior
+3. The proper conversion path is: `pointer → uintptr_t → pointer`
+
+While a single cast from `uintptr_t` to pointer often works in practice,
+the double cast explicitly follows the C99 standard's guaranteed
+conversion path, ensuring the code is strictly conformant and won't
+cause issues with strict aliasing rules or future compiler
+optimizations.
+
+The pattern is:
+- **Pointer → uintptr_t**: `(uintptr_t)pointer`
+- **uintptr_t → Pointer**: `(struct msg *)(uintptr_t)value`
+- **Null value**: `0` (not `NULL`, since `uintptr_t` is an integer type)
+
+This fix ensures pointers are correctly preserved on all architectures
+without truncation.
+
+Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
+Assisted-by: Claude (Anthropic) <https://claude.ai>
+
+diff --git a/modules/aaa_diameter/aaa_diameter.c b/modules/aaa_diameter/aaa_diameter.c
+index 410a4cb122..4382af7acd 100644
+--- a/modules/aaa_diameter/aaa_diameter.c
++++ b/modules/aaa_diameter/aaa_diameter.c
+@@ -19,6 +19,7 @@
+  */
+ 
+ #include <freeDiameter/extension.h>
++#include <stdint.h>
+ 
+ #include "../../sr_module.h"
+ #include "../../lib/list.h"
+@@ -308,7 +309,7 @@ static int dm_send_request(struct sip_msg *msg, int *app_id, int *cmd_code,
+ 		goto error;
+ 	}
+ 
+-	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, *app_id, *cmd_code, NULL);
++	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, *app_id, *cmd_code, 0);
+ 	if (!dmsg) {
+ 		LM_ERR("oom\n");
+ 		goto error;
+@@ -421,7 +422,7 @@ static int dm_send_answer(struct sip_msg *msg, str *avp_json, int *is_error)
+ 		reverse_hex2int64(res.rs.s, res.rs.len, 1, &fd_req);
+ 	}
+ 
+-	dmsg = _dm_create_message(NULL, AAA_CUSTOM_RPL, appid, cmdcode, (void *)fd_req);
++	dmsg = _dm_create_message(NULL, AAA_CUSTOM_RPL, appid, cmdcode, fd_req);
+ 	if (!dmsg) {
+ 		LM_ERR("oom\n");
+ 		goto error;
+@@ -581,7 +582,7 @@ static int dm_send_request_async(struct sip_msg *msg, async_ctx *ctx,
+ 		goto error;
+ 	}
+ 
+-	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, *app_id, *cmd_code, NULL);
++	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, *app_id, *cmd_code, 0);
+ 	if (!dmsg) {
+ 		LM_ERR("oom\n");
+ 		goto error;
+diff --git a/modules/aaa_diameter/dm_impl.c b/modules/aaa_diameter/dm_impl.c
+index 1608ec276c..393483fd21 100644
+--- a/modules/aaa_diameter/dm_impl.c
++++ b/modules/aaa_diameter/dm_impl.c
+@@ -21,6 +21,7 @@
+ #include <freeDiameter/extension.h>
+ #include <sys/eventfd.h>
+ #include <inttypes.h>
++#include <stdint.h>
+ 
+ #include "../../ut.h"
+ #include "../../lib/list.h"
+@@ -601,7 +602,7 @@ static int dm_receive_req(struct msg **_req, struct avp * avp, struct session *
+ 
+ 		memset(&dm, 0, sizeof dm);
+ 
+-		dm.fd_req = req;
++		dm.fd_req = (uintptr_t)req;
+ 		dm.app_id = hdr->msg_appl;
+ 		dm.cmd_code = hdr->msg_code;
+ 		dm.error_bit = 1;
+@@ -1754,7 +1755,7 @@ int dm_api_find_cmd(diameter_conn *conn, int cmd_code)
+ }
+ 
+ aaa_message *_dm_create_message(aaa_conn *_, int msg_type,
+-        unsigned int app_id, unsigned int cmd_code, void *fd_msg)
++        unsigned int app_id, unsigned int cmd_code, uintptr_t fd_msg)
+ {
+ 	aaa_message *m;
+ 	struct dm_message *dm;
+@@ -1781,7 +1782,7 @@ aaa_message *_dm_create_message(aaa_conn *_, int msg_type,
+ 	dm->am = m;
+ 	dm->app_id = app_id;
+ 	dm->cmd_code = cmd_code;
+-	dm->fd_req = fd_msg;
++	dm->fd_req = (uintptr_t)fd_msg;
+ 
+ 	return m;
+ }
+@@ -1789,7 +1790,7 @@ aaa_message *_dm_create_message(aaa_conn *_, int msg_type,
+ 
+ aaa_message *dm_create_message(aaa_conn *_, int msg_type)
+ {
+-	return _dm_create_message(_, msg_type, 0, 0, NULL);
++	return _dm_create_message(_, msg_type, 0, 0, 0);
+ }
+ 
+ 
+@@ -2144,7 +2145,7 @@ int dm_api_send_req(diameter_conn *conn, int app_id, int cmd_code, cJSON *req, d
+ 		return -2;
+ 	}
+ 
+-	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, app_id, cmd_code, NULL);
++	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, app_id, cmd_code, 0);
+ 	if (!dmsg) {
+ 		LM_ERR("oom\n");
+ 		return -1;
+@@ -2181,7 +2182,7 @@ int dm_api_send_req_async(diameter_conn *conn, int app_id, int cmd_code, cJSON *
+ 		return -2;
+ 	}
+ 
+-	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, app_id, cmd_code, NULL);
++	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, app_id, cmd_code, 0);
+ 	if (!dmsg) {
+ 		LM_ERR("oom\n");
+ 		return -1;
+diff --git a/modules/aaa_diameter/dm_impl.h b/modules/aaa_diameter/dm_impl.h
+index b25cd77f19..52e3f23da5 100644
+--- a/modules/aaa_diameter/dm_impl.h
++++ b/modules/aaa_diameter/dm_impl.h
+@@ -24,6 +24,7 @@
+ #include "../../aaa/aaa.h"
+ #include "../../mem/shm_mem.h"
+ #include "diameter_api.h"
++#include <stdint.h>
+ 
+ #define __FD_CHECK(__call__, __retok__, __retval__) \
+ 	do { \
+@@ -91,7 +92,7 @@ struct _dm_dict {
+ struct dm_message {
+ 	aaa_message *am; /* back-reference, useful during cleanup */
+ 
+-	void *fd_req;
++	uintptr_t fd_req;
+ 	unsigned int app_id;   /* these two are used when sending */
+ 	unsigned int cmd_code; /* custom Diameter requests */
+ 	int error_bit;
+@@ -182,7 +183,7 @@ int dm_register_callbacks(void);
+ int dm_find(aaa_conn *_, aaa_map *map, int op);
+ aaa_message *dm_create_message(aaa_conn *_, int msg_type);
+ aaa_message *_dm_create_message(aaa_conn *_, int msg_type,
+-        unsigned int app_id, unsigned int cmd_code, void *fd_req);
++        unsigned int app_id, unsigned int cmd_code, uintptr_t fd_req);
+ int dm_avp_add(aaa_conn *_, aaa_message *msg, aaa_map *avp, void *val,
+                int val_length, int vendor);
+ int dm_build_avps(struct list_head *subavps, cJSON *array);
+diff --git a/modules/aaa_diameter/dm_peer.c b/modules/aaa_diameter/dm_peer.c
+index 9dbfd1d6c9..06b17a8845 100644
+--- a/modules/aaa_diameter/dm_peer.c
++++ b/modules/aaa_diameter/dm_peer.c
+@@ -24,6 +24,7 @@
+ #include "../../sr_module.h"
+ #include "../../locking.h"
+ #include "../../lib/list.h"
++#include <stdint.h>
+ 
+ #include "dm_impl.h"
+ #include "dm_peer.h"
+@@ -511,7 +512,7 @@ static int dm_send_custom_req(struct dm_message *msg)
+ 
+ int dm_send_custom_rpl(struct dm_message *dm)
+ {
+-	struct msg *ans = (struct msg *)dm->fd_req;
++	struct msg *ans = (struct msg *)(uintptr_t)dm->fd_req;
+ 	int rc, flags = 0;
+ 
+ 	if (!dm_server_autoreply_error && dm_remove_unreplied_req(ans) != 0) {

diff --git a/opensips-0010-Fix-C90-style-declaration-warnings-in-snmpstats-modu.patch b/opensips-0010-Fix-C90-style-declaration-warnings-in-snmpstats-modu.patch
new file mode 100644
index 0000000..2689e4e
--- /dev/null
+++ b/opensips-0010-Fix-C90-style-declaration-warnings-in-snmpstats-modu.patch
@@ -0,0 +1,381 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Peter Lemenkov <lemenkov@gmail.com>
+Date: Sat, 31 Jan 2026 15:11:20 +0100
+Subject: [PATCH] Fix C90-style declaration warnings in snmpstats module
+
+Build fails with `-Werror=declaration-after-statement` (enforced by
+net-snmp pkg-config) due to variables declared after executable
+statements:
+
+```
+openserObjects.c:619:9: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
+  619 |         int new_threshold = (int)(long)(int *)val;
+
+openserSIPCommonObjects.c:244:17: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
+  244 |                 char *openBracePosition   = strchr(buffer, '(');
+
+openserSIPCommonObjects.c:475:9: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
+  475 |         char *strEntityType = (char *)val;
+
+openserSIPContactTable.c:266:9: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
+  266 |         static char *defaultUser = "DefaultUser";
+
+openserSIPContactTable.c:361:9: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
+  361 |         netsnmp_variable_list *var = request->requestvb;
+```
+
+The net-snmp library's pkg-config adds
+`-Werror=declaration-after-statement` to CFLAGS, enforcing C90-style
+declaration ordering (all declarations before statements).
+
+While OpenSIPS adheres to the C99 standard (which allows mixed
+declarations and code), the net-snmp library could require C90-style
+declarations for modules that link against it. Following this style
+doesn't hurt C99 compatibility and improves code portability.`
+
+Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
+Assisted-by: Claude (Anthropic) <https://claude.ai>
+
+diff --git a/modules/snmpstats/openserObjects.c b/modules/snmpstats/openserObjects.c
+index 180b62dda7..909db4c80b 100644
+--- a/modules/snmpstats/openserObjects.c
++++ b/modules/snmpstats/openserObjects.c
+@@ -605,6 +605,8 @@ int handle_openserDialogLimitMajorAlarm(netsnmp_mib_handler *handler,
+ static int set_if_valid_threshold(modparam_t type, void *val, char *varStr,
+ 	int *newVal)
+ {
++	int new_threshold;
++
+ 	if (val==0) {
+ 		LM_ERR("%s called with a null value!\n", varStr);
+ 		return -1;
+@@ -616,7 +618,7 @@ static int set_if_valid_threshold(modparam_t type, void *val, char *varStr,
+ 		return -1;
+ 	}
+ 
+-	int new_threshold = (int)(long)(int *)val;
++	new_threshold = (int)(long)(int *)val;
+ 
+ 	if (new_threshold < -1) {
+ 		LM_ERR("%s called with an invalid threshold=%d!\n",
+diff --git a/modules/snmpstats/openserSIPCommonObjects.c b/modules/snmpstats/openserSIPCommonObjects.c
+index e37ab6ef2a..f2ddba5a7a 100644
+--- a/modules/snmpstats/openserSIPCommonObjects.c
++++ b/modules/snmpstats/openserSIPCommonObjects.c
+@@ -225,6 +225,8 @@ int handle_openserSIPServiceStartTime(netsnmp_mib_handler *handler,
+ 
+ 	int elapsedTime = 0;
+ 	char buffer[SNMPGET_MAX_BUFFER];
++	char *openBracePosition = NULL;
++	char *closedBracePosition = NULL;
+ 
+ 	FILE *theFile = fopen(SNMPGET_TEMP_FILE, "r");
+ 
+@@ -241,8 +243,8 @@ int handle_openserSIPServiceStartTime(netsnmp_mib_handler *handler,
+ 
+ 		/* Find the positions of '(' and ')' so we can extract out the
+ 		 * timeticks value. */
+-		char *openBracePosition   = strchr(buffer, '(');
+-		char *closedBracePosition = strchr(buffer, ')');
++		openBracePosition   = strchr(buffer, '(');
++		closedBracePosition = strchr(buffer, ')');
+ 
+ 		/* Make sure that both the '(' and ')' exist in the file, and
+ 		 * that '(' occurs earlier than the ')'.  If all these
+@@ -464,6 +466,7 @@ int handle_openserSIPOtherwiseDiscardedMsgs(netsnmp_mib_handler *handler,
+  */
+ int handleSipEntityType( modparam_t type, void* val)
+ {
++	char *strEntityType = NULL;
+ 
+ 	/* By default we start off as "other". */
+ 	static char firstTime = 1;
+@@ -472,7 +475,7 @@ int handleSipEntityType( modparam_t type, void* val)
+ 		return -1;
+ 	}
+ 
+-	char *strEntityType = (char *)val;
++	strEntityType = (char *)val;
+ 
+ 	/* This is our first time through this function, so we need to change
+ 	 * openserEntityType from its default to 0, allowing our bitmasks below
+diff --git a/modules/snmpstats/openserSIPContactTable.c b/modules/snmpstats/openserSIPContactTable.c
+index 7edc1210ce..03588029c8 100644
+--- a/modules/snmpstats/openserSIPContactTable.c
++++ b/modules/snmpstats/openserSIPContactTable.c
+@@ -261,10 +261,10 @@ void deleteContactRow(int userIndex, int contactIndex)
+  */
+ void init_openserSIPContactTable(void)
+ {
+-	initialize_table_openserSIPContactTable();
+-
+ 	static char *defaultUser = "DefaultUser";
+ 
++	initialize_table_openserSIPContactTable();
++
+ 	createContactRow(1, 1, defaultUser, NULL);
+ }
+ 
+@@ -354,14 +354,16 @@ int openserSIPContactTable_get_value(
+ 	char       *retrievedExpiry;
+ 	struct tm  timeValue;
+ 
++	netsnmp_variable_list *var = NULL;
++	openserSIPContactTable_context *context = NULL;
++
+ 	/* First things first, we need to consume the interprocess buffer, in
+ 	 * case something has changed. We want to return the freshest data. */
+ 	consumeInterprocessBuffer();
+ 
+-	netsnmp_variable_list *var = request->requestvb;
++	var = request->requestvb;
+ 
+-	openserSIPContactTable_context *context =
+-		(openserSIPContactTable_context *)item;
++	context = (openserSIPContactTable_context *)item;
+ 
+ 	switch(table_info->colnum)
+ 	{
+diff --git a/modules/snmpstats/openserSIPPortTable.c b/modules/snmpstats/openserSIPPortTable.c
+index a10758273a..3a03b72b21 100644
+--- a/modules/snmpstats/openserSIPPortTable.c
++++ b/modules/snmpstats/openserSIPPortTable.c
+@@ -104,19 +104,17 @@ openserSIPPortTable_context *getRow(int ipType, unsigned int *ipAddress)
+ {
+ 	int lengthOfOID;
+ 	oid *currentOIDIndex = createIndex(ipType, ipAddress, &lengthOfOID);
++	netsnmp_index theIndex;
++	openserSIPPortTable_context *rowToReturn = NULL;
+ 
+ 	if (currentOIDIndex == NULL)
+ 	{
+ 		return NULL;
+ 	}
+ 
+-	netsnmp_index theIndex;
+-
+ 	theIndex.oids = currentOIDIndex;
+ 	theIndex.len  = lengthOfOID;
+ 
+-	openserSIPPortTable_context *rowToReturn;
+-
+ 	/* Lets check to see if there is an existing row. */
+ 	rowToReturn = CONTAINER_FIND(cb.container, &theIndex);
+ 
+@@ -218,8 +216,6 @@ void init_openserSIPPortTable(void)
+ {
+ 	int curSNMPIndex = 0;
+ 
+-	initialize_table_openserSIPPortTable();
+-
+ 	unsigned int *UDPList = NULL;
+ 	unsigned int *TCPList = NULL;
+ 	unsigned int *TLSList = NULL;
+@@ -228,6 +224,8 @@ void init_openserSIPPortTable(void)
+ 	int numTCPSockets;
+ 	int numTLSSockets;
+ 
++	initialize_table_openserSIPPortTable();
++
+ 	/* Retrieve the list of the number of UDP and TCP sockets. */
+ 	numUDPSockets = get_socket_list_from_proto(&UDPList, PROTO_UDP);
+ 	numTCPSockets = get_socket_list_from_proto(&TCPList, PROTO_TCP);
+diff --git a/modules/snmpstats/openserSIPRegUserLookupTable.c b/modules/snmpstats/openserSIPRegUserLookupTable.c
+index 324df618fd..a54b583752 100644
+--- a/modules/snmpstats/openserSIPRegUserLookupTable.c
++++ b/modules/snmpstats/openserSIPRegUserLookupTable.c
+@@ -514,23 +514,20 @@ void openserSIPRegUserLookupTable_set_reserve2( netsnmp_request_group *rg )
+  */
+ void openserSIPRegUserLookupTable_set_action( netsnmp_request_group *rg )
+ {
+-	/* First things first, we need to consume the interprocess buffer, in
+-	 * case something has changed. We want to return the freshest data. */
+-	consumeInterprocessBuffer();
+-
+ 	aorToIndexStruct_t *hashRecord;
+-
+ 	netsnmp_variable_list *var;
++	netsnmp_request_group_item *current;
++	int row_err = 0;
++	openserSIPRegUserLookupTable_context *row_ctx = NULL;
++	openserSIPRegUserLookupTable_context *undo_ctx = NULL;
+ 
+-	openserSIPRegUserLookupTable_context *row_ctx =
+-		(openserSIPRegUserLookupTable_context *)rg->existing_row;
+-
+-	openserSIPRegUserLookupTable_context *undo_ctx =
+-		(openserSIPRegUserLookupTable_context *)rg->undo_info;
++	/* First things first, we need to consume the interprocess buffer, in
++	 * case something has changed. We want to return the freshest data. */
++	consumeInterprocessBuffer();
+ 
+-	netsnmp_request_group_item *current;
++	row_ctx = (openserSIPRegUserLookupTable_context *)rg->existing_row;
+ 
+-	int			row_err = 0;
++	undo_ctx = (openserSIPRegUserLookupTable_context *)rg->undo_info;
+ 
+ 	/* Copy the actual data to the row. */
+ 	for( current = rg->list; current; current = current->next ) {
+diff --git a/modules/snmpstats/openserSIPRegUserTable.c b/modules/snmpstats/openserSIPRegUserTable.c
+index 43b14cdeb7..9cf029df9d 100644
+--- a/modules/snmpstats/openserSIPRegUserTable.c
++++ b/modules/snmpstats/openserSIPRegUserTable.c
+@@ -225,15 +225,14 @@ void updateUser(char *userName)
+  * Returns: The rows userIndex on success, and 0 otherwise. */
+ int createRegUserRow(char *stringToRegister)
+ {
+-	int static index = 0;
+-
+-	index++;
+-
+ 	openserSIPRegUserTable_context *theRow;
+-
+ 	oid  *OIDIndex;
+ 	int  stringLength;
+ 
++	int static index = 0;
++
++	index++;
++
+ 	theRow = SNMP_MALLOC_TYPEDEF(openserSIPRegUserTable_context);
+ 
+ 	if (theRow == NULL) {
+@@ -280,12 +279,12 @@ int createRegUserRow(char *stringToRegister)
+ /* Initializes the openserSIPRegUserTable module.  */
+ void init_openserSIPRegUserTable(void)
+ {
+-	/* Register this table with the master agent */
+-	initialize_table_openserSIPRegUserTable();
+-
+ 	/* We need to create a default row, so create DefaultUser */
+ 	static char *defaultUser = "DefaultUser";
+ 
++	/* Register this table with the master agent */
++	initialize_table_openserSIPRegUserTable();
++
+ 	createRegUserRow(defaultUser);
+ }
+ 
+@@ -350,14 +349,16 @@ int openserSIPRegUserTable_get_value(
+ 		netsnmp_index *item,
+ 		netsnmp_table_request_info *table_info )
+ {
++	netsnmp_variable_list *var = NULL;
++	openserSIPRegUserTable_context *context = NULL;
++
+ 	/* First things first, we need to consume the interprocess buffer, in
+ 	 * case something has changed. We want to return the freshest data. */
+ 	consumeInterprocessBuffer();
+ 
+-	netsnmp_variable_list *var = request->requestvb;
++	var = request->requestvb;
+ 
+-	openserSIPRegUserTable_context *context =
+-		(openserSIPRegUserTable_context *)item;
++	context = (openserSIPRegUserTable_context *)item;
+ 
+ 	switch(table_info->colnum)
+ 	{
+diff --git a/modules/snmpstats/openserSIPStatusCodesTable.c b/modules/snmpstats/openserSIPStatusCodesTable.c
+index 2b396c6985..79f3a129a3 100644
+--- a/modules/snmpstats/openserSIPStatusCodesTable.c
++++ b/modules/snmpstats/openserSIPStatusCodesTable.c
+@@ -310,6 +310,7 @@ int openserSIPStatusCodesTable_can_delete(
+ openserSIPStatusCodesTable_context *
+ openserSIPStatusCodesTable_create_row( netsnmp_index* hdr)
+ {
++	int codeIndex;
+ 	stat_var *in_status_code;
+ 	stat_var *out_status_code;
+ 
+@@ -337,7 +338,7 @@ openserSIPStatusCodesTable_create_row( netsnmp_index* hdr)
+ 	/* Retrieve the index for the status code, and then assign the starting
+ 	 * values.  The starting values will be used to calculate deltas during
+ 	 * the next snmpget/snmpwalk/snmptable/etc. */
+-	int codeIndex = ctx->openserSIPStatusCodeValue;
++	codeIndex = ctx->openserSIPStatusCodeValue;
+ 
+ 	ctx->startingInStatusCodeValue  = 0;
+ 	ctx->startingOutStatusCodeValue = 0;
+diff --git a/modules/snmpstats/snmpstats.c b/modules/snmpstats/snmpstats.c
+index 95bc1c1f3b..575c0d1068 100644
+--- a/modules/snmpstats/snmpstats.c
++++ b/modules/snmpstats/snmpstats.c
+@@ -346,7 +346,12 @@ static void sigchld_handler(int signal)
+  */
+ static int spawn_sysUpTime_child(void)
+ {
++	pid_t result_pid;
++	int snmpget_fd;
++	int local_path_to_snmpget_length;
++	int snmpget_binary_name_length;
+ 	struct sigaction new_sigchld_handler;
++	char *args[6];
+ 
+ 	char *local_path_to_snmpget = "/usr/bin/";
+ 	char *snmpget_binary_name   = "/snmpget";
+@@ -362,7 +367,7 @@ static int spawn_sysUpTime_child(void)
+ 	new_sigchld_handler.sa_handler = sigchld_handler;
+ 	sigaction(SIGCHLD, &new_sigchld_handler, &old_sigchld_handler);
+ 
+-	pid_t result_pid = fork();
++	result_pid = fork();
+ 
+ 	if (result_pid < 0) {
+ 		LM_ERR("failed to not spawn an agent to check sysUpTime\n");
+@@ -380,7 +385,7 @@ static int spawn_sysUpTime_child(void)
+ 
+ 	/* If we are here, then we are the child process.  Lets set up the file
+ 	 * descriptors so we can capture the output of snmpget. */
+-	int snmpget_fd =
++	snmpget_fd =
+ 		open(SNMPGET_TEMP_FILE, O_CREAT|O_TRUNC|O_RDWR,
+ 				S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
+ 
+@@ -401,8 +406,12 @@ static int spawn_sysUpTime_child(void)
+ 				"  Defaulting to %s\n",	snmp_community_string);
+ 	}
+ 
+-	char *args[] = {"-Ov", "-c",  snmp_community_string, "localhost",
+-		SYSUPTIME_OID, (char *) 0};
++	args[0] = "-Ov";
++	args[1] = "-c";
++	args[2] = snmp_community_string;
++	args[3] = "localhost";
++	args[4] = SYSUPTIME_OID;
++	args[5] = (char *)0;
+ 
+ 	/* Make sure we have a path to snmpget, so we can retrieve the
+ 	 * sysUpTime. */
+@@ -416,8 +425,8 @@ static int spawn_sysUpTime_child(void)
+ 		local_path_to_snmpget = snmpget_path;
+ 	}
+ 
+-	int local_path_to_snmpget_length = strlen(local_path_to_snmpget);
+-	int snmpget_binary_name_length   = strlen(snmpget_binary_name);
++	local_path_to_snmpget_length = strlen(local_path_to_snmpget);
++	snmpget_binary_name_length   = strlen(snmpget_binary_name);
+ 
+ 	/* Allocate enough memory to hold the path, the binary name, and the
+ 	 * null character.  We don't use pkg_memory here. */
+diff --git a/modules/snmpstats/utilities.c b/modules/snmpstats/utilities.c
+index dfc0978b74..2f7ed9a307 100644
+--- a/modules/snmpstats/utilities.c
++++ b/modules/snmpstats/utilities.c
+@@ -72,13 +72,13 @@ int stringHandlerSanityCheck( modparam_t type, void *val, char *parameterName)
+ int get_statistic(char *statName)
+ {
+ 	int result = 0;
+-
++	stat_var *theVar = NULL;
+ 	str theStr;
+ 
+ 	theStr.s   = statName;
+ 	theStr.len = strlen(statName);
+ 
+-	stat_var *theVar = get_stat(&theStr);
++	theVar = get_stat(&theStr);
+ 
+ 	if (theVar==0) {
+ 		LM_INFO("failed to retrieve statistics for %s\n", statName);

diff --git a/opensips-0010-Fix-pointer-truncation-warning-on-32-bit-architectur.patch b/opensips-0010-Fix-pointer-truncation-warning-on-32-bit-architectur.patch
deleted file mode 100644
index d9b0da5..0000000
--- a/opensips-0010-Fix-pointer-truncation-warning-on-32-bit-architectur.patch
+++ /dev/null
@@ -1,291 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Peter Lemenkov <lemenkov@gmail.com>
-Date: Fri, 26 Dec 2025 21:08:00 +0100
-Subject: [PATCH] Fix pointer truncation warning on 32-bit architectures in
- aaa_diameter
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-During compilation on i686 (32-bit) architecture with GCC 15, a pointer
-truncation warning appears:
-
-```
-aaa_diameter.c: In function 'dm_send_answer':
-aaa_diameter.c:423:73: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
-  423 |  dmsg = _dm_create_message(NULL, AAA_CUSTOM_RPL, appid, cmdcode, (void *)fd_req);
-```
-
-The `dm_message` struct stores a pointer to a FreeDiameter message
-structure in the `fd_req` field, but the type is mismatched across
-different code paths:
-
-1. In `aaa_diameter.c`, a pointer is serialized as `uint64_t` (8 bytes)
-2. It's then cast to `void *` and passed to `_dm_create_message()`
-3. On **i686**, `void *` is only 4 bytes, causing **truncation** of the
-   upper 32 bits
-4. In `dm_peer.c`, it's cast back to `struct msg *` for use
-
-**On x86_64 (64-bit):**
-
-- `uint64_t` = 8 bytes
-- `void *` = 8 bytes
-- No truncation, works fine
-
-**On i686 (32-bit):**
-
-- `uint64_t` = 8 bytes
-- `void *` = 4 bytes
-- **Truncation occurs**, losing upper 32 bits of the pointer!
-
-Change `fd_req` from `void *` to `uintptr_t` throughout the codebase.
-
-`uintptr_t` is:
-
-- **Portable**: Sized correctly for pointers on any architecture (4
-  bytes on 32-bit, 8 bytes on 64-bit)
-- **Standard**: Defined in C99 `<stdint.h>`
-- **Semantic**: Explicitly designed for storing pointer values as
-  integers
-- **Safe**: Guaranteed by C99 to preserve pointer values during
-  round-trip conversions
-
-**1. Struct definition (`modules/aaa_diameter/dm_impl.h` line 93):**
-
-```c
-struct dm_message {
-    // Changed from: void *fd_req;
-    uintptr_t fd_req;
-    // ...
-};
-```
-
-**2. Function signature (`modules/aaa_diameter/dm_impl.h` ~line 165):**
-
-```c
-aaa_message *_dm_create_message(aaa_conn *_, int msg_type,
-    unsigned int app_id, unsigned int cmd_code, uintptr_t fd_req);
-    // Changed from: void *fd_req
-```
-
-**3. Function definition (`modules/aaa_diameter/dm_impl.c` line 1695):**
-
-```c
-aaa_message *_dm_create_message(aaa_conn *_, int msg_type,
-    unsigned int app_id, unsigned int cmd_code, uintptr_t fd_msg)
-    // Changed from: void *fd_msg
-```
-
-**4. Call sites - pointer to uintptr_t:**
-
-```c
-// aaa_diameter.c line 423 - remove void* cast:
-dmsg = _dm_create_message(NULL, AAA_CUSTOM_RPL, appid, cmdcode, fd_req);
-
-// dm_impl.c - add explicit casts when storing pointers:
-dm.fd_req = (uintptr_t)req;
-dm->fd_req = (uintptr_t)fd_msg;
-```
-
-**5. Call sites with NULL - use 0 instead:**
-
-Since `uintptr_t` is an integer type (not a pointer type), we use `0`
-instead of `NULL` to represent "no pointer":
-
-```c
-// Multiple locations in aaa_diameter.c, dm_impl.c:
-dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, *app_id, *cmd_code, 0);
-// Changed from: ..., NULL);
-```
-
-**Note:** In C, `NULL` is typically `((void *)0)` - a pointer type. When
-passing to an integer parameter like `uintptr_t`, we use the integer `0`
-directly to avoid implicit pointer-to-integer conversion warnings.
-
-**6. Usage site - uintptr_t to pointer (`dm_peer.c`):**
-
-```c
-// Changed from: struct msg *ans = (struct msg *)dm->fd_req;
-struct msg *ans = (struct msg *)(uintptr_t)dm->fd_req;
-```
-
-The double cast `(struct msg *)(uintptr_t)value` is required by C99 for
-guaranteed correctness:
-
-1. **C99 guarantees** that any pointer can be converted to `uintptr_t` and back
-2. Direct `integer → pointer` conversion is **implementation-defined** behavior
-3. The proper conversion path is: `pointer → uintptr_t → pointer`
-
-While a single cast from `uintptr_t` to pointer often works in practice,
-the double cast explicitly follows the C99 standard's guaranteed
-conversion path, ensuring the code is strictly conformant and won't
-cause issues with strict aliasing rules or future compiler
-optimizations.
-
-The pattern is:
-- **Pointer → uintptr_t**: `(uintptr_t)pointer`
-- **uintptr_t → Pointer**: `(struct msg *)(uintptr_t)value`
-- **Null value**: `0` (not `NULL`, since `uintptr_t` is an integer type)
-
-This fix ensures pointers are correctly preserved on all architectures
-without truncation.
-
-Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
-Assisted-by: Claude (Anthropic) <https://claude.ai>
-
-diff --git a/modules/aaa_diameter/aaa_diameter.c b/modules/aaa_diameter/aaa_diameter.c
-index ca0709c57..0d6bfdd70 100644
---- a/modules/aaa_diameter/aaa_diameter.c
-+++ b/modules/aaa_diameter/aaa_diameter.c
-@@ -19,6 +19,7 @@
-  */
- 
- #include <freeDiameter/extension.h>
-+#include <stdint.h>
- 
- #include "../../sr_module.h"
- #include "../../lib/list.h"
-@@ -308,7 +309,7 @@ static int dm_send_request(struct sip_msg *msg, int *app_id, int *cmd_code,
- 		goto error;
- 	}
- 
--	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, *app_id, *cmd_code, NULL);
-+	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, *app_id, *cmd_code, 0);
- 	if (!dmsg) {
- 		LM_ERR("oom\n");
- 		goto error;
-@@ -421,7 +422,7 @@ static int dm_send_answer(struct sip_msg *msg, str *avp_json, int *is_error)
- 		reverse_hex2int64(res.rs.s, res.rs.len, 1, &fd_req);
- 	}
- 
--	dmsg = _dm_create_message(NULL, AAA_CUSTOM_RPL, appid, cmdcode, (void *)fd_req);
-+	dmsg = _dm_create_message(NULL, AAA_CUSTOM_RPL, appid, cmdcode, fd_req);
- 	if (!dmsg) {
- 		LM_ERR("oom\n");
- 		goto error;
-@@ -572,7 +573,7 @@ static int dm_send_request_async(struct sip_msg *msg, async_ctx *ctx,
- 		goto error;
- 	}
- 
--	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, *app_id, *cmd_code, NULL);
-+	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, *app_id, *cmd_code, 0);
- 	if (!dmsg) {
- 		LM_ERR("oom\n");
- 		goto error;
-diff --git a/modules/aaa_diameter/dm_impl.c b/modules/aaa_diameter/dm_impl.c
-index 927261899..012072376 100644
---- a/modules/aaa_diameter/dm_impl.c
-+++ b/modules/aaa_diameter/dm_impl.c
-@@ -21,6 +21,7 @@
- #include <freeDiameter/extension.h>
- #include <sys/eventfd.h>
- #include <inttypes.h>
-+#include <stdint.h>
- 
- #include "../../ut.h"
- #include "../../lib/list.h"
-@@ -592,7 +593,7 @@ static int dm_receive_req(struct msg **_req, struct avp * avp, struct session *
- 
- 		memset(&dm, 0, sizeof dm);
- 
--		dm.fd_req = req;
-+		dm.fd_req = (uintptr_t)req;
- 		dm.app_id = hdr->msg_appl;
- 		dm.cmd_code = hdr->msg_code;
- 		dm.error_bit = 1;
-@@ -1694,7 +1695,7 @@ int dm_api_find_cmd(diameter_conn *conn, int cmd_code)
- }
- 
- aaa_message *_dm_create_message(aaa_conn *_, int msg_type,
--        unsigned int app_id, unsigned int cmd_code, void *fd_msg)
-+        unsigned int app_id, unsigned int cmd_code, uintptr_t fd_msg)
- {
- 	aaa_message *m;
- 	struct dm_message *dm;
-@@ -1721,7 +1722,7 @@ aaa_message *_dm_create_message(aaa_conn *_, int msg_type,
- 	dm->am = m;
- 	dm->app_id = app_id;
- 	dm->cmd_code = cmd_code;
--	dm->fd_req = fd_msg;
-+	dm->fd_req = (uintptr_t)fd_msg;
- 
- 	return m;
- }
-@@ -1729,7 +1730,7 @@ aaa_message *_dm_create_message(aaa_conn *_, int msg_type,
- 
- aaa_message *dm_create_message(aaa_conn *_, int msg_type)
- {
--	return _dm_create_message(_, msg_type, 0, 0, NULL);
-+	return _dm_create_message(_, msg_type, 0, 0, 0);
- }
- 
- 
-@@ -2082,7 +2083,7 @@ int dm_api_send_req(diameter_conn *conn, int app_id, int cmd_code, cJSON *req, d
- 		return -2;
- 	}
- 
--	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, app_id, cmd_code, NULL);
-+	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, app_id, cmd_code, 0);
- 	if (!dmsg) {
- 		LM_ERR("oom\n");
- 		return -1;
-@@ -2119,7 +2120,7 @@ int dm_api_send_req_async(diameter_conn *conn, int app_id, int cmd_code, cJSON *
- 		return -2;
- 	}
- 
--	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, app_id, cmd_code, NULL);
-+	dmsg = _dm_create_message(NULL, AAA_CUSTOM_REQ, app_id, cmd_code, 0);
- 	if (!dmsg) {
- 		LM_ERR("oom\n");
- 		return -1;
-diff --git a/modules/aaa_diameter/dm_impl.h b/modules/aaa_diameter/dm_impl.h
-index 2de25d5fa..6367dfa5d 100644
---- a/modules/aaa_diameter/dm_impl.h
-+++ b/modules/aaa_diameter/dm_impl.h
-@@ -23,6 +23,7 @@
- 
- #include "../../aaa/aaa.h"
- #include "diameter_api.h"
-+#include <stdint.h>
- 
- #define __FD_CHECK(__call__, __retok__, __retval__) \
- 	do { \
-@@ -90,7 +91,7 @@ struct _dm_dict {
- struct dm_message {
- 	aaa_message *am; /* back-reference, useful during cleanup */
- 
--	void *fd_req;
-+	uintptr_t fd_req;
- 	unsigned int app_id;   /* these two are used when sending */
- 	unsigned int cmd_code; /* custom Diameter requests */
- 	int error_bit;
-@@ -163,7 +164,7 @@ int dm_register_callbacks(void);
- int dm_find(aaa_conn *_, aaa_map *map, int op);
- aaa_message *dm_create_message(aaa_conn *_, int msg_type);
- aaa_message *_dm_create_message(aaa_conn *_, int msg_type,
--        unsigned int app_id, unsigned int cmd_code, void *fd_req);
-+        unsigned int app_id, unsigned int cmd_code, uintptr_t fd_req);
- int dm_avp_add(aaa_conn *_, aaa_message *msg, aaa_map *avp, void *val,
-                int val_length, int vendor);
- int dm_build_avps(struct list_head *subavps, cJSON *array);
-diff --git a/modules/aaa_diameter/dm_peer.c b/modules/aaa_diameter/dm_peer.c
-index 9dbfd1d6c..06b17a884 100644
---- a/modules/aaa_diameter/dm_peer.c
-+++ b/modules/aaa_diameter/dm_peer.c
-@@ -24,6 +24,7 @@
- #include "../../sr_module.h"
- #include "../../locking.h"
- #include "../../lib/list.h"
-+#include <stdint.h>
- 
- #include "dm_impl.h"
- #include "dm_peer.h"
-@@ -511,7 +512,7 @@ static int dm_send_custom_req(struct dm_message *msg)
- 
- int dm_send_custom_rpl(struct dm_message *dm)
- {
--	struct msg *ans = (struct msg *)dm->fd_req;
-+	struct msg *ans = (struct msg *)(uintptr_t)dm->fd_req;
- 	int rc, flags = 0;
- 
- 	if (!dm_server_autoreply_error && dm_remove_unreplied_req(ans) != 0) {

diff --git a/opensips-0011-Fix-C90-style-declaration-warnings-in-snmpstats-modu.patch b/opensips-0011-Fix-C90-style-declaration-warnings-in-snmpstats-modu.patch
deleted file mode 100644
index e6047a6..0000000
--- a/opensips-0011-Fix-C90-style-declaration-warnings-in-snmpstats-modu.patch
+++ /dev/null
@@ -1,381 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Peter Lemenkov <lemenkov@gmail.com>
-Date: Sat, 31 Jan 2026 15:11:20 +0100
-Subject: [PATCH] Fix C90-style declaration warnings in snmpstats module
-
-Build fails with `-Werror=declaration-after-statement` (enforced by
-net-snmp pkg-config) due to variables declared after executable
-statements:
-
-```
-openserObjects.c:619:9: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
-  619 |         int new_threshold = (int)(long)(int *)val;
-
-openserSIPCommonObjects.c:244:17: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
-  244 |                 char *openBracePosition   = strchr(buffer, '(');
-
-openserSIPCommonObjects.c:475:9: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
-  475 |         char *strEntityType = (char *)val;
-
-openserSIPContactTable.c:266:9: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
-  266 |         static char *defaultUser = "DefaultUser";
-
-openserSIPContactTable.c:361:9: error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]
-  361 |         netsnmp_variable_list *var = request->requestvb;
-```
-
-The net-snmp library's pkg-config adds
-`-Werror=declaration-after-statement` to CFLAGS, enforcing C90-style
-declaration ordering (all declarations before statements).
-
-While OpenSIPS adheres to the C99 standard (which allows mixed
-declarations and code), the net-snmp library could require C90-style
-declarations for modules that link against it. Following this style
-doesn't hurt C99 compatibility and improves code portability.`
-
-Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
-Assisted-by: Claude (Anthropic) <https://claude.ai>
-
-diff --git a/modules/snmpstats/openserObjects.c b/modules/snmpstats/openserObjects.c
-index 180b62dda..909db4c80 100644
---- a/modules/snmpstats/openserObjects.c
-+++ b/modules/snmpstats/openserObjects.c
-@@ -605,6 +605,8 @@ int handle_openserDialogLimitMajorAlarm(netsnmp_mib_handler *handler,
- static int set_if_valid_threshold(modparam_t type, void *val, char *varStr,
- 	int *newVal)
- {
-+	int new_threshold;
-+
- 	if (val==0) {
- 		LM_ERR("%s called with a null value!\n", varStr);
- 		return -1;
-@@ -616,7 +618,7 @@ static int set_if_valid_threshold(modparam_t type, void *val, char *varStr,
- 		return -1;
- 	}
- 
--	int new_threshold = (int)(long)(int *)val;
-+	new_threshold = (int)(long)(int *)val;
- 
- 	if (new_threshold < -1) {
- 		LM_ERR("%s called with an invalid threshold=%d!\n",
-diff --git a/modules/snmpstats/openserSIPCommonObjects.c b/modules/snmpstats/openserSIPCommonObjects.c
-index e37ab6ef2..f2ddba5a7 100644
---- a/modules/snmpstats/openserSIPCommonObjects.c
-+++ b/modules/snmpstats/openserSIPCommonObjects.c
-@@ -225,6 +225,8 @@ int handle_openserSIPServiceStartTime(netsnmp_mib_handler *handler,
- 
- 	int elapsedTime = 0;
- 	char buffer[SNMPGET_MAX_BUFFER];
-+	char *openBracePosition = NULL;
-+	char *closedBracePosition = NULL;
- 
- 	FILE *theFile = fopen(SNMPGET_TEMP_FILE, "r");
- 
-@@ -241,8 +243,8 @@ int handle_openserSIPServiceStartTime(netsnmp_mib_handler *handler,
- 
- 		/* Find the positions of '(' and ')' so we can extract out the
- 		 * timeticks value. */
--		char *openBracePosition   = strchr(buffer, '(');
--		char *closedBracePosition = strchr(buffer, ')');
-+		openBracePosition   = strchr(buffer, '(');
-+		closedBracePosition = strchr(buffer, ')');
- 
- 		/* Make sure that both the '(' and ')' exist in the file, and
- 		 * that '(' occurs earlier than the ')'.  If all these
-@@ -464,6 +466,7 @@ int handle_openserSIPOtherwiseDiscardedMsgs(netsnmp_mib_handler *handler,
-  */
- int handleSipEntityType( modparam_t type, void* val)
- {
-+	char *strEntityType = NULL;
- 
- 	/* By default we start off as "other". */
- 	static char firstTime = 1;
-@@ -472,7 +475,7 @@ int handleSipEntityType( modparam_t type, void* val)
- 		return -1;
- 	}
- 
--	char *strEntityType = (char *)val;
-+	strEntityType = (char *)val;
- 
- 	/* This is our first time through this function, so we need to change
- 	 * openserEntityType from its default to 0, allowing our bitmasks below
-diff --git a/modules/snmpstats/openserSIPContactTable.c b/modules/snmpstats/openserSIPContactTable.c
-index 7edc1210c..03588029c 100644
---- a/modules/snmpstats/openserSIPContactTable.c
-+++ b/modules/snmpstats/openserSIPContactTable.c
-@@ -261,10 +261,10 @@ void deleteContactRow(int userIndex, int contactIndex)
-  */
- void init_openserSIPContactTable(void)
- {
--	initialize_table_openserSIPContactTable();
--
- 	static char *defaultUser = "DefaultUser";
- 
-+	initialize_table_openserSIPContactTable();
-+
- 	createContactRow(1, 1, defaultUser, NULL);
- }
- 
-@@ -354,14 +354,16 @@ int openserSIPContactTable_get_value(
- 	char       *retrievedExpiry;
- 	struct tm  timeValue;
- 
-+	netsnmp_variable_list *var = NULL;
-+	openserSIPContactTable_context *context = NULL;
-+
- 	/* First things first, we need to consume the interprocess buffer, in
- 	 * case something has changed. We want to return the freshest data. */
- 	consumeInterprocessBuffer();
- 
--	netsnmp_variable_list *var = request->requestvb;
-+	var = request->requestvb;
- 
--	openserSIPContactTable_context *context =
--		(openserSIPContactTable_context *)item;
-+	context = (openserSIPContactTable_context *)item;
- 
- 	switch(table_info->colnum)
- 	{
-diff --git a/modules/snmpstats/openserSIPPortTable.c b/modules/snmpstats/openserSIPPortTable.c
-index a10758273..3a03b72b2 100644
---- a/modules/snmpstats/openserSIPPortTable.c
-+++ b/modules/snmpstats/openserSIPPortTable.c
-@@ -104,19 +104,17 @@ openserSIPPortTable_context *getRow(int ipType, unsigned int *ipAddress)
- {
- 	int lengthOfOID;
- 	oid *currentOIDIndex = createIndex(ipType, ipAddress, &lengthOfOID);
-+	netsnmp_index theIndex;
-+	openserSIPPortTable_context *rowToReturn = NULL;
- 
- 	if (currentOIDIndex == NULL)
- 	{
- 		return NULL;
- 	}
- 
--	netsnmp_index theIndex;
--
- 	theIndex.oids = currentOIDIndex;
- 	theIndex.len  = lengthOfOID;
- 
--	openserSIPPortTable_context *rowToReturn;
--
- 	/* Lets check to see if there is an existing row. */
- 	rowToReturn = CONTAINER_FIND(cb.container, &theIndex);
- 
-@@ -218,8 +216,6 @@ void init_openserSIPPortTable(void)
- {
- 	int curSNMPIndex = 0;
- 
--	initialize_table_openserSIPPortTable();
--
- 	unsigned int *UDPList = NULL;
- 	unsigned int *TCPList = NULL;
- 	unsigned int *TLSList = NULL;
-@@ -228,6 +224,8 @@ void init_openserSIPPortTable(void)
- 	int numTCPSockets;
- 	int numTLSSockets;
- 
-+	initialize_table_openserSIPPortTable();
-+
- 	/* Retrieve the list of the number of UDP and TCP sockets. */
- 	numUDPSockets = get_socket_list_from_proto(&UDPList, PROTO_UDP);
- 	numTCPSockets = get_socket_list_from_proto(&TCPList, PROTO_TCP);
-diff --git a/modules/snmpstats/openserSIPRegUserLookupTable.c b/modules/snmpstats/openserSIPRegUserLookupTable.c
-index 324df618f..a54b58375 100644
---- a/modules/snmpstats/openserSIPRegUserLookupTable.c
-+++ b/modules/snmpstats/openserSIPRegUserLookupTable.c
-@@ -514,23 +514,20 @@ void openserSIPRegUserLookupTable_set_reserve2( netsnmp_request_group *rg )
-  */
- void openserSIPRegUserLookupTable_set_action( netsnmp_request_group *rg )
- {
--	/* First things first, we need to consume the interprocess buffer, in
--	 * case something has changed. We want to return the freshest data. */
--	consumeInterprocessBuffer();
--
- 	aorToIndexStruct_t *hashRecord;
--
- 	netsnmp_variable_list *var;
-+	netsnmp_request_group_item *current;
-+	int row_err = 0;
-+	openserSIPRegUserLookupTable_context *row_ctx = NULL;
-+	openserSIPRegUserLookupTable_context *undo_ctx = NULL;
- 
--	openserSIPRegUserLookupTable_context *row_ctx =
--		(openserSIPRegUserLookupTable_context *)rg->existing_row;
--
--	openserSIPRegUserLookupTable_context *undo_ctx =
--		(openserSIPRegUserLookupTable_context *)rg->undo_info;
-+	/* First things first, we need to consume the interprocess buffer, in
-+	 * case something has changed. We want to return the freshest data. */
-+	consumeInterprocessBuffer();
- 
--	netsnmp_request_group_item *current;
-+	row_ctx = (openserSIPRegUserLookupTable_context *)rg->existing_row;
- 
--	int			row_err = 0;
-+	undo_ctx = (openserSIPRegUserLookupTable_context *)rg->undo_info;
- 
- 	/* Copy the actual data to the row. */
- 	for( current = rg->list; current; current = current->next ) {
-diff --git a/modules/snmpstats/openserSIPRegUserTable.c b/modules/snmpstats/openserSIPRegUserTable.c
-index 43b14cdeb..9cf029df9 100644
---- a/modules/snmpstats/openserSIPRegUserTable.c
-+++ b/modules/snmpstats/openserSIPRegUserTable.c
-@@ -225,15 +225,14 @@ void updateUser(char *userName)
-  * Returns: The rows userIndex on success, and 0 otherwise. */
- int createRegUserRow(char *stringToRegister)
- {
--	int static index = 0;
--
--	index++;
--
- 	openserSIPRegUserTable_context *theRow;
--
- 	oid  *OIDIndex;
- 	int  stringLength;
- 
-+	int static index = 0;
-+
-+	index++;
-+
- 	theRow = SNMP_MALLOC_TYPEDEF(openserSIPRegUserTable_context);
- 
- 	if (theRow == NULL) {
-@@ -280,12 +279,12 @@ int createRegUserRow(char *stringToRegister)
- /* Initializes the openserSIPRegUserTable module.  */
- void init_openserSIPRegUserTable(void)
- {
--	/* Register this table with the master agent */
--	initialize_table_openserSIPRegUserTable();
--
- 	/* We need to create a default row, so create DefaultUser */
- 	static char *defaultUser = "DefaultUser";
- 
-+	/* Register this table with the master agent */
-+	initialize_table_openserSIPRegUserTable();
-+
- 	createRegUserRow(defaultUser);
- }
- 
-@@ -350,14 +349,16 @@ int openserSIPRegUserTable_get_value(
- 		netsnmp_index *item,
- 		netsnmp_table_request_info *table_info )
- {
-+	netsnmp_variable_list *var = NULL;
-+	openserSIPRegUserTable_context *context = NULL;
-+
- 	/* First things first, we need to consume the interprocess buffer, in
- 	 * case something has changed. We want to return the freshest data. */
- 	consumeInterprocessBuffer();
- 
--	netsnmp_variable_list *var = request->requestvb;
-+	var = request->requestvb;
- 
--	openserSIPRegUserTable_context *context =
--		(openserSIPRegUserTable_context *)item;
-+	context = (openserSIPRegUserTable_context *)item;
- 
- 	switch(table_info->colnum)
- 	{
-diff --git a/modules/snmpstats/openserSIPStatusCodesTable.c b/modules/snmpstats/openserSIPStatusCodesTable.c
-index 2b396c698..79f3a129a 100644
---- a/modules/snmpstats/openserSIPStatusCodesTable.c
-+++ b/modules/snmpstats/openserSIPStatusCodesTable.c
-@@ -310,6 +310,7 @@ int openserSIPStatusCodesTable_can_delete(
- openserSIPStatusCodesTable_context *
- openserSIPStatusCodesTable_create_row( netsnmp_index* hdr)
- {
-+	int codeIndex;
- 	stat_var *in_status_code;
- 	stat_var *out_status_code;
- 
-@@ -337,7 +338,7 @@ openserSIPStatusCodesTable_create_row( netsnmp_index* hdr)
- 	/* Retrieve the index for the status code, and then assign the starting
- 	 * values.  The starting values will be used to calculate deltas during
- 	 * the next snmpget/snmpwalk/snmptable/etc. */
--	int codeIndex = ctx->openserSIPStatusCodeValue;
-+	codeIndex = ctx->openserSIPStatusCodeValue;
- 
- 	ctx->startingInStatusCodeValue  = 0;
- 	ctx->startingOutStatusCodeValue = 0;
-diff --git a/modules/snmpstats/snmpstats.c b/modules/snmpstats/snmpstats.c
-index 95bc1c1f3..575c0d106 100644
---- a/modules/snmpstats/snmpstats.c
-+++ b/modules/snmpstats/snmpstats.c
-@@ -346,7 +346,12 @@ static void sigchld_handler(int signal)
-  */
- static int spawn_sysUpTime_child(void)
- {
-+	pid_t result_pid;
-+	int snmpget_fd;
-+	int local_path_to_snmpget_length;
-+	int snmpget_binary_name_length;
- 	struct sigaction new_sigchld_handler;
-+	char *args[6];
- 
- 	char *local_path_to_snmpget = "/usr/bin/";
- 	char *snmpget_binary_name   = "/snmpget";
-@@ -362,7 +367,7 @@ static int spawn_sysUpTime_child(void)
- 	new_sigchld_handler.sa_handler = sigchld_handler;
- 	sigaction(SIGCHLD, &new_sigchld_handler, &old_sigchld_handler);
- 
--	pid_t result_pid = fork();
-+	result_pid = fork();
- 
- 	if (result_pid < 0) {
- 		LM_ERR("failed to not spawn an agent to check sysUpTime\n");
-@@ -380,7 +385,7 @@ static int spawn_sysUpTime_child(void)
- 
- 	/* If we are here, then we are the child process.  Lets set up the file
- 	 * descriptors so we can capture the output of snmpget. */
--	int snmpget_fd =
-+	snmpget_fd =
- 		open(SNMPGET_TEMP_FILE, O_CREAT|O_TRUNC|O_RDWR,
- 				S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
- 
-@@ -401,8 +406,12 @@ static int spawn_sysUpTime_child(void)
- 				"  Defaulting to %s\n",	snmp_community_string);
- 	}
- 
--	char *args[] = {"-Ov", "-c",  snmp_community_string, "localhost",
--		SYSUPTIME_OID, (char *) 0};
-+	args[0] = "-Ov";
-+	args[1] = "-c";
-+	args[2] = snmp_community_string;
-+	args[3] = "localhost";
-+	args[4] = SYSUPTIME_OID;
-+	args[5] = (char *)0;
- 
- 	/* Make sure we have a path to snmpget, so we can retrieve the
- 	 * sysUpTime. */
-@@ -416,8 +425,8 @@ static int spawn_sysUpTime_child(void)
- 		local_path_to_snmpget = snmpget_path;
- 	}
- 
--	int local_path_to_snmpget_length = strlen(local_path_to_snmpget);
--	int snmpget_binary_name_length   = strlen(snmpget_binary_name);
-+	local_path_to_snmpget_length = strlen(local_path_to_snmpget);
-+	snmpget_binary_name_length   = strlen(snmpget_binary_name);
- 
- 	/* Allocate enough memory to hold the path, the binary name, and the
- 	 * null character.  We don't use pkg_memory here. */
-diff --git a/modules/snmpstats/utilities.c b/modules/snmpstats/utilities.c
-index dfc0978b7..2f7ed9a30 100644
---- a/modules/snmpstats/utilities.c
-+++ b/modules/snmpstats/utilities.c
-@@ -72,13 +72,13 @@ int stringHandlerSanityCheck( modparam_t type, void *val, char *parameterName)
- int get_statistic(char *statName)
- {
- 	int result = 0;
--
-+	stat_var *theVar = NULL;
- 	str theStr;
- 
- 	theStr.s   = statName;
- 	theStr.len = strlen(statName);
- 
--	stat_var *theVar = get_stat(&theStr);
-+	theVar = get_stat(&theStr);
- 
- 	if (theVar==0) {
- 		LM_INFO("failed to retrieve statistics for %s\n", statName);

diff --git a/opensips-0012-support-for-libmongc-libbson-version-2.patch b/opensips-0012-support-for-libmongc-libbson-version-2.patch
deleted file mode 100644
index cf165c6..0000000
--- a/opensips-0012-support-for-libmongc-libbson-version-2.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Remi Collet <remi@remirepo.net>
-Date: Thu, 19 Feb 2026 12:46:28 +0100
-Subject: [PATCH] support for libmongc/libbson version 2
-
-
-diff --git a/modules/cachedb_mongodb/Makefile b/modules/cachedb_mongodb/Makefile
-index cd1aafc0b..e361505a3 100644
---- a/modules/cachedb_mongodb/Makefile
-+++ b/modules/cachedb_mongodb/Makefile
-@@ -10,7 +10,9 @@ NAME=cachedb_mongodb.so
- include ../../lib/json/Makefile.json
- ifeq ($(CROSS_COMPILE),)
- MONGOC_BUILDER := $(shell \
--	if pkg-config --exists libmongoc-1.0; then \
-+	if pkg-config --exists mongoc2; then \
-+		echo 'pkg-config mongoc2'; \
-+	elif pkg-config --exists libmongoc-1.0; then \
- 		echo 'pkg-config libmongoc-1.0'; \
- 	fi)
- endif
-diff --git a/modules/cachedb_mongodb/cachedb_mongodb_dbase.h b/modules/cachedb_mongodb/cachedb_mongodb_dbase.h
-index cbe485556..0eaf76667 100644
---- a/modules/cachedb_mongodb/cachedb_mongodb_dbase.h
-+++ b/modules/cachedb_mongodb/cachedb_mongodb_dbase.h
-@@ -27,8 +27,8 @@
- 
- #define MONGO_HAVE_STDINT 1
- 
--#include <mongoc.h>
--#include <bson.h>
-+#include <mongoc/mongoc.h>
-+#include <bson/bson.h>
- 
- #include <stdint.h>
- 
-diff --git a/modules/cachedb_mongodb/cachedb_mongodb_json.h b/modules/cachedb_mongodb/cachedb_mongodb_json.h
-index f3bcbd9bb..85bbbab8d 100644
---- a/modules/cachedb_mongodb/cachedb_mongodb_json.h
-+++ b/modules/cachedb_mongodb/cachedb_mongodb_json.h
-@@ -23,7 +23,7 @@
- 
- #include "cachedb_mongodb_dbase.h"
- 
--#include <bson.h>
-+#include <bson/bson.h>
- #include <stdint.h>
- 
- int json_to_bson(char *json,bson_t *bb);

diff --git a/opensips-0013-require-libpcre2.patch b/opensips-0013-require-libpcre2.patch
deleted file mode 100644
index abcb7f0..0000000
--- a/opensips-0013-require-libpcre2.patch
+++ /dev/null
@@ -1,170 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Steve Ayre <steven.ayre@dubber.net>
-Date: Wed, 17 Sep 2025 19:20:47 +0100
-Subject: [PATCH] require libpcre2
-
-(cherry picked from commit 1cb16e082e9ba1cd63f04996eecd75632682df7c)
-
-diff --git a/.lgtm.yml b/.lgtm.yml
-index 7d584c772..64235966f 100644
---- a/.lgtm.yml
-+++ b/.lgtm.yml
-@@ -22,7 +22,7 @@ extraction:
-         - libldap2-dev
-         - libcurl4-gnutls-dev
-         - libgeoip-dev
--        - libpcre3-dev
-+        - libpcre2-dev
-         - libmemcached-dev
-         - libmicrohttpd-dev
-         - librabbitmq-dev
-diff --git a/Makefile.conf.template b/Makefile.conf.template
-index ed7bc257a..a0c8aa9ae 100644
---- a/Makefile.conf.template
-+++ b/Makefile.conf.template
-@@ -19,13 +19,13 @@
- #db_postgres= Provides Postgres connectivity for OpenSIPS | PostgreSQL library and development library - typically libpq5 and libpq-dev
- #db_sqlite= Provides SQLite connectivity for OpenSIPS | SQLite library and development library - typically libsqlite3 and libsqlite3-dev
- #db_unixodbc= Allows to use the unixodbc package with OpenSIPS | ODBC library and ODBC development library
--#dialplan= Implements generic string translations based on matching and replacement rules | PCRE development library, typically libpcre-dev
-+#dialplan= Implements generic string translations based on matching and replacement rules | PCRE development library, typically libpcre2-dev
- #emergency= Provides emergency call treatment for OpenSIPS | CURL dev library - typically libcurl4-openssl-dev
- #event_rabbitmq= Provides the implementation of a RabbitMQ client for the Event Interface | RabbitMQ development library, librabbitmq-dev
- #event_sqs= Provides the implementation of a Amazon SQS client for the Event Interface | AWS SDK C++, aws-sdk-cpp
- #event_kafka= Provides the implementation of an Apache Kafka producer for the Event Interface | Kafka development library, librdkafka-dev
- #h350= Enables access to SIP account data stored in an LDAP [RFC4510] directory containing H.350 commObjects | OpenLDAP library & development files, typically libldap and libldap-dev
--#regex= Offers matching operations against regular expressions using the powerful PCRE library. | Development library for PCRE, typically libpcre-dev
-+#regex= Offers matching operations against regular expressions using the powerful PCRE library. | Development library for PCRE, typically libpcre2-dev
- #identity= Adds support for SIP Identity (see RFC 4474). | SSL library, typically libssl
- #jabber= Integrates XODE XML parser for parsing Jabber messages | Expat library.
- #json= Introduces a new type of variable that provides both serialization and de-serialization from JSON format. | JSON library, libjson
-diff --git a/modules/dialplan/dialplan.h b/modules/dialplan/dialplan.h
-index 954359a7a..c4af9435f 100644
---- a/modules/dialplan/dialplan.h
-+++ b/modules/dialplan/dialplan.h
-@@ -31,7 +31,8 @@
- 
- #include "../../db/db.h"
- #include "../../re.h"
--#include <pcre.h>
-+#define PCRE2_CODE_UNIT_WIDTH 8
-+#include <pcre2.h>
- 
- #define REGEX_OP	1
- #define EQUAL_OP	0
-diff --git a/modules/regex/regex_mod.c b/modules/regex/regex_mod.c
-index 59d5a6724..d1a91449c 100644
---- a/modules/regex/regex_mod.c
-+++ b/modules/regex/regex_mod.c
-@@ -24,6 +24,7 @@
-  *  2009-01-14  initial version (Iñaki Baz Castillo)
-  *  2023-08-12  export pcres_match to MI (Fabien Aunay)
-  *  2023-08-12  export pcres_match_group to MI (Fabien Aunay)
-+ *  2025-09-17  switch to libpcre2 (Steven Ayre)
-  */
- 
- 
-@@ -39,7 +40,8 @@
- #include <stdlib.h>
- #include <string.h>
- #include <sys/stat.h>
--#include <pcre.h>
-+#define PCRE2_CODE_UNIT_WIDTH 8
-+#include <pcre2.h>
- #include "../../sr_module.h"
- #include "../../dprint.h"
- #include "../../pt.h"
-diff --git a/packaging/arch/Makefile.conf.template b/packaging/arch/Makefile.conf.template
-index 27a7ba8ad..f0dc257b3 100644
---- a/packaging/arch/Makefile.conf.template
-+++ b/packaging/arch/Makefile.conf.template
-@@ -17,11 +17,11 @@
- #db_postgres= Provides Postgres connectivity for OpenSIPS | PostgreSQL library and development library - tipically libpq5 and libpq-dev
- #db_sqlite= Provides SQLite connectivity for OpenSIPS | SQLite library and development library - tipically libsqlite3 and libsqlite3-dev
- #db_unixodbc= Allows to use the unixodbc package with OpenSIPS | ODBC library and ODBC development library
--#dialplan= Implements generic string translations based on matching and replacement rules | PCRE development library, tipically libpcre-dev
-+#dialplan= Implements generic string translations based on matching and replacement rules | PCRE development library, tipically libpcre2-dev
- #emergency= Provides emergency call treatment for OpenSIPS | CURL dev library - tipically libcurl4-openssl-dev
- #event_rabbitmq= Provides the implementation of a RabbitMQ client for the Event Interface | RabbitMQ development library, librabbitmq-dev
- #h350= Enables access to SIP account data stored in an LDAP [RFC4510] directory containing H.350 commObjects | OpenLDAP library & development files, tipically libldap and libldap-dev
--#regex= Offers matching operations against regular expressions using the powerful PCRE library. | Development library for PCRE, tipically libpcre-dev
-+#regex= Offers matching operations against regular expressions using the powerful PCRE library. | Development library for PCRE, tipically libpcre2-dev
- #identity= Adds support for SIP Identity (see RFC 4474). | SSL library, tipically libssl
- #jabber= Integrates XODE XML parser for parsing Jabber messages | Expat library.
- #json= Introduces a new type of variable that provides both serialization and de-serialization from JSON format. | JSON library, libjson
-diff --git a/packaging/arch/PKGBUILD.git b/packaging/arch/PKGBUILD.git
-index ad3387460..882491be9 100644
---- a/packaging/arch/PKGBUILD.git
-+++ b/packaging/arch/PKGBUILD.git
-@@ -128,7 +128,7 @@ package_opensips-git() {
- 		'mongo-c-driver: C-Interface for Mongo-DB support'
- 		'net-snmp: SNMP support'
- 		'osptoolkit: OSP Toolkit support'
--		'pcre: Perl Regular-Expression support'
-+		'pcre2: Perl Regular-Expression support'
- 		'perl: Perl support'
- 		'postgresql-libs: PostgreSQL-DB support'
- 		'python2: Python v2 support'
-diff --git a/packaging/debian/control b/packaging/debian/control
-index 56a7b5587..141f815f6 100644
---- a/packaging/debian/control
-+++ b/packaging/debian/control
-@@ -29,7 +29,7 @@ Build-Depends: bison,
-                libbson-dev | base-files,
-                libmongoc-dev | base-files,
-                libncurses5-dev,
--               libpcre3-dev,
-+               libpcre2-dev,
-                libperl-dev,
-                libpq-dev,
-                librabbitmq-dev,
-diff --git a/packaging/redhat_fedora/opensips.spec b/packaging/redhat_fedora/opensips.spec
-index 6ab686c58..5135a383f 100644
---- a/packaging/redhat_fedora/opensips.spec
-+++ b/packaging/redhat_fedora/opensips.spec
-@@ -79,7 +79,7 @@ BuildRequires:  openldap-devel
- BuildRequires:  curl-devel
- # BuildRequires:  GeoIP-devel
- BuildRequires:  libmaxminddb-devel
--BuildRequires:  pcre-devel
-+BuildRequires:  pcre2-devel
- %if 0%{?_with_python3:1}
- BuildRequires:  python3-devel
- %else
-diff --git a/packaging/solaris/regex-preinstall b/packaging/solaris/regex-preinstall
-index 38d94c61f..79ca6da14 100644
---- a/packaging/solaris/regex-preinstall
-+++ b/packaging/solaris/regex-preinstall
-@@ -2,7 +2,7 @@
- # Script for checking prerequisites for OpenSIPS-xmlrpc
- 
- BASE="OpenSIPS-base"
--LIBPCRE="libpcre.so"
-+LIBPCRE="libpcre2.so"
- TMPLIST="/tmp/.opensipspcre"
- 
- pkginfo | grep -i $BASE > /dev/null
-diff --git a/scripts/build/apt_requirements.txt b/scripts/build/apt_requirements.txt
-index f094b73e3..f95bd22f3 100644
---- a/scripts/build/apt_requirements.txt
-+++ b/scripts/build/apt_requirements.txt
-@@ -13,9 +13,8 @@ libmaxminddb-dev
- libmemcached-dev
- libmicrohttpd-dev
- libmnl-dev
--libmysqlclient-dev
- libncurses5-dev
--libpcre3-dev
-+libpcre2-dev
- libperl-dev
- libpq-dev
- librabbitmq-dev
-@@ -27,7 +26,7 @@ libxml2-dev
- make
- odbcinst
- patch
--python-dev
-+python3-dev
- unixodbc
- unixodbc-dev
- uuid-dev

diff --git a/opensips-0014-update-dialplan-module-for-pcre2.patch b/opensips-0014-update-dialplan-module-for-pcre2.patch
deleted file mode 100644
index 6e1e206..0000000
--- a/opensips-0014-update-dialplan-module-for-pcre2.patch
+++ /dev/null
@@ -1,337 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Steve Ayre <steven.ayre@dubber.net>
-Date: Thu, 18 Sep 2025 15:47:58 +0100
-Subject: [PATCH] update dialplan module for pcre2
-
-(cherry picked from commit c58e3af0cc7b44ceb304ac1b6d2c8b45feca4b5b)
-
-diff --git a/modules/dialplan/Makefile b/modules/dialplan/Makefile
-index a7c6a0a91..c4b35720a 100644
---- a/modules/dialplan/Makefile
-+++ b/modules/dialplan/Makefile
-@@ -9,11 +9,11 @@ NAME=dialplan.so
- # CROSS_COMPILE=true
- 
- ifeq ($(CROSS_COMPILE),)
--PCRE_BUILDER := $(shell \
--	if which pcre-config >/dev/null 2>/dev/null; then \
--		echo 'pcre-config'; \
--	elif pkg-config --exists libcre; then \
--		echo 'pkg-config libpcre'; \
-+PCRE_BUILDER = $(shell \
-+	if which pcre2-config >/dev/null 2>/dev/null; then \
-+		echo 'pcre2-config'; \
-+	elif pkg-config --exists libpcre2-8; then \
-+		echo 'pkg-config libpcre2-8'; \
- 	fi)
- endif
- 
-@@ -21,10 +21,10 @@ ifeq ($(PCRE_BUILDER),)
- 	DEFS += -I$(SYSBASE)/include \
- 			-I$(LOCALBASE)/include
- 	LIBS += -L$(SYSBASE)/lib \
--			-L$(LOCALBASE)/lib -lpcre
-+			-L$(LOCALBASE)/lib -lpcre2-8
- else
- 	DEFS += $(shell $(PCRE_BUILDER) --cflags)
--	LIBS += $(shell $(PCRE_BUILDER) --libs)
-+	LIBS += $(shell $(PCRE_BUILDER) --libs8)
- endif
- 
- include ../../Makefile.modules
-diff --git a/modules/dialplan/README b/modules/dialplan/README
-index fe720ede9..3cf84f02e 100644
---- a/modules/dialplan/README
-+++ b/modules/dialplan/README
-@@ -243,7 +243,7 @@ Chapter 1. Admin Guide
- 
-    The following libraries or applications must be installed
-    before running OpenSIPS with this module loaded:
--     * libpcre-dev - the development libraries of PCRE.
-+     * libpcre2-dev - the development libraries of PCRE.
- 
- 1.6. Exported Parameters
- 
-diff --git a/modules/dialplan/dialplan.c b/modules/dialplan/dialplan.c
-index 454f9a6ca..3b37e3e59 100644
---- a/modules/dialplan/dialplan.c
-+++ b/modules/dialplan/dialplan.c
-@@ -869,51 +869,61 @@ static mi_response_t *mi_translate3(const mi_params_t *params,
- }
- 
- 
--void * wrap_shm_malloc(size_t size)
-+void * wrap_shm_malloc(PCRE2_SIZE size, void * memory_data)
- {
-+	UNUSED(memory_data);
- 	return shm_malloc(size);
- }
- 
--void  wrap_shm_free(void * p )
-+void wrap_shm_free(void * p, void * memory_data)
- {
-+	UNUSED(memory_data);
- 	shm_free(p);
- }
- 
--
--pcre * wrap_pcre_compile(char *  pattern, int flags)
-+pcre2_code * wrap_pcre_compile(char *  pattern, int flags)
- {
--		pcre * ret ;
--		func_malloc old_malloc ;
--		func_free old_free;
--		const char * error;
--		int erroffset;
--		int pcre_flags = 0;
--
--
--		old_malloc = pcre_malloc;
--		old_free = pcre_free;
--
--		pcre_malloc = wrap_shm_malloc;
--		pcre_free = wrap_shm_free;
--
--		if (flags & DP_CASE_INSENSITIVE)
--			pcre_flags |= PCRE_CASELESS;
--
--		ret = pcre_compile(
--				pattern,			/* the pattern */
--				pcre_flags,			/* default options */
--				&error,				/* for error message */
--				&erroffset,			/* for error offset */
--				NULL);
--
--		pcre_malloc = old_malloc;
--		pcre_free = old_free;
--
--		return ret;
-+	pcre2_general_context *gcontext;
-+	pcre2_compile_context *ccontext;
-+	pcre2_code * ret ;
-+	int error;
-+	PCRE2_SIZE erroffset;
-+	int pcre_flags = 0;
-+
-+	// TODO generate once per worker
-+	gcontext = pcre2_general_context_create(wrap_shm_malloc, wrap_shm_free, NULL);
-+	if (!gcontext) {
-+		LM_ERR("Unable to create pcre general context\n");
-+		return NULL;
-+	}
-+
-+	// TODO generate once per worker
-+	ccontext = pcre2_compile_context_create(gcontext);
-+	if (!ccontext) {
-+		LM_ERR("Unable to create pcre compile context\n");
-+		pcre2_general_context_free(gcontext);
-+		return NULL;
-+	}
-+
-+	if (flags & DP_CASE_INSENSITIVE)
-+		pcre_flags |= PCRE2_CASELESS;
-+
-+	ret = pcre2_compile(
-+			(PCRE2_SPTR)pattern,		/* the pattern */
-+			PCRE2_ZERO_TERMINATED,
-+			pcre_flags,			/* default options */
-+			&error,				/* for error message */
-+			&erroffset,			/* for error offset */
-+			ccontext);                      /* compile context, to allocate memory in shm */
-+
-+	pcre2_compile_context_free(ccontext);
-+	pcre2_general_context_free(gcontext);
-+
-+	return ret;
- }
- 
--void wrap_pcre_free( pcre* re)
-+void wrap_pcre_free( pcre2_code* re)
- {
-+	// TODO pcre2_code_free
- 	shm_free(re);
--
- }
-diff --git a/modules/dialplan/dialplan.h b/modules/dialplan/dialplan.h
-index c4af9435f..d798ae4a7 100644
---- a/modules/dialplan/dialplan.h
-+++ b/modules/dialplan/dialplan.h
-@@ -49,7 +49,7 @@ typedef struct dpl_node{
- 	int matchop;
- 	int match_flags;
- 	str match_exp, subst_exp, repl_exp; /*keeping the original strings*/
--	pcre * match_comp, * subst_comp; /*compiled patterns*/
-+	pcre2_code * match_comp, * subst_comp; /*compiled patterns*/
- 	struct subst_expr * repl_comp;
- 	str attrs;
- 	str timerec;
-@@ -122,19 +122,11 @@ struct subst_expr* repl_exp_parse(str subst);
- void repl_expr_free(struct subst_expr *se);
- int translate(struct sip_msg *msg, str user_name, str* repl_user, dpl_id_p idp, str *);
- int rule_translate(struct sip_msg *msg, str , dpl_node_t * rule,  str *);
--int test_match(str string, pcre * exp, int * out, int out_max);
-+int test_match(str string, pcre2_code * exp, int * out, int out_max);
- 
- 
--typedef void * (*func_malloc)(size_t );
--typedef void  (*func_free)(void * );
--
--void * wrap_shm_malloc(size_t size);
--void  wrap_shm_free(void *);
--
--
--pcre * wrap_pcre_compile(char *  pattern, int flags);
--void wrap_pcre_free( pcre*);
--
-+pcre2_code * wrap_pcre_compile(char *  pattern, int flags);
-+void wrap_pcre_free( pcre2_code*);
- 
- extern rw_lock_t *ref_lock;
- extern str dp_df_part;
-diff --git a/modules/dialplan/dp_db.c b/modules/dialplan/dp_db.c
-index e88682a5f..cacac3018 100644
---- a/modules/dialplan/dp_db.c
-+++ b/modules/dialplan/dp_db.c
-@@ -467,12 +467,12 @@ int str_to_shm(str src, str * dest)
- dpl_node_t * build_rule(db_val_t * values)
- {
- 	tmrec_expr *parsed_timerec;
--	pcre * match_comp, *subst_comp;
-+	pcre2_code * match_comp, *subst_comp;
- 	struct subst_expr * repl_comp;
- 	dpl_node_t * new_rule;
- 	str match_exp, subst_exp, repl_exp, attrs, timerec;
- 	int matchop;
--	int namecount;
-+	uint32_t namecount;
- 
- 	matchop = VAL_INT(values+2);
- 
-@@ -524,10 +524,9 @@ dpl_node_t * build_rule(db_val_t * values)
- 		}
- 	}
- 
--	pcre_fullinfo(
-+	pcre2_pattern_info(
- 		subst_comp, /* the compiled pattern */
--		NULL, /* no extra data - we didn't study the pattern */
--		PCRE_INFO_CAPTURECOUNT, /* number of named substrings */
-+		PCRE2_INFO_CAPTURECOUNT, /* number of named substrings */
- 		&namecount); /* where to put the answer */
- 
- 	LM_DBG("references:%d , max:%d\n",namecount,
-diff --git a/modules/dialplan/dp_repl.c b/modules/dialplan/dp_repl.c
-index 6ff94dd03..4317b334d 100644
---- a/modules/dialplan/dp_repl.c
-+++ b/modules/dialplan/dp_repl.c
-@@ -110,11 +110,11 @@ int rule_translate(struct sip_msg *msg, str string, dpl_node_t * rule,
- {
- 	int repl_nb, offset, match_nb;
- 	struct replace_with token;
--	pcre * subst_comp;
-+	pcre2_code * subst_comp;
- 	struct subst_expr * repl_comp;
- 	pv_value_t sv;
- 	str* uri;
--	int capturecount;
-+	uint32_t capturecount;
- 	char *match_begin;
- 	int match_len;
- 
-@@ -133,11 +133,10 @@ int rule_translate(struct sip_msg *msg, str string, dpl_node_t * rule,
- 
- 	if(subst_comp){
- 
--		pcre_fullinfo(
--		subst_comp,                   /* the compiled pattern */
--		NULL,                 /* no extra data - we didn't study the pattern */
--		PCRE_INFO_CAPTURECOUNT ,  /* number of named substrings */
--		&capturecount);          /* where to put the answer */
-+		pcre2_pattern_info(
-+			subst_comp,              /* the compiled pattern */
-+			PCRE2_INFO_CAPTURECOUNT, /* number of named substrings */
-+			&capturecount);          /* where to put the answer */
- 
- 
- 		/*just in case something went wrong at load time*/
-@@ -397,11 +396,13 @@ int translate(struct sip_msg *msg, str input, str * output, dpl_id_p idp, str *
- }
- 
- 
--int test_match(str string, pcre * exp, int * out, int out_max)
-+int test_match(str string, pcre2_code * exp, int * out, int out_max)
- {
- 	int i, result_count;
- 	char *substring_start;
- 	int substring_length;
-+	pcre2_match_data *match_data;
-+	PCRE2_SIZE *ovector;
- 	UNUSED(substring_start);
- 	UNUSED(substring_length);
- 
-@@ -410,34 +411,50 @@ int test_match(str string, pcre * exp, int * out, int out_max)
- 		return -1;
- 	}
- 
--	result_count = pcre_exec(
--							exp, /* the compiled pattern */
--							NULL, /* no extra data - we didn't study the pattern */
--							string.s, /* the subject string */
--							string.len, /* the length of the subject */
--							0, /* start at offset 0 in the subject */
--							0, /* default options */
--							out, /* output vector for substring information */
--							out_max); /* number of elements in the output vector */
--
--	if( result_count < 0 )
--		return result_count;
-+	match_data = pcre2_match_data_create_from_pattern(exp, NULL);
-+	if (!match_data) {
-+		LM_ERR("failed to allocate match data\n");
-+		return -1;
-+	}
- 
--	if( result_count == 0)
-+	result_count = pcre2_match(
-+		exp, /* the compiled pattern */
-+		(PCRE2_SPTR)string.s, /* the subject string */
-+		(PCRE2_SIZE)string.len, /* the length of the subject */
-+		0, /* start at offset 0 in the subject */
-+		0, /* default options */
-+		match_data, /* match data block */
-+		NULL); /* match context */
-+
-+	if (result_count < 0)
- 	{
--		LM_ERR("Not enough space for mathing\n");
-+		pcre2_match_data_free(match_data);
- 		return result_count;
- 	}
- 
-+	if (result_count == 0)
-+	{
-+		LM_ERR("Not enough space for matching\n");
-+		pcre2_match_data_free(match_data);
-+		return result_count;
-+	}
- 
-+	ovector = pcre2_get_ovector_pointer(match_data);
- 	for (i = 0; i < result_count; i++)
- 	{
-+		// avoid buffer overflow
-+		if (i >= out_max)
-+			break;
-+
-+		// ovector is freed by pcre2_match_data_free, copy offsets to out[]
-+		out[i] = ovector[i];
-+
- 		substring_start = string.s + out[2 * i];
- 		substring_length = out[2 * i + 1] - out[2 * i];
- 		LM_DBG("test_match:[%d] %.*s\n",i, substring_length, substring_start);
- 	}
- 
--
-+	pcre2_match_data_free(match_data);
- 	return result_count;
- }
- 

diff --git a/opensips-0015-create-pcre2-compile-context-once-instead-of-for-eac.patch b/opensips-0015-create-pcre2-compile-context-once-instead-of-for-eac.patch
deleted file mode 100644
index 9f2ddab..0000000
--- a/opensips-0015-create-pcre2-compile-context-once-instead-of-for-eac.patch
+++ /dev/null
@@ -1,111 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Steve Ayre <steven.ayre@dubber.net>
-Date: Thu, 18 Sep 2025 15:54:02 +0100
-Subject: [PATCH] create pcre2 compile context once instead of for each compile
-
-(cherry picked from commit 6082b43fa8b44cbfea7de8afb38998354b54d1fb)
-
-diff --git a/modules/dialplan/dialplan.c b/modules/dialplan/dialplan.c
-index 3b37e3e59..8bc7cfbec 100644
---- a/modules/dialplan/dialplan.c
-+++ b/modules/dialplan/dialplan.c
-@@ -86,6 +86,12 @@ static str database_url = {NULL, 0};
- 
- void *dp_srg = NULL;
- 
-+pcre2_general_context *dp_gcontext = NULL;
-+pcre2_compile_context *dp_ccontext = NULL;
-+
-+void * wrap_shm_malloc(PCRE2_SIZE size, void * memory_data);
-+void wrap_shm_free(void * p, void * memory_data);
-+
- 
- static const param_export_t mod_params[]={
- 	{ "partition",		STR_PARAM|USE_FUNC_PARAM,
-@@ -398,6 +404,18 @@ static int mod_init(void)
- 		return -1;
- 	}
- 
-+	dp_gcontext = pcre2_general_context_create(wrap_shm_malloc, wrap_shm_free, NULL);
-+	if (!dp_gcontext) {
-+		LM_ERR("Unable to create pcre general context\n");
-+		return -1;
-+	}
-+
-+	dp_ccontext = pcre2_compile_context_create(dp_gcontext);
-+	if (!dp_ccontext) {
-+		LM_ERR("Unable to create pcre compile context\n");
-+		return -1;
-+	}
-+
- 	return 0;
- }
- 
-@@ -452,6 +470,18 @@ static void mod_destroy(void)
- 	}
- 
- 	destroy_data();
-+
-+	if (dp_ccontext)
-+	{
-+		pcre2_compile_context_free(dp_ccontext);
-+		dp_ccontext = NULL;
-+	}
-+
-+	if (dp_gcontext)
-+	{
-+		pcre2_general_context_free(dp_gcontext);
-+		dp_gcontext = NULL;
-+	}
- }
- 
- 
-@@ -883,28 +913,11 @@ void wrap_shm_free(void * p, void * memory_data)
- 
- pcre2_code * wrap_pcre_compile(char *  pattern, int flags)
- {
--	pcre2_general_context *gcontext;
--	pcre2_compile_context *ccontext;
- 	pcre2_code * ret ;
- 	int error;
- 	PCRE2_SIZE erroffset;
- 	int pcre_flags = 0;
- 
--	// TODO generate once per worker
--	gcontext = pcre2_general_context_create(wrap_shm_malloc, wrap_shm_free, NULL);
--	if (!gcontext) {
--		LM_ERR("Unable to create pcre general context\n");
--		return NULL;
--	}
--
--	// TODO generate once per worker
--	ccontext = pcre2_compile_context_create(gcontext);
--	if (!ccontext) {
--		LM_ERR("Unable to create pcre compile context\n");
--		pcre2_general_context_free(gcontext);
--		return NULL;
--	}
--
- 	if (flags & DP_CASE_INSENSITIVE)
- 		pcre_flags |= PCRE2_CASELESS;
- 
-@@ -914,16 +927,14 @@ pcre2_code * wrap_pcre_compile(char *  pattern, int flags)
- 			pcre_flags,			/* default options */
- 			&error,				/* for error message */
- 			&erroffset,			/* for error offset */
--			ccontext);                      /* compile context, to allocate memory in shm */
--
--	pcre2_compile_context_free(ccontext);
--	pcre2_general_context_free(gcontext);
-+			dp_ccontext);                      /* compile context, to allocate memory in shm */
- 
- 	return ret;
- }
- 
- void wrap_pcre_free( pcre2_code* re)
- {
--	// TODO pcre2_code_free
-+	// *not* pcre2_code_free
-+	// shm_free is used because pcre2_general_context_create overrides malloc with wrap_shm_malloc
- 	shm_free(re);
- }

diff --git a/opensips-0016-Makefile-tweaks-to-avoid-shell-.-expansions-from-fai.patch b/opensips-0016-Makefile-tweaks-to-avoid-shell-.-expansions-from-fai.patch
deleted file mode 100644
index c044c4b..0000000
--- a/opensips-0016-Makefile-tweaks-to-avoid-shell-.-expansions-from-fai.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Ken Rice <krice@sipnavigator.com>
-Date: Thu, 11 Sep 2025 10:57:39 -0400
-Subject: [PATCH] Makefile tweaks to avoid $(shell ...) expansions from failing
-
-Fixes #3717
-
-(cherry picked from commit a3ae498d8726894753483738e801dfc0e63e3ba9)
-
-diff --git a/modules/dialplan/Makefile b/modules/dialplan/Makefile
-index c4b35720a..505bd9540 100644
---- a/modules/dialplan/Makefile
-+++ b/modules/dialplan/Makefile
-@@ -9,7 +9,7 @@ NAME=dialplan.so
- # CROSS_COMPILE=true
- 
- ifeq ($(CROSS_COMPILE),)
--PCRE_BUILDER = $(shell \
-+PCRE_BUILDER := $(shell \
- 	if which pcre2-config >/dev/null 2>/dev/null; then \
- 		echo 'pcre2-config'; \
- 	elif pkg-config --exists libpcre2-8; then \
-diff --git a/modules/regex/Makefile b/modules/regex/Makefile
-index 79a150839..496c0438e 100644
---- a/modules/regex/Makefile
-+++ b/modules/regex/Makefile
-@@ -10,10 +10,10 @@ NAME=regex.so
- 
- ifeq ($(CROSS_COMPILE),)
- PCRE_BUILDER := $(shell \
--	if which pcre-config >/dev/null 2>/dev/null; then \
--		echo 'pcre-config'; \
--	elif pkg-config --exists libcre; then \
--		echo 'pkg-config libpcre'; \
-+	if which pcre2-config >/dev/null 2>/dev/null; then \
-+		echo 'pcre2-config'; \
-+	elif pkg-config --exists libpcre2-8; then \
-+		echo 'pkg-config libpcre2-8'; \
- 	fi)
- endif
- 

diff --git a/opensips-0017-dialplan-fix-copying-subst-s-out-vector.patch b/opensips-0017-dialplan-fix-copying-subst-s-out-vector.patch
deleted file mode 100644
index a8406fc..0000000
--- a/opensips-0017-dialplan-fix-copying-subst-s-out-vector.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Razvan Crainea <razvan@opensips.org>
-Date: Tue, 2 Dec 2025 15:40:15 +0200
-Subject: [PATCH] dialplan: fix copying subst's out vector
-
-(cherry picked from commit 30825e4e0809a1a61f06cec964589c825645b62b)
-
-diff --git a/modules/dialplan/dp_repl.c b/modules/dialplan/dp_repl.c
-index 4317b334d..0764148a9 100644
---- a/modules/dialplan/dp_repl.c
-+++ b/modules/dialplan/dp_repl.c
-@@ -440,21 +440,21 @@ int test_match(str string, pcre2_code * exp, int * out, int out_max)
- 	}
- 
- 	ovector = pcre2_get_ovector_pointer(match_data);
--	for (i = 0; i < result_count; i++)
--	{
--		// avoid buffer overflow
--		if (i >= out_max)
--			break;
-+	if (2 * result_count >= out_max)
-+		result_count = out_max / 2;
- 
--		// ovector is freed by pcre2_match_data_free, copy offsets to out[]
-+	// ovector is freed by pcre2_match_data_free, copy offsets to out[]
-+	for (i = 0; i < result_count * 2; i++)
- 		out[i] = ovector[i];
-+	pcre2_match_data_free(match_data);
- 
-+	for (i = 0; i < result_count; i++)
-+	{
- 		substring_start = string.s + out[2 * i];
- 		substring_length = out[2 * i + 1] - out[2 * i];
- 		LM_DBG("test_match:[%d] %.*s\n",i, substring_length, substring_start);
- 	}
- 
--	pcre2_match_data_free(match_data);
- 	return result_count;
- }
- 

diff --git a/opensips-0018-dialplan-make-module-work-with-both-pcre2-and-pcre3-.patch b/opensips-0018-dialplan-make-module-work-with-both-pcre2-and-pcre3-.patch
deleted file mode 100644
index b61424f..0000000
--- a/opensips-0018-dialplan-make-module-work-with-both-pcre2-and-pcre3-.patch
+++ /dev/null
@@ -1,249 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Razvan Crainea <razvan@opensips.org>
-Date: Thu, 4 Dec 2025 19:27:07 +0200
-Subject: [PATCH] dialplan: make module work with both pcre2 and pcre3 libs
-
-(cherry picked from commit 67483a5a27ce656eaf9409f7710cf67798e70aac)
-
-diff --git a/modules/dialplan/Makefile b/modules/dialplan/Makefile
-index 505bd9540..a937d3285 100644
---- a/modules/dialplan/Makefile
-+++ b/modules/dialplan/Makefile
-@@ -8,12 +8,16 @@ NAME=dialplan.so
- # the autodetection
- # CROSS_COMPILE=true
- 
-+PCRE_LIB ?= pcre2-8
-+PCRE_VERSION ?= $(word 1,$(subst -, , $(PCRE_LIB)))
-+PCRE_CONFIG ?= $(PCRE_VERSION)-config
-+
- ifeq ($(CROSS_COMPILE),)
- PCRE_BUILDER := $(shell \
--	if which pcre2-config >/dev/null 2>/dev/null; then \
--		echo 'pcre2-config'; \
--	elif pkg-config --exists libpcre2-8; then \
--		echo 'pkg-config libpcre2-8'; \
-+	if which $(PCRE_CONFIG) >/dev/null 2>/dev/null; then \
-+		echo '$(PCRE_CONFIG)'; \
-+	elif pkg-config --exists lib$(PCRE_LIB); then \
-+		echo 'pkg-config lib$(PCRE_LIB)'; \
- 	fi)
- endif
- 
-@@ -21,10 +25,12 @@ ifeq ($(PCRE_BUILDER),)
- 	DEFS += -I$(SYSBASE)/include \
- 			-I$(LOCALBASE)/include
- 	LIBS += -L$(SYSBASE)/lib \
--			-L$(LOCALBASE)/lib -lpcre2-8
-+			-L$(LOCALBASE)/lib -l$(PCRE_LIB)
- else
- 	DEFS += $(shell $(PCRE_BUILDER) --cflags)
--	LIBS += $(shell $(PCRE_BUILDER) --libs8)
-+	LIBS += $(shell $(PCRE_BUILDER) --libs 2>/dev/null) \
-+			$(shell $(PCRE_BUILDER) --libs$(word 2,$(subst -, ,$(PCRE_LIB))) 2>/dev/null)
- endif
-+DEFS += -D$(shell echo $(PCRE_VERSION) | tr 'a-z' 'A-Z')_LIB
- 
- include ../../Makefile.modules
-diff --git a/modules/dialplan/dialplan.c b/modules/dialplan/dialplan.c
-index 8bc7cfbec..d62ad80e9 100644
---- a/modules/dialplan/dialplan.c
-+++ b/modules/dialplan/dialplan.c
-@@ -86,12 +86,32 @@ static str database_url = {NULL, 0};
- 
- void *dp_srg = NULL;
- 
-+#ifdef PCRE2_LIB
- pcre2_general_context *dp_gcontext = NULL;
- pcre2_compile_context *dp_ccontext = NULL;
- 
--void * wrap_shm_malloc(PCRE2_SIZE size, void * memory_data);
--void wrap_shm_free(void * p, void * memory_data);
-+void * wrap_shm_malloc(PCRE2_SIZE size, void * memory_data)
-+{
-+	UNUSED(memory_data);
-+	return shm_malloc(size);
-+}
-+
-+void  wrap_shm_free(void * p, void * memory_data)
-+{
-+	UNUSED(memory_data);
-+	shm_free(p);
-+}
-+#else
-+void * wrap_shm_malloc(size_t size)
-+{
-+	return shm_malloc(size);
-+}
- 
-+void  wrap_shm_free(void * p )
-+{
-+	shm_free(p);
-+}
-+#endif
- 
- static const param_export_t mod_params[]={
- 	{ "partition",		STR_PARAM|USE_FUNC_PARAM,
-@@ -404,6 +424,7 @@ static int mod_init(void)
- 		return -1;
- 	}
- 
-+#ifdef PCRE2_LIB
- 	dp_gcontext = pcre2_general_context_create(wrap_shm_malloc, wrap_shm_free, NULL);
- 	if (!dp_gcontext) {
- 		LM_ERR("Unable to create pcre general context\n");
-@@ -415,6 +436,8 @@ static int mod_init(void)
- 		LM_ERR("Unable to create pcre compile context\n");
- 		return -1;
- 	}
-+#endif
-+
- 
- 	return 0;
- }
-@@ -470,7 +493,7 @@ static void mod_destroy(void)
- 	}
- 
- 	destroy_data();
--
-+#ifdef PCRE2_LIB
- 	if (dp_ccontext)
- 	{
- 		pcre2_compile_context_free(dp_ccontext);
-@@ -482,6 +505,7 @@ static void mod_destroy(void)
- 		pcre2_general_context_free(dp_gcontext);
- 		dp_gcontext = NULL;
- 	}
-+#endif
- }
- 
- 
-@@ -899,25 +923,21 @@ static mi_response_t *mi_translate3(const mi_params_t *params,
- }
- 
- 
--void * wrap_shm_malloc(PCRE2_SIZE size, void * memory_data)
--{
--	UNUSED(memory_data);
--	return shm_malloc(size);
--}
--
--void wrap_shm_free(void * p, void * memory_data)
--{
--	UNUSED(memory_data);
--	shm_free(p);
--}
--
- pcre2_code * wrap_pcre_compile(char *  pattern, int flags)
- {
- 	pcre2_code * ret ;
--	int error;
-+	PCRE2_ERR error;
- 	PCRE2_SIZE erroffset;
- 	int pcre_flags = 0;
- 
-+#ifndef PCRE2_LIB
-+	void *(*old_malloc)(size_t) = pcre_malloc;
-+	void  (*old_free)(void *) = pcre_free;
-+
-+	pcre_malloc = wrap_shm_malloc;
-+	pcre_free = wrap_shm_free;
-+#endif
-+
- 	if (flags & DP_CASE_INSENSITIVE)
- 		pcre_flags |= PCRE2_CASELESS;
- 
-@@ -929,6 +949,11 @@ pcre2_code * wrap_pcre_compile(char *  pattern, int flags)
- 			&erroffset,			/* for error offset */
- 			dp_ccontext);                      /* compile context, to allocate memory in shm */
- 
-+#ifndef PCRE2_LIB
-+	pcre_malloc = old_malloc;
-+	pcre_free = old_free;
-+#endif
-+
- 	return ret;
- }
- 
-diff --git a/modules/dialplan/dialplan.h b/modules/dialplan/dialplan.h
-index d798ae4a7..7d1578e79 100644
---- a/modules/dialplan/dialplan.h
-+++ b/modules/dialplan/dialplan.h
-@@ -31,8 +31,25 @@
- 
- #include "../../db/db.h"
- #include "../../re.h"
-+
-+#ifdef PCRE2_LIB
- #define PCRE2_CODE_UNIT_WIDTH 8
-+#define PCRE2_ERR int
- #include <pcre2.h>
-+#else
-+/* backwards compatibility */
-+#define pcre2_code pcre
-+#define PCRE2_CASELESS PCRE_CASELESS
-+#define PCRE2_SIZE int
-+#define PCRE2_ERR const char *
-+#define pcre2_pattern_info(subst_comp, flag, ret) \
-+	pcre_fullinfo(subst_comp, NULL, PCRE_INFO_CAPTURECOUNT, ret);
-+#define PCRE2_SPTR char *
-+#define pcre2_compile(pattern, _, flags, error, erroffset, ctx) \
-+	pcre_compile(pattern, flags, error, erroffset, NULL)
-+#include <pcre.h>
-+#endif
-+
- 
- #define REGEX_OP	1
- #define EQUAL_OP	0
-diff --git a/modules/dialplan/dp_repl.c b/modules/dialplan/dp_repl.c
-index 0764148a9..c6b97c23e 100644
---- a/modules/dialplan/dp_repl.c
-+++ b/modules/dialplan/dp_repl.c
-@@ -401,16 +401,36 @@ int test_match(str string, pcre2_code * exp, int * out, int out_max)
- 	int i, result_count;
- 	char *substring_start;
- 	int substring_length;
-+#ifdef PCRE2_LIB
- 	pcre2_match_data *match_data;
- 	PCRE2_SIZE *ovector;
--	UNUSED(substring_start);
--	UNUSED(substring_length);
-+#endif
- 
- 	if(!exp){
- 		LM_ERR("invalid compiled expression\n");
- 		return -1;
- 	}
- 
-+#ifndef PCRE2_LIB
-+	result_count = pcre_exec(
-+							exp, /* the compiled pattern */
-+							NULL, /* no extra data - we didn't study the pattern */
-+							string.s, /* the subject string */
-+							string.len, /* the length of the subject */
-+							0, /* start at offset 0 in the subject */
-+							0, /* default options */
-+							out, /* output vector for substring information */
-+							out_max); /* number of elements in the output vector */
-+
-+	if( result_count < 0 )
-+		return result_count;
-+
-+	if( result_count == 0)
-+	{
-+		LM_ERR("Not enough space for mathing\n");
-+		return result_count;
-+	}
-+#else
- 	match_data = pcre2_match_data_create_from_pattern(exp, NULL);
- 	if (!match_data) {
- 		LM_ERR("failed to allocate match data\n");
-@@ -447,6 +467,8 @@ int test_match(str string, pcre2_code * exp, int * out, int out_max)
- 	for (i = 0; i < result_count * 2; i++)
- 		out[i] = ovector[i];
- 	pcre2_match_data_free(match_data);
-+#endif
-+
- 
- 	for (i = 0; i < result_count; i++)
- 	{

diff --git a/opensips-0019-update-regex-module-for-pcre2.patch b/opensips-0019-update-regex-module-for-pcre2.patch
deleted file mode 100644
index c27d61e..0000000
--- a/opensips-0019-update-regex-module-for-pcre2.patch
+++ /dev/null
@@ -1,264 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Steve Ayre <steven.ayre@dubber.net>
-Date: Wed, 17 Sep 2025 22:11:25 +0100
-Subject: [PATCH] update regex module for pcre2
-
-(cherry picked from commit 3cc28d166b5a3d7db2cd2d944406480e5a1474f5)
-
-diff --git a/modules/regex/Makefile b/modules/regex/Makefile
-index 496c0438e..b4c2dfe07 100644
---- a/modules/regex/Makefile
-+++ b/modules/regex/Makefile
-@@ -21,10 +21,10 @@ ifeq ($(PCRE_BUILDER),)
- 	DEFS += -I$(SYSBASE)/include \
- 			-I$(LOCALBASE)/include
- 	LIBS += -L$(SYSBASE)/lib \
--			-L$(LOCALBASE)/lib -lpcre
-+			-L$(LOCALBASE)/lib -lpcre2-8
- else
- 	DEFS += $(shell $(PCRE_BUILDER) --cflags)
--	LIBS += $(shell $(PCRE_BUILDER) --libs)
-+	LIBS += $(shell $(PCRE_BUILDER) --libs8)
- endif
- 
- include ../../Makefile.modules
-diff --git a/modules/regex/regex_mod.c b/modules/regex/regex_mod.c
-index d1a91449c..9311d2b93 100644
---- a/modules/regex/regex_mod.c
-+++ b/modules/regex/regex_mod.c
-@@ -58,6 +58,8 @@
- #define MAX_GROUPS 20            /*!< Max number of groups */
- #define GROUP_MAX_SIZE 8192      /*!< Max size of a group */
- 
-+#define ERROR_BUF_SIZE 100
-+
- 
- /*
-  * Locking variables
-@@ -80,8 +82,8 @@ static int pcre_extended         = 0;
- /*
-  * Module internal parameter variables
-  */
--static pcre **pcres;
--static pcre ***pcres_addr;
-+static pcre2_code **pcres;
-+static pcre2_code ***pcres_addr;
- static int *num_pcres;
- static int pcre_options = 0x00000000;
- 
-@@ -221,24 +223,24 @@ static int mod_init(void)
- 		/* PCRE options */
- 		if (pcre_caseless != 0) {
- 			LM_DBG("PCRE CASELESS enabled\n");
--			pcre_options = pcre_options | PCRE_CASELESS;
-+			pcre_options = pcre_options | PCRE2_CASELESS;
- 		}
- 		if (pcre_multiline != 0) {
- 			LM_DBG("PCRE MULTILINE enabled\n");
--			pcre_options = pcre_options | PCRE_MULTILINE;
-+			pcre_options = pcre_options | PCRE2_MULTILINE;
- 		}
- 		if (pcre_dotall != 0) {
- 			LM_DBG("PCRE DOTALL enabled\n");
--			pcre_options = pcre_options | PCRE_DOTALL;
-+			pcre_options = pcre_options | PCRE2_DOTALL;
- 		}
- 		if (pcre_extended != 0) {
- 			LM_DBG("PCRE EXTENDED enabled\n");
--			pcre_options = pcre_options | PCRE_EXTENDED;
-+			pcre_options = pcre_options | PCRE2_EXTENDED;
- 		}
- 		LM_DBG("PCRE options: %i\n", pcre_options);
- 
- 		/* Pointer to pcres */
--		if ((pcres_addr = shm_malloc(sizeof(pcre **))) == 0) {
-+		if ((pcres_addr = shm_malloc(sizeof(pcre2_code **))) == 0) {
- 			LM_ERR("no memory for pcres_addr\n");
- 			goto err;
- 		}
-@@ -279,13 +281,14 @@ static int load_pcres(int action)
- 	FILE *f;
- 	char line[FILE_MAX_LINE];
- 	char **patterns = NULL;
--	pcre *pcre_tmp = NULL;
--	int pcre_size;
-+	pcre2_code *pcre_tmp = NULL;
-+	size_t pcre_size;
- 	int pcre_rc;
--	const char *pcre_error;
--	int pcre_erroffset;
-+	int pcre_error;
-+	PCRE2_UCHAR pcre_error_str[ERROR_BUF_SIZE];
-+	PCRE2_SIZE pcre_erroffset;
- 	int num_pcres_tmp = 0;
--	pcre **pcres_tmp = NULL;
-+	pcre2_code **pcres_tmp = NULL;
- 
- 	/* Get the lock */
- 	lock_get(reload_lock);
-@@ -420,7 +423,7 @@ static int load_pcres(int action)
- 	}
- 
- 	/* Temporal pointer of pcres */
--	if ((pcres_tmp = pkg_malloc(sizeof(pcre *) * num_pcres_tmp)) == 0) {
-+	if ((pcres_tmp = pkg_malloc(sizeof(pcre2_code *) * num_pcres_tmp)) == 0) {
- 		LM_ERR("no more memory for pcres_tmp\n");
- 		goto err;
- 	}
-@@ -431,14 +434,15 @@ static int load_pcres(int action)
- 	/* Compile the patters */
- 	for (i=0; i<num_pcres_tmp; i++) {
- 
--		pcre_tmp = pcre_compile(patterns[i], pcre_options, &pcre_error, &pcre_erroffset, NULL);
-+		pcre_tmp = pcre2_compile((PCRE2_SPTR)patterns[i], PCRE2_ZERO_TERMINATED, pcre_options, &pcre_error, &pcre_erroffset, NULL);
- 		if (pcre_tmp == NULL) {
--			LM_ERR("pcre_tmp compilation of '%s' failed at offset %d: %s\n", patterns[i], pcre_erroffset, pcre_error);
-+                	pcre2_get_error_message(pcre_error, pcre_error_str, sizeof(pcre_error_str));
-+			LM_ERR("pcre_tmp compilation of '%s' failed at offset %ld: %s\n", patterns[i], pcre_erroffset, pcre_error_str);
- 			goto err;
- 		}
--		pcre_rc = pcre_fullinfo(pcre_tmp, NULL, PCRE_INFO_SIZE, &pcre_size);
-+		pcre_rc = pcre2_pattern_info(pcre_tmp, PCRE2_INFO_SIZE, &pcre_size);
- 		if (pcre_rc) {
--			printf("pcre_fullinfo on compiled pattern[%i] yielded error: %d\n", i, pcre_rc);
-+			printf("pcre2_pattern_info on compiled pattern[%i] yielded error: %d\n", i, pcre_rc);
- 			goto err;
- 		}
- 
-@@ -448,7 +452,7 @@ static int load_pcres(int action)
- 		}
- 
- 		memcpy(pcres_tmp[i], pcre_tmp, pcre_size);
--		pcre_free(pcre_tmp);
-+		pcre2_code_free(pcre_tmp);
- 		pkg_free(patterns[i]);
- 	}
- 
-@@ -461,7 +465,7 @@ static int load_pcres(int action)
- 		}
- 		shm_free(pcres);
- 	}
--	if ((pcres = shm_malloc(sizeof(pcre *) * num_pcres_tmp)) == 0) {
-+	if ((pcres = shm_malloc(sizeof(pcre2_code *) * num_pcres_tmp)) == 0) {
- 		LM_ERR("no more memory for pcres\n");
- 		goto err;
- 	}
-@@ -469,7 +473,7 @@ static int load_pcres(int action)
- 		pcres[i] = NULL;
- 	}
- 	for (i=0; i<num_pcres_tmp; i++) {
--		pcre_rc = pcre_fullinfo(pcres_tmp[i], NULL, PCRE_INFO_SIZE, &pcre_size);
-+		pcre_rc = pcre2_pattern_info(pcres_tmp[i], PCRE2_INFO_SIZE, &pcre_size);
- 		if ((pcres[i] = shm_malloc(pcre_size)) == 0) {
- 			LM_ERR("no more memory for pcres[%i]\n", i);
- 			goto err;
-@@ -555,48 +559,54 @@ static void free_shared_memory(void)
- /*! \brief Return true if the argument matches the regular expression parameter */
- static int w_pcre_match(struct sip_msg* _msg, str* string, str* _regex_s)
- {
--	pcre *pcre_re = NULL;
-+	pcre2_code *pcre_re = NULL;
- 	int pcre_rc;
--	const char *pcre_error;
--	int pcre_erroffset;
-+	int pcre_error;
-+	PCRE2_UCHAR pcre_error_str[ERROR_BUF_SIZE];
-+	PCRE2_SIZE pcre_erroffset;
-+	pcre2_match_data *match_data;
- 	str regex;
- 
- 	if (pkg_nt_str_dup(&regex, _regex_s) < 0)
- 		return -1;
- 
--	pcre_re = pcre_compile(regex.s, pcre_options, &pcre_error, &pcre_erroffset, NULL);
-+	pcre_re = pcre2_compile((PCRE2_SPTR)regex.s, PCRE2_ZERO_TERMINATED, pcre_options, &pcre_error, &pcre_erroffset, NULL);
- 	if (pcre_re == NULL) {
--		LM_ERR("pcre_re compilation of '%s' failed at offset %d: %s\n", regex.s, pcre_erroffset, pcre_error);
-+                pcre2_get_error_message(pcre_error, pcre_error_str, sizeof(pcre_error_str));
-+		LM_ERR("pcre_re compilation of '%s' failed at offset %ld: %s\n", regex.s, pcre_erroffset, pcre_error_str);
- 		pkg_free(regex.s);
- 		return -4;
- 	}
- 
--	pcre_rc = pcre_exec(
-+	match_data = pcre2_match_data_create(0, NULL); // no captures needed
-+
-+	pcre_rc = pcre2_match(
- 		pcre_re,                    /* the compiled pattern */
--		NULL,                       /* no extra data - we didn't study the pattern */
--		string->s,                   /* the matching string */
--		(int)(string->len),          /* the length of the subject */
-+		(PCRE2_SPTR)string->s,                  /* the matching string */
-+		(PCRE2_SIZE)(string->len),  /* the length of the subject */
- 		0,                          /* start at offset 0 in the string */
- 		0,                          /* default options */
--		NULL,                       /* output vector for substring information */
--		0);                         /* number of elements in the output vector */
-+		match_data,                 /* match data block */
-+		NULL);                      /* match context */
-+
-+	pcre2_match_data_free(match_data);
- 
- 	/* Matching failed: handle error cases */
- 	if (pcre_rc < 0) {
- 		switch(pcre_rc) {
--			case PCRE_ERROR_NOMATCH:
-+			case PCRE2_ERROR_NOMATCH:
- 				LM_DBG("'%s' doesn't match '%s'\n", string->s, regex.s);
- 				break;
- 			default:
- 				LM_DBG("matching error '%d'\n", pcre_rc);
- 				break;
- 		}
--		pcre_free(pcre_re);
-+		pcre2_code_free(pcre_re);
- 		pkg_free(regex.s);
- 		return -1;
- 	}
- 
--	pcre_free(pcre_re);
-+	pcre2_code_free(pcre_re);
- 	pkg_free(regex.s);
- 	LM_DBG("'%s' matches '%s'\n", string->s, regex.s);
- 	return 1;
-@@ -608,6 +618,7 @@ static int w_pcre_match_group(struct sip_msg* _msg, str* string, int* _num_pcre)
- {
- 	int num_pcre;
- 	int pcre_rc;
-+	pcre2_match_data *match_data;
- 
- 	/* Check if group matching feature is enabled */
- 	if (file == NULL) {
-@@ -627,22 +638,25 @@ static int w_pcre_match_group(struct sip_msg* _msg, str* string, int* _num_pcre)
- 
- 	lock_get(reload_lock);
- 
--	pcre_rc = pcre_exec(
-+	match_data = pcre2_match_data_create(0, NULL); // no captures needed
-+
-+	pcre_rc = pcre2_match(
- 		(*pcres_addr)[num_pcre],    /* the compiled pattern */
--		NULL,                       /* no extra data - we didn't study the pattern */
--		string->s,                   /* the matching string */
--		(int)(string->len),          /* the length of the subject */
-+		(PCRE2_SPTR)string->s,                  /* the matching string */
-+		(PCRE2_SIZE)(string->len),  /* the length of the subject */
- 		0,                          /* start at offset 0 in the string */
- 		0,                          /* default options */
--		NULL,                       /* output vector for substring information */
--		0);                         /* number of elements in the output vector */
-+		match_data,                 /* match data block */
-+		0);                         /* match context */
-+
-+	pcre2_match_data_free(match_data);
- 
- 	lock_release(reload_lock);
- 
- 	/* Matching failed: handle error cases */
- 	if (pcre_rc < 0) {
- 		switch(pcre_rc) {
--			case PCRE_ERROR_NOMATCH:
-+			case PCRE2_ERROR_NOMATCH:
- 				LM_DBG("'%s' doesn't match pcres[%i]\n", string->s, num_pcre);
- 				break;
- 			default:

diff --git a/opensips-0020-regex-allow-pcre3-library.patch b/opensips-0020-regex-allow-pcre3-library.patch
deleted file mode 100644
index 7a1a377..0000000
--- a/opensips-0020-regex-allow-pcre3-library.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Razvan Crainea <razvan@opensips.org>
-Date: Wed, 11 Feb 2026 16:15:11 +0200
-Subject: [PATCH] regex: allow pcre3 library
-
-
-diff --git a/modules/regex/Makefile b/modules/regex/Makefile
-index b4c2dfe07..d09aa245b 100644
---- a/modules/regex/Makefile
-+++ b/modules/regex/Makefile
-@@ -8,12 +8,16 @@ NAME=regex.so
- # the autodetection
- # CROSS_COMPILE=true
- 
-+PCRE_LIB ?= pcre2-8
-+PCRE_VERSION ?= $(word 1,$(subst -, , $(PCRE_LIB)))
-+PCRE_CONFIG ?= $(PCRE_VERSION)-config
-+
- ifeq ($(CROSS_COMPILE),)
- PCRE_BUILDER := $(shell \
--	if which pcre2-config >/dev/null 2>/dev/null; then \
--		echo 'pcre2-config'; \
--	elif pkg-config --exists libpcre2-8; then \
--		echo 'pkg-config libpcre2-8'; \
-+	if which $(PCRE_CONFIG) >/dev/null 2>/dev/null; then \
-+		echo '$(PCRE_CONFIG)'; \
-+	elif pkg-config --exists lib$(PCRE_LIB); then \
-+		echo 'pkg-config lib$(PCRE_LIB)'; \
- 	fi)
- endif
- 
-@@ -21,10 +25,12 @@ ifeq ($(PCRE_BUILDER),)
- 	DEFS += -I$(SYSBASE)/include \
- 			-I$(LOCALBASE)/include
- 	LIBS += -L$(SYSBASE)/lib \
--			-L$(LOCALBASE)/lib -lpcre2-8
-+			-L$(LOCALBASE)/lib -l$(PCRE_LIB)
- else
- 	DEFS += $(shell $(PCRE_BUILDER) --cflags)
--	LIBS += $(shell $(PCRE_BUILDER) --libs8)
-+	LIBS += $(shell $(PCRE_BUILDER) --libs 2>/dev/null) \
-+			$(shell $(PCRE_BUILDER) --libs$(word 2,$(subst -, ,$(PCRE_LIB))) 2>/dev/null)
- endif
-+DEFS += -D$(shell echo $(PCRE_VERSION) | tr 'a-z' 'A-Z')_LIB
- 
- include ../../Makefile.modules

diff --git a/opensips-0021-regex-make-module-work-with-both-pcre2-and-pcre3-not.patch b/opensips-0021-regex-make-module-work-with-both-pcre2-and-pcre3-not.patch
deleted file mode 100644
index afc6d60..0000000
--- a/opensips-0021-regex-make-module-work-with-both-pcre2-and-pcre3-not.patch
+++ /dev/null
@@ -1,149 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Razvan Crainea <razvan@opensips.org>
-Date: Thu, 19 Feb 2026 11:34:02 +0200
-Subject: [PATCH] regex: make module work with both pcre2 and pcre3, not just
- compile
-
-(cherry picked from commit bbc1a75d5ba25c0f26afcd208b0f5c7e1fffd3b7)
-
-diff --git a/modules/regex/regex_mod.c b/modules/regex/regex_mod.c
-index 9311d2b93..6734fb8bf 100644
---- a/modules/regex/regex_mod.c
-+++ b/modules/regex/regex_mod.c
-@@ -40,8 +40,36 @@
- #include <stdlib.h>
- #include <string.h>
- #include <sys/stat.h>
-+#ifdef PCRE2_LIB
- #define PCRE2_CODE_UNIT_WIDTH 8
-+#define PCRE2_ERR int
- #include <pcre2.h>
-+#else
-+#define pcre2_code pcre
-+#define PCRE2_SIZE int
-+#define PCRE2_ERR const char *
-+#define PCRE2_CASELESS PCRE_CASELESS
-+#define PCRE2_MULTILINE PCRE_MULTILINE
-+#define PCRE2_DOTALL PCRE_DOTALL
-+#define PCRE2_EXTENDED PCRE_EXTENDED
-+#define PCRE2_ERROR_NOMATCH PCRE_ERROR_NOMATCH
-+#define PCRE2_UCHAR unsigned char
-+#define PCRE2_SPTR char *
-+#define pcre2_pattern_info(subst_comp, flag, ret) \
-+	pcre_fullinfo(subst_comp, NULL, PCRE_INFO_CAPTURECOUNT, ret);
-+#define pcre2_compile(pattern, _, flags, error, erroffset, ctx) \
-+	pcre_compile(pattern, flags, error, erroffset, NULL)
-+#define pcre2_code_free pcre_free
-+#define pcre2_get_error_message(error, error_str, error_str_len) \
-+	do { \
-+		int _len = strlen(error); \
-+		if (_len > error_str_len - 1) \
-+			_len = error_str_len - 1; \
-+		memcpy(error_str, error, _len); \
-+		error_str[_len] = '\0'; \
-+	} while (0)
-+#include <pcre.h>
-+#endif
- #include "../../sr_module.h"
- #include "../../dprint.h"
- #include "../../pt.h"
-@@ -284,7 +312,7 @@ static int load_pcres(int action)
- 	pcre2_code *pcre_tmp = NULL;
- 	size_t pcre_size;
- 	int pcre_rc;
--	int pcre_error;
-+	PCRE2_ERR pcre_error;
- 	PCRE2_UCHAR pcre_error_str[ERROR_BUF_SIZE];
- 	PCRE2_SIZE pcre_erroffset;
- 	int num_pcres_tmp = 0;
-@@ -437,7 +465,7 @@ static int load_pcres(int action)
- 		pcre_tmp = pcre2_compile((PCRE2_SPTR)patterns[i], PCRE2_ZERO_TERMINATED, pcre_options, &pcre_error, &pcre_erroffset, NULL);
- 		if (pcre_tmp == NULL) {
-                 	pcre2_get_error_message(pcre_error, pcre_error_str, sizeof(pcre_error_str));
--			LM_ERR("pcre_tmp compilation of '%s' failed at offset %ld: %s\n", patterns[i], pcre_erroffset, pcre_error_str);
-+			LM_ERR("pcre_tmp compilation of '%s' failed at offset %zu: %s\n", patterns[i], (long)pcre_erroffset, pcre_error_str);
- 			goto err;
- 		}
- 		pcre_rc = pcre2_pattern_info(pcre_tmp, PCRE2_INFO_SIZE, &pcre_size);
-@@ -561,10 +589,12 @@ static int w_pcre_match(struct sip_msg* _msg, str* string, str* _regex_s)
- {
- 	pcre2_code *pcre_re = NULL;
- 	int pcre_rc;
--	int pcre_error;
-+	PCRE2_ERR pcre_error;
- 	PCRE2_UCHAR pcre_error_str[ERROR_BUF_SIZE];
- 	PCRE2_SIZE pcre_erroffset;
-+#ifdef PCRE2_LIB
- 	pcre2_match_data *match_data;
-+#endif
- 	str regex;
- 
- 	if (pkg_nt_str_dup(&regex, _regex_s) < 0)
-@@ -573,11 +603,22 @@ static int w_pcre_match(struct sip_msg* _msg, str* string, str* _regex_s)
- 	pcre_re = pcre2_compile((PCRE2_SPTR)regex.s, PCRE2_ZERO_TERMINATED, pcre_options, &pcre_error, &pcre_erroffset, NULL);
- 	if (pcre_re == NULL) {
-                 pcre2_get_error_message(pcre_error, pcre_error_str, sizeof(pcre_error_str));
--		LM_ERR("pcre_re compilation of '%s' failed at offset %ld: %s\n", regex.s, pcre_erroffset, pcre_error_str);
-+		LM_ERR("pcre_re compilation of '%s' failed at offset %zu: %s\n", regex.s, (long)pcre_erroffset, pcre_error_str);
- 		pkg_free(regex.s);
- 		return -4;
- 	}
- 
-+#ifndef PCRE2_LIB
-+	pcre_rc = pcre_exec(
-+			pcre_re, /* the compiled pattern */
-+			NULL, /* no extra data - we didn't study the pattern */
-+			string->s, /* the subject string */
-+			string->len, /* the length of the subject */
-+			0, /* start at offset 0 in the subject */
-+			0, /* default options */
-+			NULL, /* output vector for substring information */
-+			0); /* number of elements in the output vector */
-+#else
- 	match_data = pcre2_match_data_create(0, NULL); // no captures needed
- 
- 	pcre_rc = pcre2_match(
-@@ -590,6 +631,7 @@ static int w_pcre_match(struct sip_msg* _msg, str* string, str* _regex_s)
- 		NULL);                      /* match context */
- 
- 	pcre2_match_data_free(match_data);
-+#endif
- 
- 	/* Matching failed: handle error cases */
- 	if (pcre_rc < 0) {
-@@ -618,7 +660,9 @@ static int w_pcre_match_group(struct sip_msg* _msg, str* string, int* _num_pcre)
- {
- 	int num_pcre;
- 	int pcre_rc;
-+#ifdef PCRE2_LIB
- 	pcre2_match_data *match_data;
-+#endif
- 
- 	/* Check if group matching feature is enabled */
- 	if (file == NULL) {
-@@ -638,6 +682,17 @@ static int w_pcre_match_group(struct sip_msg* _msg, str* string, int* _num_pcre)
- 
- 	lock_get(reload_lock);
- 
-+#ifndef PCRE2_LIB
-+	pcre_rc = pcre_exec(
-+			(*pcres_addr)[num_pcre], /* the compiled pattern */
-+			NULL, /* no extra data - we didn't study the pattern */
-+			string->s, /* the subject string */
-+			string->len, /* the length of the subject */
-+			0, /* start at offset 0 in the subject */
-+			0, /* default options */
-+			NULL, /* output vector for substring information */
-+			0); /* number of elements in the output vector */
-+#else
- 	match_data = pcre2_match_data_create(0, NULL); // no captures needed
- 
- 	pcre_rc = pcre2_match(
-@@ -650,6 +705,7 @@ static int w_pcre_match_group(struct sip_msg* _msg, str* string, int* _num_pcre)
- 		0);                         /* match context */
- 
- 	pcre2_match_data_free(match_data);
-+#endif
- 
- 	lock_release(reload_lock);
- 

diff --git a/opensips-0022-regex-fix-broken-merge.patch b/opensips-0022-regex-fix-broken-merge.patch
deleted file mode 100644
index c8a3efd..0000000
--- a/opensips-0022-regex-fix-broken-merge.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Razvan Crainea <razvan@opensips.org>
-Date: Thu, 19 Feb 2026 12:37:26 +0200
-Subject: [PATCH] regex: fix broken merge
-
-(cherry picked from commit b0c1bcafa284977e53fc6b2ac6c659365f88404c)
-
-diff --git a/modules/regex/regex_mod.c b/modules/regex/regex_mod.c
-index 6734fb8bf..1ac492b25 100644
---- a/modules/regex/regex_mod.c
-+++ b/modules/regex/regex_mod.c
-@@ -465,7 +465,7 @@ static int load_pcres(int action)
- 		pcre_tmp = pcre2_compile((PCRE2_SPTR)patterns[i], PCRE2_ZERO_TERMINATED, pcre_options, &pcre_error, &pcre_erroffset, NULL);
- 		if (pcre_tmp == NULL) {
-                 	pcre2_get_error_message(pcre_error, pcre_error_str, sizeof(pcre_error_str));
--			LM_ERR("pcre_tmp compilation of '%s' failed at offset %zu: %s\n", patterns[i], (long)pcre_erroffset, pcre_error_str);
-+			LM_ERR("pcre_tmp compilation of '%s' failed at offset %lu: %s\n", patterns[i], (unsigned long)pcre_erroffset, pcre_error_str);
- 			goto err;
- 		}
- 		pcre_rc = pcre2_pattern_info(pcre_tmp, PCRE2_INFO_SIZE, &pcre_size);
-@@ -603,7 +603,7 @@ static int w_pcre_match(struct sip_msg* _msg, str* string, str* _regex_s)
- 	pcre_re = pcre2_compile((PCRE2_SPTR)regex.s, PCRE2_ZERO_TERMINATED, pcre_options, &pcre_error, &pcre_erroffset, NULL);
- 	if (pcre_re == NULL) {
-                 pcre2_get_error_message(pcre_error, pcre_error_str, sizeof(pcre_error_str));
--		LM_ERR("pcre_re compilation of '%s' failed at offset %zu: %s\n", regex.s, (long)pcre_erroffset, pcre_error_str);
-+		LM_ERR("pcre_re compilation of '%s' failed at offset %lu: %s\n", regex.s, (unsigned long)pcre_erroffset, pcre_error_str);
- 		pkg_free(regex.s);
- 		return -4;
- 	}

diff --git a/opensips.spec b/opensips.spec
index 74e105b..7e8697e 100644
--- a/opensips.spec
+++ b/opensips.spec
@@ -1,10 +1,10 @@
-%global git_commit 2367deb8e2c408a2d38e90d80b5a9580dbdff959
+%global git_commit eaee48e28e31e09d65f735b478d9ca57dc7ccced
 
 %global EXCLUDE_MODULES cachedb_cassandra cachedb_dynamodb %{!?_with_oracle:db_oracle} event_sqs example launch_darkly osp rtp.io sngtc tls_wolfssl
 
 Summary:  Open Source SIP Server
 Name:     opensips
-Version:  3.6.4
+Version:  3.6.7
 Release:  %autorelease
 License:  GPL-2.0-or-later
 Source0:  https://github.com/%{name}/%{name}/archive/%{version}/%{name}-%{version}.tar.gz
@@ -18,20 +18,8 @@ Patch: opensips-0005-Fix-rabbitmq-c-deprecated-header-warnings.patch
 Patch: opensips-0006-Fix-uninitialized-variable-warnings-in-SQL-API-funct.patch
 Patch: opensips-0007-Fix-const-correctness-warnings-in-HTTP-and-FreeSWITC.patch
 Patch: opensips-0008-Fix-uninitialized-va_list-warning-on-ppc64le-and-i68.patch
-Patch: opensips-0009-Fix-format-specifier-warnings-on-32-bit-architecture.patch
-Patch: opensips-0010-Fix-pointer-truncation-warning-on-32-bit-architectur.patch
-Patch: opensips-0011-Fix-C90-style-declaration-warnings-in-snmpstats-modu.patch
-Patch: opensips-0012-support-for-libmongc-libbson-version-2.patch
-Patch: opensips-0013-require-libpcre2.patch
-Patch: opensips-0014-update-dialplan-module-for-pcre2.patch
-Patch: opensips-0015-create-pcre2-compile-context-once-instead-of-for-eac.patch
-Patch: opensips-0016-Makefile-tweaks-to-avoid-shell-.-expansions-from-fai.patch
-Patch: opensips-0017-dialplan-fix-copying-subst-s-out-vector.patch
-Patch: opensips-0018-dialplan-make-module-work-with-both-pcre2-and-pcre3-.patch
-Patch: opensips-0019-update-regex-module-for-pcre2.patch
-Patch: opensips-0020-regex-allow-pcre3-library.patch
-Patch: opensips-0021-regex-make-module-work-with-both-pcre2-and-pcre3-not.patch
-Patch: opensips-0022-regex-fix-broken-merge.patch
+Patch: opensips-0009-Fix-pointer-truncation-warning-on-32-bit-architectur.patch
+Patch: opensips-0010-Fix-C90-style-declaration-warnings-in-snmpstats-modu.patch
 
 URL:      https://opensips.org
 

diff --git a/sources b/sources
index 1155b7a..5f878c3 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (opensips-3.6.4.tar.gz) = 0aacdbb3f321c71f0a0723cd7fd4837e657e1228224e3ee6237beec5c5639e49b0da5bc0444929f3465703eafdb76b72443dc46105715b56ad7becaaea10f66d
+SHA512 (opensips-3.6.7.tar.gz) = 1750b1b76b549a2442b8a27d4a9b10a79ff670d1f7a7075d471fcc050d47b39ea9b78d8545ac3b4132b3611b2c411580436393829fb45130c7915f3bcc794f3b

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2026-06-24 17:39 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-06-24 17:39 [rpms/opensips] f44: OpenSIPS ver. 3.6.7 Peter Lemenkov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox