public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/opensips] f45: OpenSIPS ver. 4.0.1
@ 2026-08-19 17:26 Peter Lemenkov
0 siblings, 0 replies; only message in thread
From: Peter Lemenkov @ 2026-08-19 17:26 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/opensips
Branch : f45
Commit : 9dcaaff7f89d80b004b529e854880e9079a04f37
Author : Peter Lemenkov <lemenkov@gmail.com>
Date : 2026-08-19T18:40:23+02:00
Stats : +724/-1653 in 14 file(s)
URL : https://src.fedoraproject.org/rpms/opensips/c/9dcaaff7f89d80b004b529e854880e9079a04f37?branch=f45
Log:
OpenSIPS ver. 4.0.1
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 c14856b..81c56a0 100644
--- a/opensips-0001-Consistently-use-rtpproxy-switches.patch
+++ b/opensips-0001-Consistently-use-rtpproxy-switches.patch
@@ -5,19 +5,19 @@ 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 a93761a66d..b185166786 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")
- connection information.
- </para></listitem>
- <listitem><para>
-- <emphasis>s/w</emphasis> - flags that for the UA from which
-+ <emphasis>s</emphasis> - flags that for the UA from which
- message is received, support symmetric RTP must be forced.
- </para></listitem>
- <listitem><para>
+diff --git a/modules/rtpproxy/README.md b/modules/rtpproxy/README.md
+index 081b2bfa16..0e232678d1 100644
+--- a/modules/rtpproxy/README.md
++++ b/modules/rtpproxy/README.md
+@@ -512,7 +512,7 @@ description (o=) should be also changed.
+ - *c* - flags to change the session-level
+ SDP connection (c=) IP if media-description also includes
+ connection information.
+- - *s/w* - flags that for the UA from which
++ - *s* - flags that for the UA from which
+ message is received, support symmetric RTP must be forced.
+ - *n[<SOCKET>]* - flags that enables
+ the notification timeout for the session. One can specify an
diff --git a/modules/rtpproxy/rtpproxy.c b/modules/rtpproxy/rtpproxy.c
index 3cf24c9d46..570008b254 100644
--- a/modules/rtpproxy/rtpproxy.c
diff --git a/opensips-0005-Fix-rabbitmq-c-deprecated-header-warnings.patch b/opensips-0005-Fix-rabbitmq-c-deprecated-header-warnings.patch
deleted file mode 100644
index 208c50b..0000000
--- a/opensips-0005-Fix-rabbitmq-c-deprecated-header-warnings.patch
+++ /dev/null
@@ -1,470 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Peter Lemenkov <lemenkov@gmail.com>
-Date: Sun, 26 Oct 2025 15:29:04 +0100
-Subject: [PATCH] Fix rabbitmq-c deprecated header warnings
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-During compilation of event_rabbitmq module, several warnings appear:
-
-```
-Compiling rabbitmq_consumer.c
-gcc -fPIC -DPIC -O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wno-complain-wrong-lang -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -DMOD_NAME='rabbitmq_consumer' -DPKG_MALLOC -DSHM_MMAP -DUSE_MCAST -DDISABLE_NAGLE -DSTATISTICS -DHAVE_RESOLV_RES -DF_MALLOC -DQ_MALLOC -DHP_MALLOC -DDBG_MALLOC -DF_PARALLEL_MALLOC -DHAVE_STDATOMIC -DHAVE_GENERICS -DNAME='"opensips"' -DVERSION='"3.6.2"' -DARCH='"x86_64"' -DOS='"linux"' -DCOMPILER='"gcc 15"' -D__CPU_x86_64 -D__OS_linux -D__SMP_yes -DCFG_DIR='"/etc/opensips/"' -DVERSIONTYPE='"git"' -DTHISREVISION='"994bcd690"' -DFAST_LOCK -DADAPTIVE_WAIT -DADAPTIVE_WAIT_LOOPS=1024 -DHAVE_GETHOSTBYNAME2 -DHAVE_UNION_SEMUN -DHAVE_MSG_NOSIGNAL -DHAVE_MSGHDR_MSG_CONTROL -DHAVE_ALLOCA_H -DHAVE_TIMEGM -DHAVE_EPOLL -DHAVE_SIGIO_RT -DHAVE_SELECT -c rabbitmq_consumer.c -o rabbitmq_consumer.o
-In file included from rmq_connection.h:25,
- from rabbitmq_consumer.c:25:
-/usr/include/amqp.h:10:5: warning: #warning "amqp.h is deprecated, use rabbitmq-c/amqp.h instead." [-Wcpp]
- 10 | # warning "amqp.h is deprecated, use rabbitmq-c/amqp.h instead."
- | ^~~~~~~
-In file included from rmq_connection.h:26:
-/usr/include/amqp_tcp_socket.h:10:5: warning: #warning "amqp_tcp_socket.h is deprecated, use rabbitmq-c/tcp_socket.h instead." [-Wcpp]
- 10 | # warning "amqp_tcp_socket.h is deprecated, use rabbitmq-c/tcp_socket.h instead."
- | ^~~~~~~
-In file included from rmq_connection.h:27:
-/usr/include/amqp_ssl_socket.h:12:5: warning: #warning "amqp_ssl_socket.h is deprecated, use rabbitmq-c/ssl_socket.h instead." [-Wcpp]
- 12 | # warning "amqp_ssl_socket.h is deprecated, use rabbitmq-c/ssl_socket.h instead."
- | ^~~~~~~
-rabbitmq_consumer.c: In function ‘mod_init’:
-rabbitmq_consumer.c:99:17: warning: ‘amqp_set_initialize_ssl_library’ is deprecated [-Wdeprecated-declarations]
- 99 | amqp_set_initialize_ssl_library(0);
- | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-In file included from /usr/include/amqp_ssl_socket.h:15:
-/usr/include/rabbitmq-c/ssl_socket.h:250:16: note: declared here
- 250 | void AMQP_CALL amqp_set_initialize_ssl_library(amqp_boolean_t do_initialize);
- | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-```
-
-The rabbitmq-c library reorganized headers into a rabbitmq-c/
-subdirectory in version 0.8.0 (2017). The old top-level headers remain
-as deprecated wrappers that emit warnings. Additionally, the function
-amqp_set_initialize_ssl_library() was deprecated in version 0.13.0
-(2022) as SSL initialization became automatic.
-
-Changes made:
-
-1. Removed obsolete version guard for rabbitmq-c 0.4.0:
- The guard checking AMQP_VERSION >= 0x00040000 and defining
- AMQP_VERSION_v04 was needed for ancient versions (2013). All currently
- supported distributions ship rabbitmq-c >= 0.9.0, making this check
- unnecessary.
-
-2. Updated header includes to use rabbitmq-c/ subdirectory:
- - Changed: #include <amqp.h>
- - To: #include <rabbitmq-c/amqp.h>
- - Applied to: amqp.h, amqp_framing.h, amqp_tcp_socket.h, amqp_ssl_socket.h
-
-3. Added version guard for amqp_set_initialize_ssl_library():
- This function is called with argument 0 to tell rabbitmq-c NOT to
- initialize OpenSSL, since OpenSIPS manages its own SSL/TLS stack at a
- higher level. The function is needed for rabbitmq-c < 0.13.0 but was
- deprecated in 0.13.0 when the library made SSL initialization behavior
- configurable by default.
-
- Changed:
- amqp_set_initialize_ssl_library(0);
- To:
- #if AMQP_VERSION < AMQP_VERSION_CODE(0, 13, 0, 0)
- amqp_set_initialize_ssl_library(0);
- #endif
-
-Note: The existing version guard for AMQP_VERSION < 0.10.0 (ssl_lock) was
-preserved as it handles real API differences between 0.9.x and 0.10.0+
-versions still present in current distributions.
-
-Compatibility analysis:
-
-Survey of actively supported distributions shows all ship rabbitmq-c >= 0.9.0:
-
-- RHEL/Rocky/Alma 8/9: >= 0.9.0
-- Ubuntu 20.04/22.04/24.04: >= 0.9.0
-- Debian 11/12: >= 0.9.0
-- Fedora 39/40/41: >= 0.13.0
-- macOS Homebrew: 0.15.0
-- macOS MacPorts: 0.11.0
-
-The 0.4.0 compatibility code (from 2013) is no longer needed. The 0.13.0
-guard is necessary as some LTS distributions still ship 0.9.x-0.12.x.
-
-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 7cb213f35a..5351eadcc6 100644
---- a/modules/event_rabbitmq/README
-+++ b/modules/event_rabbitmq/README
-@@ -130,7 +130,7 @@ Chapter 1. Admin Guide
-
- The following libraries or applications must be installed
- before running OpenSIPS with this module loaded:
-- * librabbitmq-dev
-+ * librabbitmq-dev ver. 0.9 or higher
-
- 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 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 @@
- <itemizedlist>
- <listitem>
- <para>
-- <emphasis>librabbitmq-dev</emphasis>
-+ <emphasis>librabbitmq-dev ver. 0.9 or higher</emphasis>
- </para>
- </listitem>
- </itemizedlist>
-diff --git a/modules/event_rabbitmq/event_rabbitmq.c b/modules/event_rabbitmq/event_rabbitmq.c
-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;
- static int rmq_connect_timeout = RMQ_DEFAULT_CONNECT_TIMEOUT;
- static int rmq_timeout = 0;
- struct timeval conn_timeout_tv;
--#if defined AMQP_VERSION && AMQP_VERSION >= 0x00090000
- struct timeval rpc_timeout_tv;
--#endif
- int use_tls;
- struct tls_mgm_binds tls_api;
- struct openssl_binds openssl_api;
-@@ -201,24 +199,14 @@ static int mod_init(void)
- conn_timeout_tv.tv_sec = rmq_connect_timeout/1000;
- conn_timeout_tv.tv_usec = (rmq_connect_timeout%1000)*1000;
-
--#if defined AMQP_VERSION && AMQP_VERSION >= 0x00090000
- if (rmq_timeout < 0) {
- LM_WARN("invalid value for 'timeout' %d; fallback to blocking mode\n", rmq_timeout);
- rmq_timeout = 0;
- }
- rpc_timeout_tv.tv_sec = rmq_timeout/1000;
- rpc_timeout_tv.tv_usec = (rmq_timeout%1000)*1000;
--#else
-- if (rmq_timeout != 0)
-- LM_WARN("setting the timeout without support for it; fallback to blocking mode\n");
--#endif
-
- if (use_tls) {
-- #ifndef AMQP_VERSION_v04
-- LM_ERR("TLS not supported for librabbitmq version lower than 0.4.0\n");
-- return -1;
-- #endif
--
- if (load_tls_openssl_api(&openssl_api)) {
- LM_DBG("Failed to load openssl API\n");
- return -1;
-@@ -241,7 +229,9 @@ static int mod_init(void)
- }
- #endif
-
-+#if AMQP_VERSION < AMQP_VERSION_CODE(0, 13, 0, 0)
- amqp_set_initialize_ssl_library(0);
-+#endif
- }
-
- return 0;
-diff --git a/modules/event_rabbitmq/event_rabbitmq.h b/modules/event_rabbitmq/event_rabbitmq.h
-index 5b1158e16f..b27c2ad64d 100644
---- a/modules/event_rabbitmq/event_rabbitmq.h
-+++ b/modules/event_rabbitmq/event_rabbitmq.h
-@@ -27,13 +27,10 @@
- #ifndef _EV_RMQ_H_
- #define _EV_RMQ_H_
-
--#include <amqp.h>
--#include <amqp_framing.h>
--#if defined AMQP_VERSION && AMQP_VERSION >= 0x00040000
-- #define AMQP_VERSION_v04
--#include <amqp_tcp_socket.h>
--#include <amqp_ssl_socket.h>
--#endif
-+#include <rabbitmq-c/amqp.h>
-+#include <rabbitmq-c/framing.h>
-+#include <rabbitmq-c/tcp_socket.h>
-+#include <rabbitmq-c/ssl_socket.h>
-
- #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 d920e599d1..d1f6a19ab4 100644
---- a/modules/event_rabbitmq/rmq_servers.c
-+++ b/modules/event_rabbitmq/rmq_servers.c
-@@ -33,61 +33,7 @@
-
- #include "rmq_servers.h"
- #include "rabbitmq_send.h"
--#include <amqp_framing.h>
--
--#ifdef AMQP_VERSION_v04
--#define rmq_parse_rm amqp_parse_url
--#else
--#include "../../db/db_id.h"
--#warning "You are using an old, unsupported RabbitMQ library version - compile on your own risk!"
--/* ugly hack to move ptr from id to rmq_uri */
--#define PTR_MOVE(_from, _to) \
-- do { \
-- (_to) = (_from); \
-- (_from) = NULL; \
-- } while(0)
--static inline int rmq_parse_rm(char *url, rmq_uri *uri)
--{
-- str surl;
-- struct db_id *id;
--
-- surl.s = url;
-- surl.len = strlen(url);
--
-- if ((id = new_db_id(&surl)) == NULL)
-- return -1;
--
-- if (strcmp(id->scheme, "amqps") == 0)
-- uri->ssl = 1;
--
-- /* there might me a pkg leak compared to the newer version, but parsing
-- * only happends at startup, so we should not worry about this now */
-- if (id->username)
-- PTR_MOVE(id->username, uri->user);
-- else
-- uri->user = "guest";
-- if (id->password)
-- PTR_MOVE(id->password, uri->password);
-- else
-- uri->password = "guest";
-- if (id->host)
-- PTR_MOVE(id->host, uri->host);
-- else
-- uri->host = "localhost";
-- if (id->database)
-- PTR_MOVE(id->database, uri->vhost);
-- else
-- uri->vhost = "/";
-- if (id->port)
-- uri->port = id->port;
-- else if (uri->ssl)
-- uri->port = 5671;
-- else
-- uri->port = 5672;
-- free_db_id(id);
-- return 0;
--}
--#endif
-+#include <rabbitmq-c/framing.h>
-
- static OSIPS_LIST_HEAD(rmq_servers);
-
-@@ -117,9 +63,6 @@ int rmq_error(char const *context, amqp_rpc_reply_t x)
- {
- amqp_connection_close_t *mconn;
- amqp_channel_close_t *mchan;
--#ifndef AMQP_VERSION_v04
-- char *errorstr;
--#endif
-
- switch (x.reply_type) {
- case AMQP_RESPONSE_NORMAL:
-@@ -130,13 +73,7 @@ int rmq_error(char const *context, amqp_rpc_reply_t x)
- break;
-
- case AMQP_RESPONSE_LIBRARY_EXCEPTION:
--#ifndef AMQP_VERSION_v04
-- errorstr = amqp_error_string(x.library_error);
-- LM_ERR("%s: %s\n", context, errorstr);
-- free(errorstr);
--#else
- LM_ERR("%s: %s\n", context, amqp_error_string2(x.library_error));
--#endif
- break;
-
- case AMQP_RESPONSE_SERVER_EXCEPTION:
-@@ -170,9 +107,7 @@ int rmq_error(char const *context, amqp_rpc_reply_t x)
- */
- int rmq_server_reconnect(rmq_connection_t *conn, char *address, int port, int max_frames, str cid)
- {
--#if defined AMQP_VERSION_v04
- amqp_socket_t *amqp_sock;
--#endif
- int socket;
-
- switch (conn->state) {
-@@ -182,7 +117,6 @@ int rmq_server_reconnect(rmq_connection_t *conn, char *address, int port, int ma
- LM_ERR("cannot create amqp connection!\n");
- return -1;
- }
--#if defined AMQP_VERSION_v04
- if (use_tls && (conn->uri.ssl || (conn->flags&RMQ_PARAM_TLS))) {
- if (!conn->tls_dom) {
- conn->tls_dom = tls_api.find_client_domain_name(&conn->tls_dom_name);
-@@ -314,16 +248,6 @@ int rmq_server_reconnect(rmq_connection_t *conn, char *address, int port, int ma
- amqp_set_rpc_timeout(conn->conn, &rpc_timeout_tv) < 0)
- LM_ERR("setting RPC timeout - going blocking\n");
- #endif
--
--#else
-- socket = amqp_open_socket_noblock(address, port,
-- &conn_timeout_tv);
-- if (socket < 0) {
-- LM_ERR("cannot open AMQP socket\n");
-- return -1;
-- }
-- amqp_set_sockfd(conn->conn, socket);
--#endif
- conn->state = RMQS_INIT;
- /* fall through */
- case RMQS_INIT:
-@@ -568,7 +492,7 @@ no_value:
- memcpy(uri, suri.s, suri.len);
- uri[suri.len] = 0;
-
-- if (rmq_parse_rm(uri, &srv->conn.uri) != 0) {
-+ if (amqp_parse_url(uri, &srv->conn.uri) != 0) {
- LM_ERR("[%.*s] cannot parse rabbitmq uri: %s\n", cid.len, cid.s, uri);
- goto free;
- }
-@@ -605,7 +529,7 @@ no_value:
- }
- memcpy(srv->conn.exchange.bytes, exchange.s, exchange.len);
- } else
-- srv->conn.exchange = RMQ_EMPTY;
-+ srv->conn.exchange = amqp_empty_bytes;
-
- srv->conn.state = RMQS_OFF;
- srv->cid = cid;
-@@ -677,16 +601,6 @@ void rmq_connect_servers(void)
-
- int amqp_check_status(rmq_connection_t *conn, int r, int *retry, str cid)
- {
--#ifndef AMQP_VERSION_v04
-- if (r != 0) {
-- LM_ERR("[%.*s] unknown AMQP error [%d] while sending\n",
-- srv->cid.len, srv->cid.s, r);
-- /* we close the connection here to be able to re-connect later */
-- /* TODO: close the connection */
-- return r;
-- }
-- return 0;
--#else
- switch (r) {
- case AMQP_STATUS_OK:
- return 0;
-@@ -741,7 +655,6 @@ no_close:
- return 1;
- }
- return r;
--#endif
- }
-
- 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 a700d80049..0d853f8f2b 100644
---- a/modules/event_rabbitmq/rmq_servers.h
-+++ b/modules/event_rabbitmq/rmq_servers.h
-@@ -40,7 +40,7 @@
-
- #include "../tls_openssl/openssl_api.h"
- #include "../tls_mgm/api.h"
--#include <amqp.h>
-+#include <rabbitmq-c/amqp.h>
- #include "../../lib/list.h"
-
- #if AMQP_VERSION < AMQP_VERSION_CODE(0, 10, 0, 0)
-@@ -49,30 +49,8 @@
- extern gen_lock_t *ssl_lock;
- #endif
-
--/* AMQP_VERSION was only added in v0.4.0 - there is no way to check the
-- * version of the library before this, so we consider everything beyond v0.4.0
-- * as old and inneficient */
--#if defined AMQP_VERSION && AMQP_VERSION >= AMQP_VERSION_CODE(0, 4, 0, 0)
-- #define AMQP_VERSION_v04
--#include <amqp_tcp_socket.h>
--#include <amqp_ssl_socket.h>
--#define rmq_uri struct amqp_connection_info
--#define RMQ_EMPTY amqp_empty_bytes
--#else
--/* although struct amqp_connection_info was added in v0.2.0, there is no way
-- * to check against that version, so we assume it does not exist until v0.4.0
-- */
--typedef struct _rmq_uri {
-- char *user;
-- char *password;
-- char *host;
-- char *vhost;
-- int port;
-- int ssl;
--} rmq_uri;
--#define RMQ_EMPTY AMQP_EMPTY_BYTES
--#endif
--
-+#include <rabbitmq-c/tcp_socket.h>
-+#include <rabbitmq-c/ssl_socket.h>
-
- enum rmq_server_state { RMQS_OFF, RMQS_INIT, RMQS_CONN, RMQS_ON, RMQS_PREINIT };
-
-@@ -82,7 +60,7 @@ enum rmq_server_state { RMQS_OFF, RMQS_INIT, RMQS_CONN, RMQS_ON, RMQS_PREINIT };
-
- typedef struct rmq_connection {
- enum rmq_server_state state;
-- rmq_uri uri;
-+ struct amqp_connection_info uri;
- unsigned flags;
- int heartbeat;
- str tls_dom_name;
-diff --git a/modules/rabbitmq_consumer/README b/modules/rabbitmq_consumer/README
-index 02df6024ba..1f3bc058e1 100644
---- a/modules/rabbitmq_consumer/README
-+++ b/modules/rabbitmq_consumer/README
-@@ -72,8 +72,8 @@ Chapter 1. Admin Guide
- before running OpenSIPS with this module loaded:
- * librabbitmq-dev
-
-- NOte that the module is not compatible with versions 0.4 or
-- below of the librabbitmq-dev library.
-+ Note that the module is not compatible with versions below 0.9
-+ of the librabbitmq-dev library.
-
- 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 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 @@
- </listitem>
- </itemizedlist>
- <para>
-- NOte that the module is not compatible with versions 0.4 or below of
-+ Note that the module is not compatible with versions below 0.9 of
- the librabbitmq-dev library.
- </para>
- </section>
-diff --git a/modules/rabbitmq_consumer/rabbitmq_consumer.c b/modules/rabbitmq_consumer/rabbitmq_consumer.c
-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)
- return -1;
- }
-
-+#if AMQP_VERSION_MAJOR == 0 && AMQP_VERSION_MINOR < 13
- amqp_set_initialize_ssl_library(0);
-+#endif // AMQP_VERSION_MAJOR == 0 && AMQP_VERSION_MINOR < 13
- }
-
- return 0;
-diff --git a/modules/rabbitmq_consumer/rmq_connection.h b/modules/rabbitmq_consumer/rmq_connection.h
-index 8aea48710a..a34a0deb51 100644
---- a/modules/rabbitmq_consumer/rmq_connection.h
-+++ b/modules/rabbitmq_consumer/rmq_connection.h
-@@ -22,9 +22,9 @@
- #ifndef _RMQ_CONNECTION_H_
- #define _RMQ_CONNECTION_H_
-
--#include <amqp.h>
--#include <amqp_tcp_socket.h>
--#include <amqp_ssl_socket.h>
-+#include <rabbitmq-c/amqp.h>
-+#include <rabbitmq-c/tcp_socket.h>
-+#include <rabbitmq-c/ssl_socket.h>
-
- #include "../../lib/list.h"
- #include "../../evi/evi_params.h"
diff --git a/opensips-0005-Fix-uninitialized-variable-warnings-in-SQL-API-funct.patch b/opensips-0005-Fix-uninitialized-variable-warnings-in-SQL-API-funct.patch
new file mode 100644
index 0000000..eedf973
--- /dev/null
+++ b/opensips-0005-Fix-uninitialized-variable-warnings-in-SQL-API-funct.patch
@@ -0,0 +1,145 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Peter Lemenkov <lemenkov@gmail.com>
+Date: Sun, 26 Oct 2025 16:50:53 +0100
+Subject: [PATCH] Fix uninitialized variable warnings in SQL API functions
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+During compilation of sqlops module with GCC 15, warnings appear about
+potentially uninitialized variables:
+
+```
+Compiling sqlops_db.c
+gcc -fPIC -DPIC -O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wno-complain-wrong-lang -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -DMOD_NAME='sqlops' -DPKG_MALLOC -DSHM_MMAP -DUSE_MCAST -DDISABLE_NAGLE -DSTATISTICS -DHAVE_RESOLV_RES -DF_MALLOC -DQ_MALLOC -DHP_MALLOC -DDBG_MALLOC -DF_PARALLEL_MALLOC -DHAVE_STDATOMIC -DHAVE_GENERICS -DNAME='"opensips"' -DVERSION='"3.6.2"' -DARCH='"x86_64"' -DOS='"linux"' -DCOMPILER='"gcc 15"' -D__CPU_x86_64 -D__OS_linux -D__SMP_yes -DCFG_DIR='"/etc/opensips/"' -DVERSIONTYPE='"git"' -DTHISREVISION='"994bcd690"' -DFAST_LOCK -DADAPTIVE_WAIT -DADAPTIVE_WAIT_LOOPS=1024 -DHAVE_GETHOSTBYNAME2 -DHAVE_UNION_SEMUN -DHAVE_MSG_NOSIGNAL -DHAVE_MSGHDR_MSG_CONTROL -DHAVE_ALLOCA_H -DHAVE_TIMEGM -DHAVE_EPOLL -DHAVE_SIGIO_RT -DHAVE_SELECT -c sqlops_db.c -o sqlops_db.o
+In file included from ../../mem/mem.h:30,
+ from sqlops_db.c:27:
+sqlops_db.c: In function ‘sql_api_delete’:
+../../mem/../dprint.h:454:33: warning: ‘id’ may be used uninitialized [-Wmaybe-uninitialized]
+ 454 | dprint(_log_level, _log_facility, \
+ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 455 | LOG_PREFIX_UTIL(MOD_NAME), __DP_FUNC, \
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 456 | _stderr_prefix LOG_PREFIX _fmt, \
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 457 | (char *)"%s" _syslog_prefix LOG_PREFIX _fmt, \
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 458 | (char *)_fmt, \
+ | ~~~~~~~~~~~~~~~
+ 459 | dp_time(), dp_my_pid(), log_prefix, __DP_FUNC, ## args) \
+ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+sqlops_db.c:921:14: note: ‘id’ was declared here
+ 921 | str *id;
+ | ^~
+```
+
+In sql_api_select(), sql_api_update(), sql_api_insert(),
+sql_api_delete(), and sql_api_replace() functions, the 'id' pointer
+variable (used for prepared statement identifiers) is declared but could
+be uninitialized.
+
+Let's ensure that:
+
+- The variable is always initialized (prevents undefined behavior)
+- Debug logging only occurs when a prepared statement ID was actually
+ generated
+- The code is safe even when no filter keys are provided
+
+Note: This was a real bug, not just a spurious compiler warning. In
+scenarios where DB_CAP_PREPARED_STMT is supported, _query_id_start()
+succeeds, but no filter keys exist, the code would dereference an
+uninitialized pointer.
+
+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 8b57a13c48..cf364593f8 100644
+--- a/modules/sqlops/sqlops_db.c
++++ b/modules/sqlops/sqlops_db.c
+@@ -752,7 +752,8 @@ int sql_api_select(struct db_url *url, struct sip_msg* msg, cJSON *Jcols,
+ (keys && (id=_query_id_add_filter(keys,ops,nk))==NULL) ) {
+ LM_DBG("not using PS\n");
+ } else {
+- LM_DBG("PS id is <%.*s>\n",id->len,id->s);
++ if(id)
++ LM_DBG("PS id is <%.*s>\n",id->len,id->s);
+ if (ps_map!=NULL || (ps_map=map_create(0))!=NULL) {
+ if ( (my_ps=map_get( ps_map, *id ))!=NULL) {
+ LM_DBG("using PS %p\n",*my_ps);
+@@ -804,7 +805,7 @@ int sql_api_update(struct db_url *url, struct sip_msg* msg, cJSON *Jcols,
+ db_op_t *uops, *ops;
+ db_val_t *uvals, *vals;
+ int nk, unk;
+- str *id;
++ str *id = NULL;
+ db_ps_t *my_ps;
+
+ /* convert JSON to COLs */
+@@ -838,7 +839,8 @@ int sql_api_update(struct db_url *url, struct sip_msg* msg, cJSON *Jcols,
+ (keys && (id=_query_id_add_filter(keys,ops,nk))==NULL) ) {
+ LM_DBG("not using PS\n");
+ } else {
+- LM_DBG("PS id is <%.*s>\n",id->len,id->s);
++ if(id)
++ LM_DBG("PS id is <%.*s>\n",id->len,id->s);
+ if (ps_map!=NULL || (ps_map=map_create(0))!=NULL) {
+ if ( (my_ps=map_get( ps_map, *id ))!=NULL) {
+ LM_DBG("using PS %p\n",*my_ps);
+@@ -868,7 +870,7 @@ int sql_api_insert(struct db_url *url, struct sip_msg* msg, str *table,
+ db_op_t *uops;
+ db_val_t *uvals;
+ int unk;
+- str *id;
++ str *id = NULL;
+ db_ps_t *my_ps;
+
+ /* convert JSON to COLs */
+@@ -888,7 +890,8 @@ int sql_api_insert(struct db_url *url, struct sip_msg* msg, str *table,
+ (id=_query_id_add_filter(ukeys,uops,unk))==NULL ) {
+ LM_DBG("not using PS\n");
+ } else {
+- LM_DBG("PS id is <%.*s>\n",id->len,id->s);
++ if(id)
++ LM_DBG("PS id is <%.*s>\n",id->len,id->s);
+ if (ps_map!=NULL || (ps_map=map_create(0))!=NULL) {
+ if ( (my_ps=map_get( ps_map, *id ))!=NULL) {
+ LM_DBG("using PS %p\n",*my_ps);
+@@ -918,7 +921,7 @@ int sql_api_delete(struct db_url *url, struct sip_msg* msg,
+ db_op_t *ops;
+ db_val_t *vals;
+ int nk;
+- str *id;
++ str *id = NULL;
+ db_ps_t *my_ps;
+
+ /* convert JSON to keys */
+@@ -945,7 +948,8 @@ int sql_api_delete(struct db_url *url, struct sip_msg* msg,
+ (keys && (id=_query_id_add_filter(keys,ops,nk))==NULL) ) {
+ LM_DBG("not using PS\n");
+ } else {
+- LM_DBG("PS id is <%.*s>\n",id->len,id->s);
++ if(id)
++ LM_DBG("PS id is <%.*s>\n",id->len,id->s);
+ if (ps_map!=NULL || (ps_map=map_create(0))!=NULL) {
+ if ( (my_ps=map_get( ps_map, *id ))!=NULL) {
+ LM_DBG("using PS %p\n",*my_ps);
+@@ -975,7 +979,7 @@ int sql_api_replace(struct db_url *url, struct sip_msg* msg, str *table,
+ db_op_t *uops;
+ db_val_t *uvals;
+ int unk;
+- str *id;
++ str *id = NULL;
+ db_ps_t *my_ps;
+
+ /* convert JSON to COLs */
+@@ -995,7 +999,8 @@ int sql_api_replace(struct db_url *url, struct sip_msg* msg, str *table,
+ (id=_query_id_add_filter(ukeys,uops,unk))==NULL ) {
+ LM_DBG("not using PS\n");
+ } else {
+- LM_DBG("PS id is <%.*s>\n",id->len,id->s);
++ if(id)
++ LM_DBG("PS id is <%.*s>\n",id->len,id->s);
+ if (ps_map!=NULL || (ps_map=map_create(0))!=NULL) {
+ if ( (my_ps=map_get( ps_map, *id ))!=NULL) {
+ LM_DBG("using PS %p\n",*my_ps);
diff --git a/opensips-0006-Fix-uninitialized-va_list-warning-on-ppc64le-and-i68.patch b/opensips-0006-Fix-uninitialized-va_list-warning-on-ppc64le-and-i68.patch
new file mode 100644
index 0000000..957cef5
--- /dev/null
+++ b/opensips-0006-Fix-uninitialized-va_list-warning-on-ppc64le-and-i68.patch
@@ -0,0 +1,100 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Peter Lemenkov <lemenkov@gmail.com>
+Date: Fri, 26 Dec 2025 17:25:05 +0100
+Subject: [PATCH] Fix uninitialized va_list warning on ppc64le and i686 with
+ GCC 15
+
+During compilation on ppc64le and i686 architectures with GCC 15, a
+warning appears:
+
+```
+cachedb_redis_dbase.c: In function 'redis_run_command_argv':
+cachedb_redis_dbase.c:659:16: warning: '_' is used uninitialized [-Wuninitialized]
+ 659 | return _redis_run_command(connection, rpl, key, argc, argv, argvlen, NULL, _);
+ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+cachedb_redis_dbase.c:657:17: note: '_' was declared here
+ 657 | va_list _;
+ | ^
+```
+
+In commit d6ad6d4039fcf68624481f69ee67eff92f7b3ab2, the
+`redis_run_command_argv()` function was modified to pass an
+uninitialized `va_list` to `_redis_run_command()`.
+
+The original logic is:
+```c
+static int redis_run_command_argv(...) {
+ va_list _;
+ return _redis_run_command(connection, rpl, key, argc, argv, argvlen, NULL, _);
+}
+```
+
+The underscore `_` was used as a "don't care" placeholder, since when
+`argc` is non-zero, `_redis_run_command()` uses the `argv` path and
+never accesses the `va_list` parameter:
+
+```c
+if (argc) {
+ reply = redisCommandArgv(node->context, argc, argv, argvlen);
+} else {
+ va_copy(aq, ap); // Only executed when argc == 0
+ reply = redisvCommand(node->context, cmd_fmt, aq);
+ va_end(aq);
+}
+```
+
+While this worked in practice (the uninitialized `va_list` is never
+actually used), GCC 15 now correctly warns that passing uninitialized
+data is undefined behavior, even if that data is never accessed.
+
+Initialize the `va_list` to a safe value using zero-initialization. This
+satisfies the compiler's uninitialized variable check while maintaining
+the original logic - the `va_list` still won't be used when `argc` is
+non-zero, but it's now validly initialized.
+
+**Changed:**
+```c
+va_list _;
+```
+
+**To:**
+```c
+va_list unused_ap = {0};
+```
+
+Also renamed from `_` to `unused_ap` for clarity, as single underscore
+identifiers can be problematic and don't clearly convey intent.
+
+Even though the uninitialized `va_list` is never accessed in practice,
+passing uninitialized data violates C's rules and can cause issues with:
+
+- Static analysis tools
+- Compiler optimizations that assume no undefined behavior
+- Future architecture-specific `va_list` implementations
+- Code maintainability (unclear intent)
+
+This change makes the code compliant with C standards while preserving
+the original functionality.
+
+Related commit: d6ad6d4039fcf68624481f69ee67eff92f7b3ab2
+("cachedb_redis: properly pass variable arguments to a Redis command")
+
+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 1750495333..32ec4d2f18 100644
+--- a/modules/cachedb_redis/cachedb_redis_dbase.c
++++ b/modules/cachedb_redis/cachedb_redis_dbase.c
+@@ -1007,9 +1007,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)
+ {
+- va_list _;
++ va_list unused_ap = {0};
+
+- return _redis_run_command(connection, rpl, key, argc, argv, argvlen, NULL, _);
++ return _redis_run_command(connection, rpl, key, argc, argv, argvlen, NULL, unused_ap);
+ }
+
+ int redis_get(cachedb_con *connection,str *attr,str *val)
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
deleted file mode 100644
index a532bf0..0000000
--- a/opensips-0006-Fix-uninitialized-variable-warnings-in-SQL-API-funct.patch
+++ /dev/null
@@ -1,154 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Peter Lemenkov <lemenkov@gmail.com>
-Date: Sun, 26 Oct 2025 16:50:53 +0100
-Subject: [PATCH] Fix uninitialized variable warnings in SQL API functions
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-During compilation of sqlops module with GCC 15, warnings appear about
-potentially uninitialized variables:
-
-```
-Compiling sqlops_db.c
-gcc -fPIC -DPIC -O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wno-complain-wrong-lang -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -DMOD_NAME='sqlops' -DPKG_MALLOC -DSHM_MMAP -DUSE_MCAST -DDISABLE_NAGLE -DSTATISTICS -DHAVE_RESOLV_RES -DF_MALLOC -DQ_MALLOC -DHP_MALLOC -DDBG_MALLOC -DF_PARALLEL_MALLOC -DHAVE_STDATOMIC -DHAVE_GENERICS -DNAME='"opensips"' -DVERSION='"3.6.2"' -DARCH='"x86_64"' -DOS='"linux"' -DCOMPILER='"gcc 15"' -D__CPU_x86_64 -D__OS_linux -D__SMP_yes -DCFG_DIR='"/etc/opensips/"' -DVERSIONTYPE='"git"' -DTHISREVISION='"994bcd690"' -DFAST_LOCK -DADAPTIVE_WAIT -DADAPTIVE_WAIT_LOOPS=1024 -DHAVE_GETHOSTBYNAME2 -DHAVE_UNION_SEMUN -DHAVE_MSG_NOSIGNAL -DHAVE_MSGHDR_MSG_CONTROL -DHAVE_ALLOCA_H -DHAVE_TIMEGM -DHAVE_EPOLL -DHAVE_SIGIO_RT -DHAVE_SELECT -c sqlops_db.c -o sqlops_db.o
-In file included from ../../mem/mem.h:30,
- from sqlops_db.c:27:
-sqlops_db.c: In function ‘sql_api_delete’:
-../../mem/../dprint.h:454:33: warning: ‘id’ may be used uninitialized [-Wmaybe-uninitialized]
- 454 | dprint(_log_level, _log_facility, \
- | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 455 | LOG_PREFIX_UTIL(MOD_NAME), __DP_FUNC, \
- | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 456 | _stderr_prefix LOG_PREFIX _fmt, \
- | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 457 | (char *)"%s" _syslog_prefix LOG_PREFIX _fmt, \
- | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 458 | (char *)_fmt, \
- | ~~~~~~~~~~~~~~~
- 459 | dp_time(), dp_my_pid(), log_prefix, __DP_FUNC, ## args) \
- | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-sqlops_db.c:921:14: note: ‘id’ was declared here
- 921 | str *id;
- | ^~
-```
-
-In sql_api_select(), sql_api_update(), sql_api_insert(),
-sql_api_delete(), and sql_api_replace() functions, the 'id' pointer
-variable (used for prepared statement identifiers) is declared but could
-be uninitialized.
-
-Let's ensure that:
-
-- The variable is always initialized (prevents undefined behavior)
-- Debug logging only occurs when a prepared statement ID was actually
- generated
-- The code is safe even when no filter keys are provided
-
-Note: This was a real bug, not just a spurious compiler warning. In
-scenarios where DB_CAP_PREPARED_STMT is supported, _query_id_start()
-succeeds, but no filter keys exist, the code would dereference an
-uninitialized pointer.
-
-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 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,
- db_op_t *ops;
- db_val_t *vals;
- int nk, nc;
-- str *id;
-+ str *id = NULL;
- db_ps_t *my_ps;
-
- /* convert JSON to COLs */
-@@ -752,7 +752,8 @@ int sql_api_select(struct db_url *url, struct sip_msg* msg, cJSON *Jcols,
- (keys && (id=_query_id_add_filter(keys,ops,nk))==NULL) ) {
- LM_DBG("not using PS\n");
- } else {
-- LM_DBG("PS id is <%.*s>\n",id->len,id->s);
-+ if(id)
-+ LM_DBG("PS id is <%.*s>\n",id->len,id->s);
- if (ps_map!=NULL || (ps_map=map_create(0))!=NULL) {
- if ( (my_ps=map_get( ps_map, *id ))!=NULL) {
- LM_DBG("using PS %p\n",*my_ps);
-@@ -804,7 +805,7 @@ int sql_api_update(struct db_url *url, struct sip_msg* msg, cJSON *Jcols,
- db_op_t *uops, *ops;
- db_val_t *uvals, *vals;
- int nk, unk;
-- str *id;
-+ str *id = NULL;
- db_ps_t *my_ps;
-
- /* convert JSON to COLs */
-@@ -838,7 +839,8 @@ int sql_api_update(struct db_url *url, struct sip_msg* msg, cJSON *Jcols,
- (keys && (id=_query_id_add_filter(keys,ops,nk))==NULL) ) {
- LM_DBG("not using PS\n");
- } else {
-- LM_DBG("PS id is <%.*s>\n",id->len,id->s);
-+ if(id)
-+ LM_DBG("PS id is <%.*s>\n",id->len,id->s);
- if (ps_map!=NULL || (ps_map=map_create(0))!=NULL) {
- if ( (my_ps=map_get( ps_map, *id ))!=NULL) {
- LM_DBG("using PS %p\n",*my_ps);
-@@ -868,7 +870,7 @@ int sql_api_insert(struct db_url *url, struct sip_msg* msg, str *table,
- db_op_t *uops;
- db_val_t *uvals;
- int unk;
-- str *id;
-+ str *id = NULL;
- db_ps_t *my_ps;
-
- /* convert JSON to COLs */
-@@ -888,7 +890,8 @@ int sql_api_insert(struct db_url *url, struct sip_msg* msg, str *table,
- (id=_query_id_add_filter(ukeys,uops,unk))==NULL ) {
- LM_DBG("not using PS\n");
- } else {
-- LM_DBG("PS id is <%.*s>\n",id->len,id->s);
-+ if(id)
-+ LM_DBG("PS id is <%.*s>\n",id->len,id->s);
- if (ps_map!=NULL || (ps_map=map_create(0))!=NULL) {
- if ( (my_ps=map_get( ps_map, *id ))!=NULL) {
- LM_DBG("using PS %p\n",*my_ps);
-@@ -918,7 +921,7 @@ int sql_api_delete(struct db_url *url, struct sip_msg* msg,
- db_op_t *ops;
- db_val_t *vals;
- int nk;
-- str *id;
-+ str *id = NULL;
- db_ps_t *my_ps;
-
- /* convert JSON to keys */
-@@ -945,7 +948,8 @@ int sql_api_delete(struct db_url *url, struct sip_msg* msg,
- (keys && (id=_query_id_add_filter(keys,ops,nk))==NULL) ) {
- LM_DBG("not using PS\n");
- } else {
-- LM_DBG("PS id is <%.*s>\n",id->len,id->s);
-+ if(id)
-+ LM_DBG("PS id is <%.*s>\n",id->len,id->s);
- if (ps_map!=NULL || (ps_map=map_create(0))!=NULL) {
- if ( (my_ps=map_get( ps_map, *id ))!=NULL) {
- LM_DBG("using PS %p\n",*my_ps);
-@@ -975,7 +979,7 @@ int sql_api_replace(struct db_url *url, struct sip_msg* msg, str *table,
- db_op_t *uops;
- db_val_t *uvals;
- int unk;
-- str *id;
-+ str *id = NULL;
- db_ps_t *my_ps;
-
- /* convert JSON to COLs */
-@@ -995,7 +999,8 @@ int sql_api_replace(struct db_url *url, struct sip_msg* msg, str *table,
- (id=_query_id_add_filter(ukeys,uops,unk))==NULL ) {
- LM_DBG("not using PS\n");
- } else {
-- LM_DBG("PS id is <%.*s>\n",id->len,id->s);
-+ if(id)
-+ LM_DBG("PS id is <%.*s>\n",id->len,id->s);
- if (ps_map!=NULL || (ps_map=map_create(0))!=NULL) {
- if ( (my_ps=map_get( ps_map, *id ))!=NULL) {
- LM_DBG("using PS %p\n",*my_ps);
diff --git a/opensips-0007-Fix-C90-style-declaration-warnings-in-snmpstats-modu.patch b/opensips-0007-Fix-C90-style-declaration-warnings-in-snmpstats-modu.patch
new file mode 100644
index 0000000..2689e4e
--- /dev/null
+++ b/opensips-0007-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-0007-Fix-const-correctness-warnings-in-HTTP-and-FreeSWITC.patch b/opensips-0007-Fix-const-correctness-warnings-in-HTTP-and-FreeSWITC.patch
deleted file mode 100644
index 375fd42..0000000
--- a/opensips-0007-Fix-const-correctness-warnings-in-HTTP-and-FreeSWITC.patch
+++ /dev/null
@@ -1,156 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Peter Lemenkov <lemenkov@gmail.com>
-Date: Sat, 20 Dec 2025 20:16:48 +0100
-Subject: [PATCH] Fix const-correctness warnings in HTTP and FreeSWITCH ESL
- code
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-During compilation with GCC 15.2.1, const-qualifier warnings appear in multiple modules:
-```
-modules/httpd/httpd_proc.c:348:24: warning: assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
- 348 | if ( (p=strchr(value, ';'))!=NULL ) {
- | ^
-
-...
-
-modules/freeswitch/esl/src/esl_event.c:428:24: warning: assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
- 428 | if ((index_ptr = strchr(header_name, '['))) {
- | ^
-```
-
-In `esl_event_base_add_header()`, the `header_name` parameter is `const char *`, and `strchr()` returns `const char *` when given a const input. The `index_ptr` variable was declared as non-const `char *`, causing the warning.
-
-**Fix:** Changed variable declaration from `char *index_ptr` to `const char *index_ptr`.
-
-This is safe because `index_ptr` is only used for reading/parsing, never for modification.
-
-The `getConnectionHeader()` function receives `value` as `const char *`, and `strchr()` preserves const-ness by returning `const char *`. However, the code was assigning this to a non-const `char *p` and then modifying the string by temporarily inserting a null terminator to parse the MIME type.
-
-**Original approach (problematic):**
-```c
-char *p, bk;
-if ( (p=strchr(value, ';'))!=NULL ) {
- while( p>value && (*(p-1)==' ' || *(p-1)=='\t') ) p--;
- bk = *p;
- *p = 0; // Modify const string!
- if (strcasecmp("text/xml", value) == 0) ...
- *p = bk; // Restore
-}
-```
-
-This violates const-correctness by modifying a const string, which is undefined behavior even if it happens to work in practice.
-
-Calculate the effective length without modifying the string.
-
-**New approach:**
-```c
-const char *p, *end;
-end = value + strlen(value); // default to full length
-if ( (p=strchr(value, ';'))!=NULL ) {
- end = p;
- while( end>value && (*(end-1)==' ' || *(end-1)=='\t') ) end--;
-}
-if (strncasecmp("text/xml", value, end - value) == 0) ...
-```
-
-The length calculation `end - value` ensures we compare exactly the MIME type portion, preventing false matches with longer strings.
-
-**Example of the problem we're preventing:**
-```
-Content-Type: text/xmlfoobar; charset=utf-8
-```
-
-Without using the calculated length:
-```c
-// BAD: Using a fixed length
-if (strncasecmp("text/xml", value, 8) == 0) ...
-// This would match "text/xmlfoobar" because first 8 chars match!
-```
-
-With calculated length:
-```c
-end = strchr(value, ';') // Points to ';'
-// After trimming: end - value = 14 (length of "text/xmlfoobar")
-if (strncasecmp("text/xml", value, 14) == 0) ...
-// ✓ Correctly rejects: strncasecmp compares 8 chars of "text/xml"
-// vs 14 chars needed, hits \0 in first string, returns non-zero
-```
-
-The key insight: `strncasecmp(str1, str2, n)` will return non-zero if either string is shorter than `n` characters (due to null terminator), ensuring we don't match strings that are longer than our expected MIME type.
-
-1. Changed `char *p, bk;` to `const char *p, *end;`
-2. Removed `bk` variable (no longer needed)
-3. Calculate `end` pointer to mark the effective end of the MIME type
-4. Updated all MIME type comparisons to use `strncasecmp()` with `end - value` length
-5. Removed code that modified and restored the const string
-
-Affected MIME types:
-- `text/xml`
-- `application/json`
-- `text/html`
-- `text/plain`
-
-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 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
- esl_event_set_body(event, data);
- }
-
-- if ((index_ptr = strchr(header_name, '['))) {
-+ if ((index_ptr = (char *)strchr(header_name, '['))) {
- index_ptr++;
- 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 8e87661048..b12cc41b9c 100644
---- a/modules/httpd/httpd_proc.c
-+++ b/modules/httpd/httpd_proc.c
-@@ -332,7 +332,7 @@ MHD_RET getConnectionHeader(void *cls, enum MHD_ValueKind kind,
- struct post_request *pr = (struct post_request*)cls;
- str content_length;
- unsigned int len;
-- char *p, bk;
-+ const char *p, *end;
-
- if (cls == NULL) {
- LM_ERR("Unable to store return data\n");
-@@ -356,24 +356,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 */
-+ end = value + strlen(value); // default to full length
- if ( (p=strchr(value, ';'))!=NULL ) {
-- while( p>value && (*(p-1)==' ' || *(p-1)=='\t') ) p--;
-- bk = *p;
-- *p = 0;
-+ end = p;
-+ while( end>value && (*(end-1)==' ' || *(end-1)=='\t') ) end--;
- }
-- if (strcasecmp("text/xml", value) == 0)
-+ len = end - value;
-+ if (strncasecmp("text/xml", value, end - value) == 0)
- pr->content_type = HTTPD_TEXT_XML_CNT_TYPE;
-- else if (strncasecmp("application/json", value, 16) == 0)
-+ else if (strncasecmp("application/json", value, end - value) == 0)
- pr->content_type = HTTPD_APPLICATION_JSON_CNT_TYPE;
-- else if (strncasecmp("text/html", value, 9) == 0)
-+ else if (strncasecmp("text/html", value, end - value) == 0)
- pr->content_type = HTTPD_TEXT_HTML_TYPE;
-- else if (strncasecmp("text/plain", value, 10) == 0)
-+ else if (strncasecmp("text/plain", value, end - value) == 0)
- pr->content_type = HTTPD_TEXT_PLAIN_TYPE;
- else {
- pr->content_type = HTTPD_UNKNOWN_CNT_TYPE;
- LM_ERR("Unexpected Content-Type=[%s]\n", value);
- }
-- if (p) *p = bk;
- goto done;
- }
- if (strcasecmp("Content-Length", key) == 0) {
diff --git a/opensips-0008-Fix-build-with-OpenSSL-3.x-replace-direct-ASN1_STRIN.patch b/opensips-0008-Fix-build-with-OpenSSL-3.x-replace-direct-ASN1_STRIN.patch
new file mode 100644
index 0000000..72ca87f
--- /dev/null
+++ b/opensips-0008-Fix-build-with-OpenSSL-3.x-replace-direct-ASN1_STRIN.patch
@@ -0,0 +1,78 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Peter Lemenkov <lemenkov@gmail.com>
+Date: Wed, 24 Jun 2026 20:29:45 +0200
+Subject: [PATCH] Fix build with OpenSSL 3.x: replace direct ASN1_STRING member
+ access
+
+OpenSSL 3.x made ASN1_STRING (struct asn1_string_st) an opaque type.
+Replace all direct ->data and ->length member access with the public
+accessor API (ASN1_STRING_get0_data, ASN1_STRING_length), available
+since OpenSSL 1.1.0.
+
+Fixes build on Fedora 45 (OpenSSL 3.5.x, GCC 16).
+
+Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
+Assisted-by: Claude (Anthropic) <https://claude.ai>
+
+diff --git a/modules/identity/identity.c b/modules/identity/identity.c
+index f4a350a53c..a1b17b9d03 100644
+--- a/modules/identity/identity.c
++++ b/modules/identity/identity.c
+@@ -1420,13 +1420,13 @@ static time_t parseX509Date(ASN1_STRING * dateString)
+ return -1;
+ }
+
+- if((ASN1_UTCTIME_check(dateString)) && (dateString->length == 13))
++ if((ASN1_UTCTIME_check(dateString)) && (ASN1_STRING_length(dateString) == 13))
+ {
+ /* UTCTIME string, GMT
+ YYMMDDhhmmssZ
+ */
+
+- tmp = dateString->data;
++ tmp = (char *)ASN1_STRING_get0_data(dateString);
+
+ tmDate.tm_year = (tmp[0] - '0') * 10 + (tmp[1] - '0');
+ if(tmDate.tm_year < 50) //see chap. 4.1.2.5.1, rfc 3280
+@@ -1444,12 +1444,12 @@ static time_t parseX509Date(ASN1_STRING * dateString)
+ }
+
+ /* needed for years >= 2050 */
+- if ((ASN1_GENERALIZEDTIME_check(dateString)) && (dateString->length == 15))
++ if ((ASN1_GENERALIZEDTIME_check(dateString)) && (ASN1_STRING_length(dateString) == 15))
+ {
+ /* GENERALIZEDTIME string; GMT
+ YYYYMMDDhhmmssZ
+ */
+- tmp = dateString->data;
++ tmp = (char *)ASN1_STRING_get0_data(dateString);
+
+ tmDate.tm_year = (tmp[0] - '0') * 1000 +
+ (tmp[1] - '0') * 100 + (tmp[2] - '0') * 10 + (tmp[3] - '0') - 1900;
+diff --git a/modules/tls_openssl/openssl_tls_vars.c b/modules/tls_openssl/openssl_tls_vars.c
+index 0ac39f7648..859ae75fe7 100644
+--- a/modules/tls_openssl/openssl_tls_vars.c
++++ b/modules/tls_openssl/openssl_tls_vars.c
+@@ -324,8 +324,8 @@ int openssl_tls_var_alt(int ind, void *ssl, str *res)
+ case GEN_EMAIL:
+ case GEN_DNS:
+ case GEN_URI:
+- text.s = (char*)nm->d.ia5->data;
+- text.len = nm->d.ia5->length;
++ text.s = (char*)ASN1_STRING_get0_data(nm->d.ia5);
++ text.len = ASN1_STRING_length(nm->d.ia5);
+ if (text.len >= 1024) {
+ LM_ERR("alternative subject text too long\n");
+ goto err;
+@@ -337,9 +337,9 @@ int openssl_tls_var_alt(int ind, void *ssl, str *res)
+ break;
+
+ case GEN_IPADD:
+- ip.len = nm->d.iPAddress->length;
++ ip.len = ASN1_STRING_length(nm->d.iPAddress);
+ ip.af = (ip.len == 16) ? AF_INET6 : AF_INET;
+- memcpy(ip.u.addr, nm->d.iPAddress->data, ip.len);
++ memcpy(ip.u.addr, ASN1_STRING_get0_data(nm->d.iPAddress), ip.len);
+ text.s = ip_addr2a(&ip);
+ text.len = strlen(text.s);
+ memcpy(buf, text.s, text.len);
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
deleted file mode 100644
index 957cef5..0000000
--- a/opensips-0008-Fix-uninitialized-va_list-warning-on-ppc64le-and-i68.patch
+++ /dev/null
@@ -1,100 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Peter Lemenkov <lemenkov@gmail.com>
-Date: Fri, 26 Dec 2025 17:25:05 +0100
-Subject: [PATCH] Fix uninitialized va_list warning on ppc64le and i686 with
- GCC 15
-
-During compilation on ppc64le and i686 architectures with GCC 15, a
-warning appears:
-
-```
-cachedb_redis_dbase.c: In function 'redis_run_command_argv':
-cachedb_redis_dbase.c:659:16: warning: '_' is used uninitialized [-Wuninitialized]
- 659 | return _redis_run_command(connection, rpl, key, argc, argv, argvlen, NULL, _);
- | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-cachedb_redis_dbase.c:657:17: note: '_' was declared here
- 657 | va_list _;
- | ^
-```
-
-In commit d6ad6d4039fcf68624481f69ee67eff92f7b3ab2, the
-`redis_run_command_argv()` function was modified to pass an
-uninitialized `va_list` to `_redis_run_command()`.
-
-The original logic is:
-```c
-static int redis_run_command_argv(...) {
- va_list _;
- return _redis_run_command(connection, rpl, key, argc, argv, argvlen, NULL, _);
-}
-```
-
-The underscore `_` was used as a "don't care" placeholder, since when
-`argc` is non-zero, `_redis_run_command()` uses the `argv` path and
-never accesses the `va_list` parameter:
-
-```c
-if (argc) {
- reply = redisCommandArgv(node->context, argc, argv, argvlen);
-} else {
- va_copy(aq, ap); // Only executed when argc == 0
- reply = redisvCommand(node->context, cmd_fmt, aq);
- va_end(aq);
-}
-```
-
-While this worked in practice (the uninitialized `va_list` is never
-actually used), GCC 15 now correctly warns that passing uninitialized
-data is undefined behavior, even if that data is never accessed.
-
-Initialize the `va_list` to a safe value using zero-initialization. This
-satisfies the compiler's uninitialized variable check while maintaining
-the original logic - the `va_list` still won't be used when `argc` is
-non-zero, but it's now validly initialized.
-
-**Changed:**
-```c
-va_list _;
-```
-
-**To:**
-```c
-va_list unused_ap = {0};
-```
-
-Also renamed from `_` to `unused_ap` for clarity, as single underscore
-identifiers can be problematic and don't clearly convey intent.
-
-Even though the uninitialized `va_list` is never accessed in practice,
-passing uninitialized data violates C's rules and can cause issues with:
-
-- Static analysis tools
-- Compiler optimizations that assume no undefined behavior
-- Future architecture-specific `va_list` implementations
-- Code maintainability (unclear intent)
-
-This change makes the code compliant with C standards while preserving
-the original functionality.
-
-Related commit: d6ad6d4039fcf68624481f69ee67eff92f7b3ab2
-("cachedb_redis: properly pass variable arguments to a Redis command")
-
-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 1750495333..32ec4d2f18 100644
---- a/modules/cachedb_redis/cachedb_redis_dbase.c
-+++ b/modules/cachedb_redis/cachedb_redis_dbase.c
-@@ -1007,9 +1007,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)
- {
-- va_list _;
-+ va_list unused_ap = {0};
-
-- return _redis_run_command(connection, rpl, key, argc, argv, argvlen, NULL, _);
-+ return _redis_run_command(connection, rpl, key, argc, argv, argvlen, NULL, unused_ap);
- }
-
- int redis_get(cachedb_con *connection,str *attr,str *val)
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
deleted file mode 100644
index 9097093..0000000
--- a/opensips-0009-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 3a426bd929..d1a9c8cbd2 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"
-@@ -315,7 +316,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;
-@@ -425,7 +426,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 433e078358..7dff9fbbf7 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"
-@@ -602,7 +603,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;
-@@ -1755,7 +1756,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;
-@@ -1782,7 +1783,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;
- }
-@@ -1790,7 +1791,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);
- }
-
-
-@@ -2145,7 +2146,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;
-@@ -2182,7 +2183,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
deleted file mode 100644
index 2689e4e..0000000
--- a/opensips-0010-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 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-0011-Fix-build-with-OpenSSL-3.x-replace-direct-ASN1_STRIN.patch b/opensips-0011-Fix-build-with-OpenSSL-3.x-replace-direct-ASN1_STRIN.patch
deleted file mode 100644
index 72ca87f..0000000
--- a/opensips-0011-Fix-build-with-OpenSSL-3.x-replace-direct-ASN1_STRIN.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Peter Lemenkov <lemenkov@gmail.com>
-Date: Wed, 24 Jun 2026 20:29:45 +0200
-Subject: [PATCH] Fix build with OpenSSL 3.x: replace direct ASN1_STRING member
- access
-
-OpenSSL 3.x made ASN1_STRING (struct asn1_string_st) an opaque type.
-Replace all direct ->data and ->length member access with the public
-accessor API (ASN1_STRING_get0_data, ASN1_STRING_length), available
-since OpenSSL 1.1.0.
-
-Fixes build on Fedora 45 (OpenSSL 3.5.x, GCC 16).
-
-Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
-Assisted-by: Claude (Anthropic) <https://claude.ai>
-
-diff --git a/modules/identity/identity.c b/modules/identity/identity.c
-index f4a350a53c..a1b17b9d03 100644
---- a/modules/identity/identity.c
-+++ b/modules/identity/identity.c
-@@ -1420,13 +1420,13 @@ static time_t parseX509Date(ASN1_STRING * dateString)
- return -1;
- }
-
-- if((ASN1_UTCTIME_check(dateString)) && (dateString->length == 13))
-+ if((ASN1_UTCTIME_check(dateString)) && (ASN1_STRING_length(dateString) == 13))
- {
- /* UTCTIME string, GMT
- YYMMDDhhmmssZ
- */
-
-- tmp = dateString->data;
-+ tmp = (char *)ASN1_STRING_get0_data(dateString);
-
- tmDate.tm_year = (tmp[0] - '0') * 10 + (tmp[1] - '0');
- if(tmDate.tm_year < 50) //see chap. 4.1.2.5.1, rfc 3280
-@@ -1444,12 +1444,12 @@ static time_t parseX509Date(ASN1_STRING * dateString)
- }
-
- /* needed for years >= 2050 */
-- if ((ASN1_GENERALIZEDTIME_check(dateString)) && (dateString->length == 15))
-+ if ((ASN1_GENERALIZEDTIME_check(dateString)) && (ASN1_STRING_length(dateString) == 15))
- {
- /* GENERALIZEDTIME string; GMT
- YYYYMMDDhhmmssZ
- */
-- tmp = dateString->data;
-+ tmp = (char *)ASN1_STRING_get0_data(dateString);
-
- tmDate.tm_year = (tmp[0] - '0') * 1000 +
- (tmp[1] - '0') * 100 + (tmp[2] - '0') * 10 + (tmp[3] - '0') - 1900;
-diff --git a/modules/tls_openssl/openssl_tls_vars.c b/modules/tls_openssl/openssl_tls_vars.c
-index 0ac39f7648..859ae75fe7 100644
---- a/modules/tls_openssl/openssl_tls_vars.c
-+++ b/modules/tls_openssl/openssl_tls_vars.c
-@@ -324,8 +324,8 @@ int openssl_tls_var_alt(int ind, void *ssl, str *res)
- case GEN_EMAIL:
- case GEN_DNS:
- case GEN_URI:
-- text.s = (char*)nm->d.ia5->data;
-- text.len = nm->d.ia5->length;
-+ text.s = (char*)ASN1_STRING_get0_data(nm->d.ia5);
-+ text.len = ASN1_STRING_length(nm->d.ia5);
- if (text.len >= 1024) {
- LM_ERR("alternative subject text too long\n");
- goto err;
-@@ -337,9 +337,9 @@ int openssl_tls_var_alt(int ind, void *ssl, str *res)
- break;
-
- case GEN_IPADD:
-- ip.len = nm->d.iPAddress->length;
-+ ip.len = ASN1_STRING_length(nm->d.iPAddress);
- ip.af = (ip.len == 16) ? AF_INET6 : AF_INET;
-- memcpy(ip.u.addr, nm->d.iPAddress->data, ip.len);
-+ memcpy(ip.u.addr, ASN1_STRING_get0_data(nm->d.iPAddress), ip.len);
- text.s = ip_addr2a(&ip);
- text.len = strlen(text.s);
- memcpy(buf, text.s, text.len);
diff --git a/opensips.spec b/opensips.spec
index 17a12ec..13887e4 100644
--- a/opensips.spec
+++ b/opensips.spec
@@ -1,10 +1,10 @@
-%global git_commit acf45c08e7a169b18f7b53f02d42c19c035c1c43
+%global git_commit 1747e6ed20a477b61b8e8e068212402b1645dc84
%global EXCLUDE_MODULES cachedb_cassandra cachedb_dynamodb %{!?_with_oracle:db_oracle} event_sqs example launch_darkly opentelemetry osp rtp.io sngtc tls_wolfssl
Summary: Open Source SIP Server
Name: opensips
-Version: 4.0.0
+Version: 4.0.1
Release: %autorelease
License: GPL-2.0-or-later
Source0: https://github.com/%{name}/%{name}/archive/%{version}/%{name}-%{version}.tar.gz
@@ -14,13 +14,10 @@ Patch: opensips-0001-Consistently-use-rtpproxy-switches.patch
Patch: opensips-0002-Cleanup-Oracle-s-makefiles.patch
Patch: opensips-0003-db_ora-null-terminating-string-is-more-safely-most-m.patch
Patch: opensips-0004-Return-actual-payload-ID-in-case-of-a-dynamic-payloa.patch
-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-pointer-truncation-warning-on-32-bit-architectur.patch
-Patch: opensips-0010-Fix-C90-style-declaration-warnings-in-snmpstats-modu.patch
-Patch: opensips-0011-Fix-build-with-OpenSSL-3.x-replace-direct-ASN1_STRIN.patch
+Patch: opensips-0005-Fix-uninitialized-variable-warnings-in-SQL-API-funct.patch
+Patch: opensips-0006-Fix-uninitialized-va_list-warning-on-ppc64le-and-i68.patch
+Patch: opensips-0007-Fix-C90-style-declaration-warnings-in-snmpstats-modu.patch
+Patch: opensips-0008-Fix-build-with-OpenSSL-3.x-replace-direct-ASN1_STRIN.patch
URL: https://opensips.org
diff --git a/sources b/sources
index d93306b..283c3b1 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (opensips-4.0.0.tar.gz) = 78cc599dae15926eeac0ed50727e42b336dcc3b431769a5b0d52ec9de71250084eca0893ecfad515acc0eb82149643b6410ca1f94702257449df2d9d57132290
+SHA512 (opensips-4.0.1.tar.gz) = 5b3c3416a81ba4eec510fdb8237701edf9dcdaca7567deac9e0c8e7f9d721773768eed58c052defd0671e1c104ba8e2c4bc10cdd45b67ab5ebfeb5da5dbcc1f2
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-08-19 17:26 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-08-19 17:26 [rpms/opensips] f45: OpenSIPS ver. 4.0.1 Peter Lemenkov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox