public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/opensips] f43: OpenSIPS ver. 3.6.7
@ 2026-06-24 17:40 Peter Lemenkov
0 siblings, 0 replies; only message in thread
From: Peter Lemenkov @ 2026-06-24 17:40 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/opensips
Branch : f43
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=f43
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(®ex, _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(®ex, _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:40 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:40 [rpms/opensips] f43: 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