Merge pull request #840 from Ansuel/pcre-kamailio

kamailio: bump to release 5.7.2 + PCRE2
This commit is contained in:
Jiri Slachta 2023-11-11 19:47:27 +01:00 committed by GitHub
commit b28229fb59
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 5630 additions and 178 deletions

View file

@ -9,12 +9,12 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=kamailio PKG_NAME:=kamailio
PKG_VERSION:=5.6.2 PKG_VERSION:=5.7.2
PKG_RELEASE:=4 PKG_RELEASE:=2
PKG_SOURCE_URL:=https://www.kamailio.org/pub/kamailio/$(PKG_VERSION)/src PKG_SOURCE_URL:=https://www.kamailio.org/pub/kamailio/$(PKG_VERSION)/src
PKG_SOURCE:=kamailio-$(PKG_VERSION)_src.tar.gz PKG_SOURCE:=kamailio-$(PKG_VERSION)_src.tar.gz
PKG_HASH:=ea3cd5d688c34208b92072c3844c8276b693e0ca2c688168ea0357978c76b32d PKG_HASH:=72c9a067da8d6fa920d3737d98cd7f66c321f80cbe1076e2d5a392b422503122
PKG_BUILD_FLAGS:=no-mips16 PKG_BUILD_FLAGS:=no-mips16
PKG_LICENSE:=GPL-2.0+ PKG_LICENSE:=GPL-2.0+
@ -521,7 +521,7 @@ $(eval $(call BuildKamailioModule,db_text,Text DB-backend,,,dbtext/kamailio))
$(eval $(call BuildKamailioModule,db_unixodbc,UnixODBC DB-backend,,+unixodbc)) $(eval $(call BuildKamailioModule,db_unixodbc,UnixODBC DB-backend,,+unixodbc))
$(eval $(call BuildKamailioModule,debugger,Interactive config file debugger,,)) $(eval $(call BuildKamailioModule,debugger,Interactive config file debugger,,))
$(eval $(call BuildKamailioModule,dialog,Dialog support,,+kamailio-mod-rr +kamailio-mod-tm)) $(eval $(call BuildKamailioModule,dialog,Dialog support,,+kamailio-mod-rr +kamailio-mod-tm))
$(eval $(call BuildKamailioModule,dialplan,Dialplan management,,+libpcre)) $(eval $(call BuildKamailioModule,dialplan,Dialplan management,,+libpcre2))
$(eval $(call BuildKamailioModule,dispatcher,Dispatcher,,)) $(eval $(call BuildKamailioModule,dispatcher,Dispatcher,,))
$(eval $(call BuildKamailioModule,diversion,Diversion header insertion,,)) $(eval $(call BuildKamailioModule,diversion,Diversion header insertion,,))
$(eval $(call BuildKamailioModule,dlgs,Track active calls in stateless mode,,)) $(eval $(call BuildKamailioModule,dlgs,Track active calls in stateless mode,,))
@ -562,7 +562,7 @@ $(eval $(call BuildKamailioModule,jsonrpcs,JSONRPC server over HTTP,,+libevent2)
$(eval $(call BuildKamailioModule,keepalive,SIP keepalive monitoring,,+kamailio-mod-tm,,)) $(eval $(call BuildKamailioModule,keepalive,SIP keepalive monitoring,,+kamailio-mod-tm,,))
$(eval $(call BuildKamailioModule,kemix,KEMI extensions,,,)) $(eval $(call BuildKamailioModule,kemix,KEMI extensions,,,))
$(eval $(call BuildKamailioModule,kex,Core extensions,,)) $(eval $(call BuildKamailioModule,kex,Core extensions,,))
$(eval $(call BuildKamailioModule,lcr,Least Cost Routing,,+kamailio-mod-tm +libpcre)) $(eval $(call BuildKamailioModule,lcr,Least Cost Routing,,+kamailio-mod-tm +libpcre2))
$(eval $(call BuildKamailioModule,ldap,LDAP connector,,+libopenldap)) $(eval $(call BuildKamailioModule,ldap,LDAP connector,,+libopenldap))
$(eval $(call BuildKamailioModule,log_custom,Logging to custom backends,,)) $(eval $(call BuildKamailioModule,log_custom,Logging to custom backends,,))
$(eval $(call BuildKamailioModule,lost,HELD and LOST routing,,+kamailio-mod-http-client,)) $(eval $(call BuildKamailioModule,lost,HELD and LOST routing,,+kamailio-mod-http-client,))
@ -610,7 +610,7 @@ $(eval $(call BuildKamailioModule,pv,Pseudo-Variables,,))
$(eval $(call BuildKamailioModule,pv_headers,Flexible SIP header management,,)) $(eval $(call BuildKamailioModule,pv_headers,Flexible SIP header management,,))
$(eval $(call BuildKamailioModule,qos,QoS control,,+kamailio-mod-dialog)) $(eval $(call BuildKamailioModule,qos,QoS control,,+kamailio-mod-dialog))
$(eval $(call BuildKamailioModule,ratelimit,Traffic shapping,,)) $(eval $(call BuildKamailioModule,ratelimit,Traffic shapping,,))
$(eval $(call BuildKamailioModule,regex,Regular Expression,,+libpcre)) $(eval $(call BuildKamailioModule,regex,Regular Expression,,+libpcre2))
$(eval $(call BuildKamailioModule,registrar,SIP Registrar,,+kamailio-mod-usrloc)) $(eval $(call BuildKamailioModule,registrar,SIP Registrar,,+kamailio-mod-usrloc))
$(eval $(call BuildKamailioModule,rls,Resource List Server,,+kamailio-mod-presence +kamailio-mod-pua +kamailio-mod-tm,)) $(eval $(call BuildKamailioModule,rls,Resource List Server,,+kamailio-mod-presence +kamailio-mod-pua +kamailio-mod-tm,))
$(eval $(call BuildKamailioModule,rr,Record-Route and Route,,)) $(eval $(call BuildKamailioModule,rr,Record-Route and Route,,))

View file

@ -0,0 +1,456 @@
From 374227b15ff7fbed8660beb93d52da15dcb4ba9e Mon Sep 17 00:00:00 2001
From: Victor Seva <linuxmaniac@torreviejawireless.org>
Date: Mon, 21 Aug 2023 12:27:43 +0200
Subject: [PATCH] dialplan: migrate to pcre2
---
src/modules/dialplan/Makefile | 11 +---
src/modules/dialplan/dialplan.c | 5 ++
src/modules/dialplan/dialplan.h | 20 ++++---
src/modules/dialplan/dp_db.c | 103 +++++++++++++++++++-------------
src/modules/dialplan/dp_repl.c | 56 +++++++++++------
5 files changed, 121 insertions(+), 74 deletions(-)
--- a/src/modules/dialplan/Makefile
+++ b/src/modules/dialplan/Makefile
@@ -6,20 +6,15 @@ auto_gen=
NAME=dialplan.so
ifeq ($(CROSS_COMPILE),)
-PCRE_BUILDER = $(shell \
- if pkg-config --exists libcre; then \
- echo 'pkg-config libpcre'; \
- else \
- which pcre-config; \
- fi)
+PCRE_BUILDER = $(shell command -v pcre2-config)
endif
ifeq ($(PCRE_BUILDER),)
PCREDEFS=-I$(LOCALBASE)/include
- PCRELIBS=-L$(LOCALBASE)/lib -lpcre
+ PCRELIBS=-L$(LOCALBASE)/lib -lpcre2-8
else
PCREDEFS = $(shell $(PCRE_BUILDER) --cflags)
- PCRELIBS = $(shell $(PCRE_BUILDER) --libs)
+ PCRELIBS = $(shell $(PCRE_BUILDER) --libs8)
endif
DEFS+=$(PCREDEFS)
LIBS=$(PCRELIBS)
--- a/src/modules/dialplan/dialplan.c
+++ b/src/modules/dialplan/dialplan.c
@@ -5,6 +5,8 @@
*
* Copyright (C) 2014 Olle E. Johansson, Edvina AB
*
+ * Copyright (C) 2023 Victor Seva
+ *
* This file is part of Kamailio, a free SIP server.
*
* Kamailio is free software; you can redistribute it and/or modify
@@ -79,6 +81,9 @@ static int ki_dp_translate_vars(
int dp_replace_fixup(void **param, int param_no);
int dp_replace_fixup_free(void **param, int param_no);
+pcre2_general_context *dpl_gctx = NULL;
+pcre2_compile_context *dpl_ctx = NULL;
+
str dp_attr_pvar_s = STR_NULL;
pv_spec_t *dp_attr_pvar = NULL;
--- a/src/modules/dialplan/dialplan.h
+++ b/src/modules/dialplan/dialplan.h
@@ -13,8 +13,8 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
@@ -30,7 +30,8 @@
#ifndef _DP_DIALPLAN_H
#define _DP_DIALPLAN_H
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "../../core/pvar.h"
#include "../../core/parser/msg_parser.h"
@@ -43,6 +44,9 @@
#define DP_TFLAGS_PV_MATCH (1 << 0)
#define DP_TFLAGS_PV_SUBST (1 << 1)
+extern pcre2_general_context *dpl_gctx;
+extern pcre2_compile_context *dpl_ctx;
+
typedef struct dpl_node
{
int dpid; /* dialplan id */
@@ -52,8 +56,8 @@ typedef struct dpl_node
str match_exp; /* match-first string */
str subst_exp; /* match string with subtitution groupping */
str repl_exp; /* replacement expression string */
- pcre *match_comp; /* compiled matching expression */
- pcre *subst_comp; /* compiled substitution expression */
+ pcre2_code *match_comp; /* compiled matching expression */
+ pcre2_code *subst_comp; /* compiled substitution expression */
struct subst_expr *repl_comp; /* compiled replacement */
str attrs; /* attributes string */
unsigned int tflags; /* flags for type of values for matching */
@@ -103,8 +107,8 @@ struct subst_expr *repl_exp_parse(str su
void repl_expr_free(struct subst_expr *se);
int dp_translate_helper(
sip_msg_t *msg, str *user_name, str *repl_user, dpl_id_p idp, str *);
-int rule_translate(
- sip_msg_t *msg, str *instr, dpl_node_t *rule, pcre *subst_comp, str *);
+int rule_translate(sip_msg_t *msg, str *instr, dpl_node_t *rule,
+ pcre2_code *subst_comp, str *);
-pcre *reg_ex_comp(const char *pattern, int *cap_cnt, int mtype);
+pcre2_code *reg_ex_comp(const char *pattern, int *cap_cnt, int mtype);
#endif
--- a/src/modules/dialplan/dp_db.c
+++ b/src/modules/dialplan/dp_db.c
@@ -196,11 +196,31 @@ void dp_disconnect_db(void)
}
}
+static void *pcre2_malloc(size_t size, void *ext)
+{
+ return shm_malloc(size);
+}
+
+static void pcre2_free(void *ptr, void *ext)
+{
+ shm_free(ptr);
+ ptr = NULL;
+}
int init_data(void)
{
int *p;
+ if((dpl_gctx = pcre2_general_context_create(pcre2_malloc, pcre2_free, NULL))
+ == NULL) {
+ LM_ERR("pcre2 general context creation failed\n");
+ return -1;
+ }
+ if((dpl_ctx = pcre2_compile_context_create(dpl_gctx)) == NULL) {
+ LM_ERR("pcre2 compile context creation failed\n");
+ return -1;
+ }
+
dp_rules_hash = (dpl_id_p *)shm_malloc(2 * sizeof(dpl_id_p));
if(!dp_rules_hash) {
LM_ERR("out of shm memory\n");
@@ -227,6 +247,14 @@ int init_data(void)
void destroy_data(void)
{
+ if(dpl_ctx) {
+ pcre2_compile_context_free(dpl_ctx);
+ }
+
+ if(dpl_gctx) {
+ pcre2_general_context_free(dpl_gctx);
+ }
+
if(dp_rules_hash) {
destroy_hash(0);
destroy_hash(1);
@@ -373,55 +401,50 @@ int dpl_str_to_shm(str src, str *dest, i
/* Compile pcre pattern
- * if mtype==0 - return pointer to shm copy of result
- * if mtype==1 - return pcre pointer that has to be pcre_free() */
-pcre *reg_ex_comp(const char *pattern, int *cap_cnt, int mtype)
-{
- pcre *re, *result;
- const char *error;
- int rc, err_offset;
- size_t size;
+ * if mtype==0 - return pointer using shm
+ * if mtype==1 - return pcre2_code pointer that has to be pcre2_code_free() */
+pcre2_code *reg_ex_comp(const char *pattern, int *cap_cnt, int mtype)
+{
+ pcre2_code *re;
+ int pcre_error_num = 0;
+ char pcre_error[128];
+ size_t pcre_erroffset;
+ int rc;
- re = pcre_compile(pattern, 0, &error, &err_offset, NULL);
+ re = pcre2_compile((PCRE2_SPTR)pattern, PCRE2_ZERO_TERMINATED, 0,
+ &pcre_error_num, &pcre_erroffset, mtype == 0 ? dpl_ctx : NULL);
if(re == NULL) {
- LM_ERR("PCRE compilation of '%s' failed at offset %d: %s\n", pattern,
- err_offset, error);
- return (pcre *)0;
- }
- rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);
- if(rc != 0) {
- pcre_free(re);
- LM_ERR("pcre_fullinfo on compiled pattern '%s' yielded error: %d\n",
- pattern, rc);
- return (pcre *)0;
+ switch(pcre2_get_error_message(
+ pcre_error_num, (PCRE2_UCHAR *)pcre_error, 128)) {
+ case PCRE2_ERROR_NOMEMORY:
+ snprintf(pcre_error, 128,
+ "unknown error[%d]: pcre2 error buffer too small",
+ pcre_error_num);
+ break;
+ case PCRE2_ERROR_BADDATA:
+ snprintf(pcre_error, 128, "unknown pcre2 error[%d]",
+ pcre_error_num);
+ break;
+ }
+ LM_ERR("PCRE compilation of '%s' failed at offset %zu: %s\n", pattern,
+ pcre_erroffset, pcre_error);
+ return NULL;
}
- rc = pcre_fullinfo(re, NULL, PCRE_INFO_CAPTURECOUNT, cap_cnt);
+ rc = pcre2_pattern_info(re, PCRE2_INFO_CAPTURECOUNT, cap_cnt);
if(rc != 0) {
- pcre_free(re);
+ pcre2_code_free(re);
LM_ERR("pcre_fullinfo on compiled pattern '%s' yielded error: %d\n",
pattern, rc);
- return (pcre *)0;
- }
- if(mtype == 0) {
- result = (pcre *)shm_malloc(size);
- if(result == NULL) {
- pcre_free(re);
- LM_ERR("not enough shared memory for compiled PCRE pattern\n");
- return (pcre *)0;
- }
- memcpy(result, re, size);
- pcre_free(re);
- return result;
- } else {
- return re;
+ return NULL;
}
+ return re;
}
/*compile the expressions, and if ok, build the rule */
dpl_node_t *build_rule(db_val_t *values)
{
- pcre *match_comp, *subst_comp;
+ pcre2_code *match_comp, *subst_comp;
struct subst_expr *repl_comp;
dpl_node_t *new_rule;
str match_exp, subst_exp, repl_exp, attrs;
@@ -544,9 +567,9 @@ dpl_node_t *build_rule(db_val_t *values)
err:
if(match_comp)
- shm_free(match_comp);
+ pcre2_code_free(match_comp);
if(subst_comp)
- shm_free(subst_comp);
+ pcre2_code_free(subst_comp);
if(repl_comp)
repl_expr_free(repl_comp);
if(new_rule)
@@ -692,10 +715,10 @@ void destroy_rule(dpl_node_t *rule)
LM_DBG("destroying rule with priority %i\n", rule->pr);
if(rule->match_comp)
- shm_free(rule->match_comp);
+ pcre2_code_free(rule->match_comp);
if(rule->subst_comp)
- shm_free(rule->subst_comp);
+ pcre2_code_free(rule->subst_comp);
/*destroy repl_exp*/
if(rule->repl_comp)
--- a/src/modules/dialplan/dp_repl.c
+++ b/src/modules/dialplan/dp_repl.c
@@ -15,8 +15,8 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
@@ -38,7 +38,7 @@
typedef struct dpl_dyn_pcre
{
- pcre *re;
+ pcre2_code *re;
int cnt;
str expr;
@@ -186,9 +186,10 @@ int dpl_detect_avp_indx(const pv_elem_p
return 0;
}
-pcre *dpl_dyn_pcre_comp(sip_msg_t *msg, str *expr, str *vexpr, int *cap_cnt)
+pcre2_code *dpl_dyn_pcre_comp(
+ sip_msg_t *msg, str *expr, str *vexpr, int *cap_cnt)
{
- pcre *re = NULL;
+ pcre2_code *re = NULL;
int ccnt = 0;
if(expr == NULL || expr->s == NULL || expr->len <= 0 || vexpr == NULL
@@ -225,7 +226,7 @@ dpl_dyn_pcre_p dpl_dynamic_pcre_list(sip
dpl_dyn_pcre_p rt = NULL;
struct str_list *l = NULL;
struct str_list *t = NULL;
- pcre *re = NULL;
+ pcre2_code *re = NULL;
int cnt = 0;
str vexpr = STR_NULL;
@@ -294,7 +295,7 @@ error:
while(re_list) {
rt = re_list->next;
if(re_list->re)
- pcre_free(re_list->re);
+ pcre2_code_free(re_list->re);
pkg_free(re_list);
re_list = rt;
}
@@ -400,15 +401,16 @@ error:
#define MAX_PHONE_NB_DIGITS 127
static char dp_output_buf[MAX_PHONE_NB_DIGITS + 1];
int rule_translate(sip_msg_t *msg, str *instr, dpl_node_t *rule,
- pcre *subst_comp, str *result)
+ pcre2_code *subst_comp, str *result)
{
int repl_nb, offset, match_nb, rc, cap_cnt;
struct replace_with token;
struct subst_expr *repl_comp;
+ pcre2_match_data *pcre_md = NULL;
str match;
pv_value_t sv;
str *uri;
- int ovector[3 * (MAX_REPLACE_WITH + 1)];
+ PCRE2_SIZE *ovector = NULL;
char *p;
int size;
@@ -424,7 +426,7 @@ int rule_translate(sip_msg_t *msg, str *
if(subst_comp) {
/*just in case something went wrong at load time*/
- rc = pcre_fullinfo(subst_comp, NULL, PCRE_INFO_CAPTURECOUNT, &cap_cnt);
+ rc = pcre2_pattern_info(subst_comp, PCRE2_INFO_CAPTURECOUNT, &cap_cnt);
if(rc != 0) {
LM_ERR("pcre_fullinfo on compiled pattern yielded error: %d\n", rc);
return -1;
@@ -441,15 +443,19 @@ int rule_translate(sip_msg_t *msg, str *
}
/*search for the pattern from the compiled subst_exp*/
- if(pcre_exec(subst_comp, NULL, instr->s, instr->len, 0, 0, ovector,
- 3 * (MAX_REPLACE_WITH + 1))
+ pcre_md = pcre2_match_data_create_from_pattern(subst_comp, NULL);
+ if(pcre2_match(subst_comp, (PCRE2_SPTR)instr->s, (PCRE2_SIZE)instr->len,
+ 0, 0, pcre_md, NULL)
<= 0) {
LM_DBG("the string %.*s matched "
"the match_exp %.*s but not the subst_exp %.*s!\n",
instr->len, instr->s, rule->match_exp.len,
rule->match_exp.s, rule->subst_exp.len, rule->subst_exp.s);
+ if(pcre_md)
+ pcre2_match_data_free(pcre_md);
return -1;
}
+ ovector = pcre2_get_ovector_pointer(pcre_md);
}
/*simply copy from the replacing string*/
@@ -463,6 +469,8 @@ int rule_translate(sip_msg_t *msg, str *
memcpy(result->s, repl_comp->replacement.s, repl_comp->replacement.len);
result->len = repl_comp->replacement.len;
result->s[result->len] = '\0';
+ if(pcre_md)
+ pcre2_match_data_free(pcre_md);
return 0;
}
@@ -571,11 +579,15 @@ int rule_translate(sip_msg_t *msg, str *
}
result->s[result->len] = '\0';
+ if(pcre_md)
+ pcre2_match_data_free(pcre_md);
return 0;
error:
result->s = 0;
result->len = 0;
+ if(pcre_md)
+ pcre2_match_data_free(pcre_md);
return -1;
}
@@ -584,6 +596,7 @@ static char dp_attrs_buf[DP_MAX_ATTRS_LE
int dp_translate_helper(
sip_msg_t *msg, str *input, str *output, dpl_id_p idp, str *attrs)
{
+ pcre2_match_data *pcre_md = NULL;
dpl_node_p rulep;
dpl_index_p indexp;
int user_len, rez;
@@ -624,21 +637,28 @@ search_rule:
rez = -1;
do {
if(rez < 0) {
- rez = pcre_exec(re_list->re, NULL, input->s,
- input->len, 0, 0, NULL, 0);
+ pcre_md = pcre2_match_data_create_from_pattern(
+ re_list->re, NULL);
+ rez = pcre2_match(re_list->re, (PCRE2_SPTR)input->s,
+ (PCRE2_SIZE)input->len, 0, 0, pcre_md,
+ NULL);
LM_DBG("match check: [%.*s] %d\n",
re_list->expr.len, re_list->expr.s, rez);
} else
LM_DBG("match check skipped: [%.*s] %d\n",
re_list->expr.len, re_list->expr.s, rez);
rt = re_list->next;
- pcre_free(re_list->re);
+ pcre2_match_data_free(pcre_md);
+ pcre2_code_free(re_list->re);
pkg_free(re_list);
re_list = rt;
} while(re_list);
} else {
- rez = pcre_exec(rulep->match_comp, NULL, input->s,
- input->len, 0, 0, NULL, 0);
+ pcre_md = pcre2_match_data_create_from_pattern(
+ rulep->match_comp, NULL);
+ rez = pcre2_match(rulep->match_comp, (PCRE2_SPTR)input->s,
+ (PCRE2_SIZE)input->len, 0, 0, pcre_md, 0);
+ pcre2_match_data_free(pcre_md);
}
break;
@@ -728,7 +748,7 @@ repl:
LM_DBG("subst check skipped: [%.*s] %d\n", re_list->expr.len,
re_list->expr.s, rez);
rt = re_list->next;
- pcre_free(re_list->re);
+ pcre2_code_free(re_list->re);
pkg_free(re_list);
re_list = rt;
} while(re_list);

View file

@ -0,0 +1,510 @@
From ecc2c9e54fa8f24c1e96860c1f59b43f2e1e8b7a Mon Sep 17 00:00:00 2001
From: Victor Seva <linuxmaniac@torreviejawireless.org>
Date: Wed, 17 May 2023 16:36:55 +0200
Subject: [PATCH] lcr: clang-format for coherent indentation and coding style
---
src/modules/lcr/lcr_mod.c | 125 +++++++++++++++++++++-----------------
src/modules/lcr/lcr_rpc.c | 65 ++++++++++----------
2 files changed, 102 insertions(+), 88 deletions(-)
--- a/src/modules/lcr/lcr_mod.c
+++ b/src/modules/lcr/lcr_mod.c
@@ -259,7 +259,8 @@ static int inactivate_gw(struct sip_msg
static int defunct_gw(struct sip_msg *_m, char *_s1, char *_s2);
static int from_gw_1(struct sip_msg *_m, char *_s1, char *_s2);
static int from_gw_3(struct sip_msg *_m, char *_s1, char *_s2, char *_s3);
-static int from_gw_4(struct sip_msg *_m, char *_s1, char *_s2, char *_s3, char *_s4);
+static int from_gw_4(
+ struct sip_msg *_m, char *_s1, char *_s2, char *_s3, char *_s4);
static int from_any_gw_0(struct sip_msg *_m, char *_s1, char *_s2);
static int from_any_gw_2(struct sip_msg *_m, char *_s1, char *_s2);
static int from_any_gw_3(struct sip_msg *_m, char *_s1, char *_s2, char *_s3);
@@ -554,7 +555,8 @@ static int mod_init(void)
LM_ERR("malformed or non AVP definition <%s>\n", rule_id_avp_param);
return -1;
}
- if(pv_get_avp_name(0, &(avp_spec->pvp), &rule_id_avp, &avp_flags) != 0) {
+ if(pv_get_avp_name(0, &(avp_spec->pvp), &rule_id_avp, &avp_flags)
+ != 0) {
LM_ERR("invalid AVP definition <%s>\n", rule_id_avp_param);
return -1;
}
@@ -680,18 +682,21 @@ static int mod_init(void)
LM_ERR("unable to open database connection\n");
return -1;
}
- if(db_check_table_version(&lcr_dbf, dbh, &lcr_rule_table,
- LCR_RULE_TABLE_VERSION) < 0) {
+ if(db_check_table_version(
+ &lcr_dbf, dbh, &lcr_rule_table, LCR_RULE_TABLE_VERSION)
+ < 0) {
DB_TABLE_VERSION_ERROR(lcr_rule_table);
goto dberror;
}
if(db_check_table_version(&lcr_dbf, dbh, &lcr_rule_target_table,
- LCR_RULE_TARGET_TABLE_VERSION) < 0) {
+ LCR_RULE_TARGET_TABLE_VERSION)
+ < 0) {
DB_TABLE_VERSION_ERROR(lcr_rule_target_table);
goto dberror;
}
- if (db_check_table_version(&lcr_dbf, dbh, &lcr_gw_table,
- LCR_GW_TABLE_VERSION) < 0) {
+ if(db_check_table_version(
+ &lcr_dbf, dbh, &lcr_gw_table, LCR_GW_TABLE_VERSION)
+ < 0) {
DB_TABLE_VERSION_ERROR(lcr_gw_table);
goto dberror;
}
@@ -923,20 +928,24 @@ static int comp_gws(const void *_g1, con
/*
* Compare a gateway using IP address and the src port
*/
-static struct gw_info * find_gateway_by_ip_and_port(struct gw_info * gw, struct gw_info * gws) {
+static struct gw_info *find_gateway_by_ip_and_port(
+ struct gw_info *gw, struct gw_info *gws)
+{
int tmp = 0, gw_index = 0, i;
- for (i = 1; i <= gws[0].ip_addr.u.addr32[0]; i++) {
- tmp = memcmp(gws[i].ip_addr.u.addr, gw->ip_addr.u.addr, gws[i].ip_addr.len);
- if (gws[i].ip_addr.af == gw->ip_addr.af &&
- gws[i].ip_addr.len == gw->ip_addr.len &&
- tmp == 0 && /* a comparison of the IP address value */
- gws[i].port == gw->port) {
- gw_index = i;
- break;
+ for(i = 1; i <= gws[0].ip_addr.u.addr32[0]; i++) {
+ tmp = memcmp(
+ gws[i].ip_addr.u.addr, gw->ip_addr.u.addr, gws[i].ip_addr.len);
+ if(gws[i].ip_addr.af == gw->ip_addr.af
+ && gws[i].ip_addr.len == gw->ip_addr.len && tmp == 0
+ && /* a comparison of the IP address value */
+ gws[i].port == gw->port) {
+ gw_index = i;
+ break;
}
}
- if (gw_index != 0) return &(gws[gw_index]);
+ if(gw_index != 0)
+ return &(gws[gw_index]);
return NULL;
}
@@ -1074,7 +1083,7 @@ static int insert_gws(db1_res_t *res, st
row = RES_ROWS(res) + i;
if((VAL_NULL(ROW_VALUES(row) + 12) == 1)
|| ((VAL_TYPE(ROW_VALUES(row) + 12) != DB1_INT)
- && (VAL_TYPE(ROW_VALUES(row) + 12) != DB1_UINT))) {
+ && (VAL_TYPE(ROW_VALUES(row) + 12) != DB1_UINT))) {
LM_ERR("lcr_gw id at row <%u> is null or not int\n", i);
return 0;
}
@@ -1501,8 +1510,7 @@ int reload_tables()
if((VAL_NULL(ROW_VALUES(row)) == 1)
|| ((VAL_TYPE(ROW_VALUES(row)) != DB1_INT)
- && (VAL_TYPE(ROW_VALUES(row))
- != DB1_UINT))) {
+ && (VAL_TYPE(ROW_VALUES(row)) != DB1_UINT))) {
LM_ERR("lcr rule id at row <%u> is null or not int\n", i);
goto err;
}
@@ -1544,8 +1552,8 @@ int reload_tables()
if((VAL_NULL(ROW_VALUES(row) + 3) == 1)
|| ((VAL_TYPE(ROW_VALUES(row) + 3) != DB1_INT)
- && (VAL_TYPE(ROW_VALUES(row) + 3)
- != DB1_UINT))) {
+ && (VAL_TYPE(ROW_VALUES(row) + 3)
+ != DB1_UINT))) {
LM_ERR("lcr rule <%u> stopper is NULL or not int\n",
rule_id);
goto err;
@@ -1558,8 +1566,8 @@ int reload_tables()
if((VAL_NULL(ROW_VALUES(row) + 4) == 1)
|| ((VAL_TYPE(ROW_VALUES(row) + 4) != DB1_INT)
- && (VAL_TYPE(ROW_VALUES(row) + 4)
- != DB1_UINT))) {
+ && (VAL_TYPE(ROW_VALUES(row) + 4)
+ != DB1_UINT))) {
LM_ERR("lcr rule <%u> enabled is NULL or not int\n",
rule_id);
goto err;
@@ -1769,8 +1777,7 @@ int reload_tables()
row = RES_ROWS(res) + i;
if((VAL_NULL(ROW_VALUES(row)) == 1)
|| ((VAL_TYPE(ROW_VALUES(row)) != DB1_INT)
- && (VAL_TYPE(ROW_VALUES(row))
- != DB1_UINT))) {
+ && (VAL_TYPE(ROW_VALUES(row)) != DB1_UINT))) {
LM_ERR("lcr_rule_target rule_id at row <%u> is null "
"or not int\n",
i);
@@ -1779,8 +1786,8 @@ int reload_tables()
rule_id = (unsigned int)VAL_INT(ROW_VALUES(row));
if((VAL_NULL(ROW_VALUES(row) + 1) == 1)
|| ((VAL_TYPE(ROW_VALUES(row) + 1) != DB1_INT)
- && (VAL_TYPE(ROW_VALUES(row) + 1)
- != DB1_UINT))) {
+ && (VAL_TYPE(ROW_VALUES(row) + 1)
+ != DB1_UINT))) {
LM_ERR("lcr_rule_target gw_id at row <%u> is null "
"or not int\n",
i);
@@ -1789,8 +1796,8 @@ int reload_tables()
gw_id = (unsigned int)VAL_INT(ROW_VALUES(row) + 1);
if((VAL_NULL(ROW_VALUES(row) + 2) == 1)
|| ((VAL_TYPE(ROW_VALUES(row) + 2) != DB1_INT)
- && (VAL_TYPE(ROW_VALUES(row) + 2)
- != DB1_UINT))) {
+ && (VAL_TYPE(ROW_VALUES(row) + 2)
+ != DB1_UINT))) {
LM_ERR("lcr_rule_target priority at row <%u> is null "
"or not int\n",
i);
@@ -1805,8 +1812,8 @@ int reload_tables()
}
if((VAL_NULL(ROW_VALUES(row) + 3) == 1)
|| ((VAL_TYPE(ROW_VALUES(row) + 3) != DB1_INT)
- && (VAL_TYPE(ROW_VALUES(row) + 3)
- != DB1_UINT))) {
+ && (VAL_TYPE(ROW_VALUES(row) + 3)
+ != DB1_UINT))) {
LM_ERR("lcr_rule_target weight at row <%u> is null "
"or not int\n",
i);
@@ -2087,10 +2094,10 @@ void add_gws_into_avps(struct gw_info *g
if(5 /* gw_index */ + 5 /* scheme */ + 4 /* strip */ + prefix_len
+ tag_len + 1 /* @ */
+ ((hostname_len > IP6_MAX_STR_SIZE + 2)
- ? hostname_len
- : IP6_MAX_STR_SIZE + 2)
+ ? hostname_len
+ : IP6_MAX_STR_SIZE + 2)
+ 6 /* port */ + params_len /* params */
- + 15 /* transport */ + 10 /* flags */
+ + 15 /* transport */ + 10 /* flags */
+ 7 /* separators */
+ 10 /* rule_id */
> MAX_URI_LEN) {
@@ -2174,7 +2181,7 @@ int load_gws_dummy(int lcr_id, str *ruri
if((rule->from_uri_len != 0)
&& (pcre_exec(rule->from_uri_re, NULL, from_uri->s,
from_uri->len, 0, 0, NULL, 0)
- < 0))
+ < 0))
goto next;
if((from_uri->len > 0) && (rule->mt_tvalue_len > 0)) {
@@ -2339,7 +2346,7 @@ static int ki_load_gws_furi(
if((rule->from_uri_len != 0)
&& (pcre_exec(rule->from_uri_re, NULL, from_uri->s,
from_uri->len, 0, 0, NULL, 0)
- < 0)) {
+ < 0)) {
LM_DBG("from uri <%.*s> did not match to from regex <%.*s>\n",
from_uri->len, from_uri->s, rule->from_uri_len,
rule->from_uri);
@@ -2375,7 +2382,7 @@ static int ki_load_gws_furi(
if((rule->request_uri_len != 0)
&& (pcre_exec(rule->request_uri_re, NULL, request_uri->s,
request_uri->len, 0, 0, NULL, 0)
- < 0)) {
+ < 0)) {
LM_DBG("request uri <%.*s> did not match to request regex "
"<%.*s>\n",
request_uri->len, request_uri->s, rule->request_uri_len,
@@ -2549,7 +2556,8 @@ static int generate_uris(struct sip_msg
return 0; /* No more gateways left */
decode_avp_value(gw_uri_val.s.s, gw_index, &scheme, &strip, &prefix,
- &tmp_tag, addr, &hostname, &port, &params, &transport, flags, rule_id);
+ &tmp_tag, addr, &hostname, &port, &params, &transport, flags,
+ rule_id);
if(addr->af != 0) {
addr_str.s = ip_addr2a(addr);
@@ -2560,8 +2568,8 @@ static int generate_uris(struct sip_msg
if(scheme.len + r_uri_user->len - strip + prefix.len + 1 /* @ */
+ ((hostname.len > IP6_MAX_STR_SIZE + 2)
- ? hostname.len
- : IP6_MAX_STR_SIZE + 2)
+ ? hostname.len
+ : IP6_MAX_STR_SIZE + 2)
+ 1 /* : */ + port.len + params.len + transport.len
+ 1 /* null */
> MAX_URI_LEN) {
@@ -2992,7 +3000,7 @@ static int ki_next_gw(sip_msg_t *_m)
if(rule_id_avp_param) {
val.n = rule_id;
add_avp(rule_id_avp_type, rule_id_avp, val);
- LM_DBG("added rule_id_avp <%u>\n", (unsigned int)val.n);
+ LM_DBG("added rule_id_avp <%u>\n", (unsigned int)val.n);
}
/* Add index of selected gw to defunct gw AVP */
@@ -3018,7 +3026,8 @@ static int next_gw(struct sip_msg *_m, c
* Checks if request comes from ip address of a gateway
*/
static int do_from_gw(struct sip_msg *_m, unsigned int lcr_id,
- struct ip_addr *src_addr, uri_transport transport, unsigned int src_port)
+ struct ip_addr *src_addr, uri_transport transport,
+ unsigned int src_port)
{
struct gw_info *res, gw, *gws;
int_str val;
@@ -3032,18 +3041,20 @@ static int do_from_gw(struct sip_msg *_m
}
gw.ip_addr = *src_addr;
- if (src_port != 0) {
+ if(src_port != 0) {
/* Search for gw based on its ip address and port */
gw.port = src_port;
res = find_gateway_by_ip_and_port(&gw, gws);
} else {
/* Search for gw based on its ip address */
- res = (struct gw_info *)bsearch(&gw, &(gws[1]), gws[0].ip_addr.u.addr32[0],
- sizeof(struct gw_info), comp_gws);
+ res = (struct gw_info *)bsearch(&gw, &(gws[1]),
+ gws[0].ip_addr.u.addr32[0], sizeof(struct gw_info), comp_gws);
}
/* Store tag and flags and return result */
- if((res != NULL) && ((transport == PROTO_NONE) || (res->transport_code == transport))) {
+ if((res != NULL)
+ && ((transport == PROTO_NONE)
+ || (res->transport_code == transport))) {
LM_DBG("request came from gw\n");
if(tag_avp_param) {
val.s.s = res->tag;
@@ -3178,8 +3189,8 @@ static int from_gw_3(
return ki_from_gw_addr_port(_m, lcr_id, &addr_str, transport, 0);
}
-static int from_gw_4(
- struct sip_msg *_m, char *_lcr_id, char *_addr, char *_transport, char *_src_port)
+static int from_gw_4(struct sip_msg *_m, char *_lcr_id, char *_addr,
+ char *_transport, char *_src_port)
{
int lcr_id;
str addr_str;
@@ -3202,7 +3213,7 @@ static int from_gw_4(
LM_ERR("invalid transport parameter %s\n", _lcr_id);
return -1;
}
- tmp=0;
+ tmp = 0;
src_port = strtol(_src_port, &tmp, 10);
if((tmp == 0) || (*tmp) || (tmp == _src_port)) {
LM_ERR("invalid port parameter %s\n", _src_port);
@@ -3243,8 +3254,8 @@ static int from_any_gw_0(struct sip_msg
* Checks if request comes from ip address of a gateway taking source
* IP address, transport protocol and source port from parameters.
*/
-static int ki_from_any_gw_addr_port(sip_msg_t *_m, str *addr_str, int transport,
- int src_port)
+static int ki_from_any_gw_addr_port(
+ sip_msg_t *_m, str *addr_str, int transport, int src_port)
{
unsigned int i;
struct ip_addr *ip, src_addr;
@@ -3307,7 +3318,8 @@ static int from_any_gw_2(struct sip_msg
return ki_from_any_gw_addr_port(_m, &addr_str, transport, 0);
}
-static int from_any_gw_3(struct sip_msg *_m, char *_addr, char *_transport, char *_src_port)
+static int from_any_gw_3(
+ struct sip_msg *_m, char *_addr, char *_transport, char *_src_port)
{
str addr_str;
uri_transport transport;
@@ -3323,7 +3335,7 @@ static int from_any_gw_3(struct sip_msg
LM_ERR("invalid transport parameter %s\n", _transport);
return -1;
}
- tmp=0;
+ tmp = 0;
src_port = strtol(_src_port, &tmp, 10);
if((tmp == 0) || (*tmp) || (tmp == _src_port)) {
LM_ERR("invalid port parameter %s\n", _src_port);
@@ -3355,8 +3367,9 @@ static int do_to_gw(struct sip_msg *_m,
sizeof(struct gw_info), comp_gws);
/* Return result */
- if((res != NULL) && ((transport == PROTO_NONE)
- || (res->transport_code == transport))) {
+ if((res != NULL)
+ && ((transport == PROTO_NONE)
+ || (res->transport_code == transport))) {
LM_DBG("request goes to gw\n");
return 1;
} else {
--- a/src/modules/lcr/lcr_rpc.c
+++ b/src/modules/lcr/lcr_rpc.c
@@ -48,7 +48,8 @@ static void reload(rpc_t *rpc, void *c)
static const char *dump_gws_doc[2] = {"Dump the contents of lcr_gws table.", 0};
-static void dump_gw(rpc_t *rpc, void *st, struct gw_info *gw, unsigned int gw_index, unsigned int lcr_id)
+static void dump_gw(rpc_t *rpc, void *st, struct gw_info *gw,
+ unsigned int gw_index, unsigned int lcr_id)
{
str scheme, gw_name, hostname, params, transport;
str prefix, tag;
@@ -72,14 +73,10 @@ static void dump_gw(rpc_t *rpc, void *st
break;
case AF_INET6:
rpc->struct_printf(st, "ip_addr", "%x:%x:%x:%x:%x:%x:%x:%x",
- gw->ip_addr.u.addr16[0],
- gw->ip_addr.u.addr16[1],
- gw->ip_addr.u.addr16[2],
- gw->ip_addr.u.addr16[3],
- gw->ip_addr.u.addr16[4],
- gw->ip_addr.u.addr16[5],
- gw->ip_addr.u.addr16[6],
- gw->ip_addr.u.addr16[7]);
+ gw->ip_addr.u.addr16[0], gw->ip_addr.u.addr16[1],
+ gw->ip_addr.u.addr16[2], gw->ip_addr.u.addr16[3],
+ gw->ip_addr.u.addr16[4], gw->ip_addr.u.addr16[5],
+ gw->ip_addr.u.addr16[6], gw->ip_addr.u.addr16[7]);
break;
case 0:
rpc->struct_add(st, "s", "ip_addr", "0.0.0.0");
@@ -99,11 +96,10 @@ static void dump_gw(rpc_t *rpc, void *st
prefix.len = gw->prefix_len;
tag.s = gw->tag;
tag.len = gw->tag_len;
- start = int2strbuf(
- gw->defunct_until, &(buf[0]), INT2STR_MAX_LEN, &len);
- rpc->struct_add(st, "dSSdds", "strip", gw->strip, "prefix",
- &prefix, "tag", &tag, "flags", gw->flags, "state",
- gw->state, "defunct_until", start);
+ start = int2strbuf(gw->defunct_until, &(buf[0]), INT2STR_MAX_LEN, &len);
+ rpc->struct_add(st, "dSSdds", "strip", gw->strip, "prefix", &prefix, "tag",
+ &tag, "flags", gw->flags, "state", gw->state, "defunct_until",
+ start);
}
static void dump_gws(rpc_t *rpc, void *c)
@@ -119,7 +115,7 @@ static void dump_gws(rpc_t *rpc, void *c
gws = gw_pt[j];
for(i = 1; i <= gws[0].ip_addr.u.addr32[0]; i++) {
- if (srec==NULL) {
+ if(srec == NULL) {
/* We create one array per lcr_id */
if(rpc->add(c, "{", &rec) < 0)
return;
@@ -143,7 +139,7 @@ static void dump_rules(rpc_t *rpc, void
int i, j;
int _filter_by_prefix = 0;
int _lcr_id = 0;
- str _prefix = {NULL,0};
+ str _prefix = {NULL, 0};
struct rule_info **rules, *rule;
struct target *t;
void *rec = NULL;
@@ -151,29 +147,32 @@ static void dump_rules(rpc_t *rpc, void
void *st, *sst, *ssst;
str prefix, from_uri, request_uri;
- if (rpc->scan(c, "d", &_lcr_id)>0) {
- if (rpc->scan(c, ".S", &_prefix)>0) {
+ if(rpc->scan(c, "d", &_lcr_id) > 0) {
+ if(rpc->scan(c, ".S", &_prefix) > 0) {
_filter_by_prefix = 1;
}
}
for(j = 1; j <= lcr_count_param; j++) {
- if (_lcr_id && _lcr_id!=j) continue;
+ if(_lcr_id && _lcr_id != j)
+ continue;
rules = rule_pt[j];
for(i = 0; i < lcr_rule_hash_size_param; i++) {
rule = rules[i];
while(rule) {
- if (_filter_by_prefix && _prefix.len && _prefix.s) {
- if (_prefix.len < rule->prefix_len ||
- strncmp(_prefix.s, rule->prefix, rule->prefix_len)!=0) {
+ if(_filter_by_prefix && _prefix.len && _prefix.s) {
+ if(_prefix.len < rule->prefix_len
+ || strncmp(_prefix.s, rule->prefix,
+ rule->prefix_len)
+ != 0) {
rule = rule->next;
continue;
}
}
- if (srec==NULL) {
+ if(srec == NULL) {
/* We create one array per lcr_id */
if(rpc->add(c, "{", &rec) < 0)
return;
@@ -192,11 +191,11 @@ static void dump_rules(rpc_t *rpc, void
rule->rule_id, "prefix", &prefix, "from_uri", &from_uri,
"request_uri", &request_uri, "stopper", rule->stopper);
t = rule->targets;
- if (t) {
- if (rpc->struct_add(st, "[", "gw", &sst) < 0)
+ if(t) {
+ if(rpc->struct_add(st, "[", "gw", &sst) < 0)
return;
while(t) {
- if (rpc->array_add(sst, "{", &ssst) < 0)
+ if(rpc->array_add(sst, "{", &ssst) < 0)
return;
rpc->struct_add(ssst, "ddd", "gw_index", t->gw_index,
"priority", t->priority, "weight", t->weight);
@@ -210,10 +209,10 @@ static void dump_rules(rpc_t *rpc, void
/* Mark the end of rule array */
srec = NULL;
- if (_filter_by_prefix)
+ if(_filter_by_prefix)
continue;
rule = rules[lcr_rule_hash_size_param];
- if (rule) {
+ if(rule) {
if(rpc->struct_add(rec, "[", "prefix_len", &st) < 0)
return;
while(rule) {
@@ -222,7 +221,8 @@ static void dump_rules(rpc_t *rpc, void
}
}
}
- if (rec==NULL) rpc->fault(c, 404, "Empty reply");
+ if(rec == NULL)
+ rpc->fault(c, 404, "Empty reply");
}
@@ -269,8 +269,9 @@ static void load_gws(rpc_t *rpc, void *c
ret = rpc->scan(c, "dS*SS", &lcr_id, &uri_user, &caller_uri, &request_uri);
if(ret == -1) {
- rpc->fault(c, 400, "parameter error; if using cli, remember to prefix "
- "numeric uri_user param value with 's:'");
+ rpc->fault(c, 400,
+ "parameter error; if using cli, remember to prefix "
+ "numeric uri_user param value with 's:'");
return;
}
@@ -289,7 +290,7 @@ static void load_gws(rpc_t *rpc, void *c
gws = gw_pt[lcr_id];
for(j = 0; j < gw_count; j++) {
- if (rec==NULL) {
+ if(rec == NULL) {
if(rpc->add(c, "[", &rec) < 0)
return;
}

View file

@ -0,0 +1,51 @@
From 70a9ea2b1e5cceeaf050356e7baf00127a58567d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=94=D0=B8=D0=BB=D1=8F=D0=BD=20=D0=9F=D0=B0=D0=BB=D0=B0?=
=?UTF-8?q?=D1=83=D0=B7=D0=BE=D0=B2?= <git-dpa@aegee.org>
Date: Mon, 8 May 2023 13:13:49 +0200
Subject: [PATCH] lcr: typos
---
src/modules/lcr/doc/lcr_admin.xml | 2 +-
src/modules/lcr/lcr_mod.c | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
--- a/src/modules/lcr/doc/lcr_admin.xml
+++ b/src/modules/lcr/doc/lcr_admin.xml
@@ -1641,7 +1641,7 @@ if (to_any_gw("192.55.66.2", 1)) {
<para>
Causes lcr module to dump the contents of its
in-memory lcr_rule and lcr_rule_target tables.
- Rules can be filetered by lcr_id or lcr_id and prefix.
+ Rules can be filtered by lcr_id or lcr_id and prefix.
The filters are passed as optional parameters.
</para>
<para>Parameters:</para>
--- a/src/modules/lcr/lcr_mod.c
+++ b/src/modules/lcr/lcr_mod.c
@@ -188,7 +188,7 @@ unsigned int lcr_gw_count_param = DEF_LC
/* can gws be defuncted */
static unsigned int defunct_capability_param = 0;
-/* dont strip or tag param */
+/* don't strip or tag param */
static int dont_strip_or_prefix_flag_param = -1;
/* ping related params */
@@ -846,7 +846,7 @@ static int comp_matched(const void *m1,
if(mi1->priority < mi2->priority)
return 1;
if(mi1->priority == mi2->priority) {
- /* Sort by randomized weigth */
+ /* Sort by randomized weight */
if(mi1->weight > mi2->weight)
return 1;
if(mi1->weight == mi2->weight)
@@ -863,7 +863,7 @@ static int comp_matched(const void *m1,
if(mi1->priority < mi2->priority)
return 1;
if(mi1->priority == mi2->priority) {
- /* Sort by randomized weigth */
+ /* Sort by randomized weight */
if(mi1->weight > mi2->weight)
return 1;
if(mi1->weight == mi2->weight)

View file

@ -0,0 +1,508 @@
From e3e2c41e8c46a13bad18dd40fd9e3540020dd5eb Mon Sep 17 00:00:00 2001
From: Victor Seva <linuxmaniac@torreviejawireless.org>
Date: Mon, 21 Aug 2023 13:30:36 +0200
Subject: [PATCH] lcr: pcre2 migration
---
src/modules/lcr/Makefile | 12 +--
src/modules/lcr/hash.c | 24 ++---
src/modules/lcr/hash.h | 10 +-
src/modules/lcr/lcr_mod.c | 187 +++++++++++++++++++++++++-------------
src/modules/lcr/lcr_mod.h | 8 +-
5 files changed, 150 insertions(+), 91 deletions(-)
--- a/src/modules/lcr/Makefile
+++ b/src/modules/lcr/Makefile
@@ -9,20 +9,15 @@ auto_gen=
NAME=lcr.so
ifeq ($(CROSS_COMPILE),)
-PCRE_BUILDER = $(shell \
- if pkg-config --exists libcre; then \
- echo 'pkg-config libpcre'; \
- else \
- which pcre-config; \
- fi)
+PCRE_BUILDER = $(shell command -v pcre2-config)
endif
ifeq ($(PCRE_BUILDER),)
PCREDEFS=-I$(LOCALBASE)/include
- PCRELIBS=-L$(LOCALBASE)/lib -lpcre
+ PCRELIBS=-L$(LOCALBASE)/lib -lpcre2-8
else
PCREDEFS = $(shell $(PCRE_BUILDER) --cflags)
- PCRELIBS = $(shell $(PCRE_BUILDER) --libs)
+ PCRELIBS = $(shell $(PCRE_BUILDER) --libs8)
endif
DEFS+=$(PCREDEFS)
@@ -31,4 +26,3 @@ LIBS+=$(PCRELIBS)
SERLIBPATH=../../lib
SER_LIBS+=$(SERLIBPATH)/srdb1/srdb1
include ../../Makefile.modules
-
--- a/src/modules/lcr/hash.c
+++ b/src/modules/lcr/hash.c
@@ -15,8 +15,8 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@@ -36,10 +36,10 @@
/* Add lcr entry into hash table */
int rule_hash_table_insert(struct rule_info **hash_table, unsigned int lcr_id,
unsigned int rule_id, unsigned short prefix_len, char *prefix,
- unsigned short from_uri_len, char *from_uri, pcre *from_uri_re,
+ unsigned short from_uri_len, char *from_uri, pcre2_code *from_uri_re,
unsigned short mt_tvalue_len, char *mt_tvalue,
- unsigned short request_uri_len, char *request_uri, pcre *request_uri_re,
- unsigned short stopper)
+ unsigned short request_uri_len, char *request_uri,
+ pcre2_code *request_uri_re, unsigned short stopper)
{
struct rule_info *rule;
str prefix_str;
@@ -50,9 +50,9 @@ int rule_hash_table_insert(struct rule_i
if(rule == NULL) {
SHM_MEM_ERROR_FMT("for rule hash table entry\n");
if(from_uri_re)
- shm_free(from_uri_re);
+ pcre2_code_free(from_uri_re);
if(request_uri_re)
- shm_free(request_uri_re);
+ pcre2_code_free(request_uri_re);
return 0;
}
memset(rule, 0, sizeof(struct rule_info));
@@ -99,9 +99,9 @@ int rule_hash_table_insert(struct rule_i
if(rid == NULL) {
PKG_MEM_ERROR_FMT("for rule_id hash table entry\n");
if(from_uri_re)
- shm_free(from_uri_re);
+ pcre2_code_free(from_uri_re);
if(request_uri_re)
- shm_free(request_uri_re);
+ pcre2_code_free(request_uri_re);
shm_free(rule);
return 0;
}
@@ -180,7 +180,7 @@ int rule_hash_table_insert_target(struct
}
-/*
+/*
* Return pointer to lcr hash table entry to which given prefix hashes to.
*/
struct rule_info *rule_hash_table_lookup(
@@ -209,10 +209,10 @@ void rule_hash_table_contents_free(struc
r = hash_table[i];
while(r) {
if(r->from_uri_re) {
- shm_free(r->from_uri_re);
+ pcre2_code_free(r->from_uri_re);
}
if(r->request_uri_re)
- shm_free(r->request_uri_re);
+ pcre2_code_free(r->request_uri_re);
t = r->targets;
while(t) {
next_t = t->next;
--- a/src/modules/lcr/hash.h
+++ b/src/modules/lcr/hash.h
@@ -15,8 +15,8 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
@@ -34,10 +34,10 @@
int rule_hash_table_insert(struct rule_info **hash_table, unsigned int lcr_id,
unsigned int rule_id, unsigned short prefix_len, char *prefix,
- unsigned short from_uri_len, char *from_uri, pcre *from_uri_re,
+ unsigned short from_uri_len, char *from_uri, pcre2_code *from_uri_re,
unsigned short mt_tvalue_len, char *mt_tvalue,
- unsigned short request_uri_len, char *request_uri, pcre *request_uri_re,
- unsigned short stopper);
+ unsigned short request_uri_len, char *request_uri,
+ pcre2_code *request_uri_re, unsigned short stopper);
int rule_hash_table_insert_target(struct rule_info **hash_table,
struct gw_info *gws, unsigned int rule_id, unsigned int gw_id,
--- a/src/modules/lcr/lcr_mod.c
+++ b/src/modules/lcr/lcr_mod.c
@@ -16,8 +16,8 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
@@ -43,7 +43,8 @@
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "../../core/locking.h"
#include "../../core/sr_module.h"
#include "../../core/dprint.h"
@@ -204,6 +205,9 @@ static unsigned int priority_ordering_pa
/* mtree tree name */
str mtree_param = {"lcr", 3};
+static pcre2_general_context *lcr_gctx = NULL;
+static pcre2_compile_context *lcr_ctx = NULL;
+
/*
* Other module types and variables
*/
@@ -364,7 +368,7 @@ static param_export_t params[] = {
* Module interface
*/
struct module_exports exports = {
- "lcr",
+ "lcr",
DEFAULT_DLFLAGS, /* dlopen flags */
cmds, /* Exported functions */
params, /* Exported parameters */
@@ -422,6 +426,16 @@ static void lcr_db_close(void)
}
}
+static void *pcre2_malloc(size_t size, void *ext)
+{
+ return shm_malloc(size);
+}
+
+static void pcre2_free(void *ptr, void *ext)
+{
+ shm_free(ptr);
+ ptr = NULL;
+}
/*
* Module initialization function that is called before the main process forks
@@ -703,7 +717,15 @@ static int mod_init(void)
lcr_db_close();
/* rule shared memory */
-
+ if((lcr_gctx = pcre2_general_context_create(pcre2_malloc, pcre2_free, NULL))
+ == NULL) {
+ LM_ERR("pcre2 general context creation failed\n");
+ goto err;
+ }
+ if((lcr_ctx = pcre2_compile_context_create(lcr_gctx)) == NULL) {
+ LM_ERR("pcre2 compile context creation failed\n");
+ goto err;
+ }
/* rule hash table pointer table */
/* pointer at index 0 points to temp rule hash table */
rule_pt = (struct rule_info ***)shm_malloc(
@@ -779,6 +801,12 @@ dberror:
lcr_db_close();
err:
+ if(lcr_ctx) {
+ pcre2_compile_context_free(lcr_ctx);
+ }
+ if(lcr_gctx) {
+ pcre2_general_context_free(lcr_gctx);
+ }
free_shared_memory();
return -1;
}
@@ -794,7 +822,12 @@ static int child_init(int rank)
static void destroy(void)
{
lcr_db_close();
-
+ if(lcr_ctx) {
+ pcre2_compile_context_free(lcr_ctx);
+ }
+ if(lcr_gctx) {
+ pcre2_general_context_free(lcr_gctx);
+ }
free_shared_memory();
}
@@ -875,33 +908,32 @@ static int comp_matched(const void *m1,
/* Compile pattern into shared memory and return pointer to it. */
-static pcre *reg_ex_comp(const char *pattern)
+static pcre2_code *reg_ex_comp(const char *pattern)
{
- pcre *re, *result;
- const char *error;
- int rc, err_offset;
- size_t size;
-
- re = pcre_compile(pattern, 0, &error, &err_offset, NULL);
- if(re == NULL) {
- LM_ERR("pcre compilation of '%s' failed at offset %d: %s\n", pattern,
- err_offset, error);
- return (pcre *)0;
- }
- rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);
- if(rc != 0) {
- LM_ERR("pcre_fullinfo on compiled pattern '%s' yielded error: %d\n",
- pattern, rc);
- return (pcre *)0;
- }
- result = (pcre *)shm_malloc(size);
+ pcre2_code *result;
+ int pcre_error_num = 0;
+ char pcre_error[128];
+ size_t pcre_erroffset;
+
+ result = pcre2_compile((PCRE2_SPTR)pattern, PCRE2_ZERO_TERMINATED, 0,
+ &pcre_error_num, &pcre_erroffset, lcr_ctx);
if(result == NULL) {
- pcre_free(re);
- SHM_MEM_ERROR_FMT("for compiled PCRE pattern\n");
- return (pcre *)0;
+ switch(pcre2_get_error_message(
+ pcre_error_num, (PCRE2_UCHAR *)pcre_error, 128)) {
+ case PCRE2_ERROR_NOMEMORY:
+ snprintf(pcre_error, 128,
+ "unknown error[%d]: pcre2 error buffer too small",
+ pcre_error_num);
+ break;
+ case PCRE2_ERROR_BADDATA:
+ snprintf(pcre_error, 128, "unknown pcre2 error[%d]",
+ pcre_error_num);
+ break;
+ }
+ LM_ERR("pcre compilation of '%s' failed at offset %zu: %s\n", pattern,
+ pcre_erroffset, pcre_error);
+ return NULL;
}
- memcpy(result, re, size);
- pcre_free(re);
return result;
}
@@ -950,7 +982,7 @@ static struct gw_info *find_gateway_by_i
return NULL;
}
-/*
+/*
* Insert gw info into index i or gws table
*/
static int insert_gw(struct gw_info *gws, unsigned int i, unsigned int gw_id,
@@ -1024,7 +1056,7 @@ static int insert_gw(struct gw_info *gws
/*
- * Insert prefix_len into list pointed by last rule hash table entry
+ * Insert prefix_len into list pointed by last rule hash table entry
* if not there already. Keep list in decending prefix_len order.
*/
static int prefix_len_insert(
@@ -1414,7 +1446,7 @@ int reload_tables()
db_key_t gw_cols[13];
db_key_t rule_cols[7];
db_key_t target_cols[4];
- pcre *from_uri_re, *request_uri_re;
+ pcre2_code *from_uri_re, *request_uri_re;
struct gw_info *gws, *gw_pt_tmp;
struct rule_info **rules, **rule_pt_tmp;
@@ -2129,11 +2161,12 @@ void add_gws_into_avps(struct gw_info *g
int load_gws_dummy(int lcr_id, str *ruri_user, str *from_uri, str *request_uri,
unsigned int *gw_indexes)
{
- int i, j;
+ int i, j, rc;
unsigned int gw_index, now, dex;
struct rule_info **rules, *rule, *pl;
struct gw_info *gws;
struct target *t;
+ pcre2_match_data *pcre_md = NULL;
struct matched_gw_info matched_gws[MAX_NO_OF_GWS + 1];
struct sip_uri furi;
struct usr_avp *avp;
@@ -2178,12 +2211,18 @@ int load_gws_dummy(int lcr_id, str *ruri
|| strncmp(rule->prefix, ruri_user->s, pl->prefix_len))
goto next;
- if((rule->from_uri_len != 0)
- && (pcre_exec(rule->from_uri_re, NULL, from_uri->s,
- from_uri->len, 0, 0, NULL, 0)
- < 0))
- goto next;
-
+ if(rule->from_uri_len != 0) {
+ pcre_md = pcre2_match_data_create_from_pattern(
+ rule->from_uri_re, NULL);
+ rc = pcre2_match(rule->from_uri_re, (PCRE2_SPTR)from_uri->s,
+ (PCRE2_SIZE)from_uri->len, 0, 0, pcre_md, NULL);
+ if(pcre_md) {
+ pcre2_match_data_free(pcre_md);
+ pcre_md = NULL;
+ }
+ if(rc < 0)
+ goto next;
+ }
if((from_uri->len > 0) && (rule->mt_tvalue_len > 0)) {
if(mtree_api.mt_match(&msg, &mtree_param, &(furi.user), 2)
== -1) {
@@ -2216,9 +2255,16 @@ int load_gws_dummy(int lcr_id, str *ruri
"param has not been given.\n");
return -1;
}
- if(pcre_exec(rule->request_uri_re, NULL, request_uri->s,
- request_uri->len, 0, 0, NULL, 0)
- < 0)
+ pcre_md = pcre2_match_data_create_from_pattern(
+ rule->request_uri_re, NULL);
+ rc = pcre2_match(rule->request_uri_re,
+ (PCRE2_SPTR)request_uri->s,
+ (PCRE2_SIZE)request_uri->len, 0, 0, pcre_md, NULL);
+ if(pcre_md) {
+ pcre2_match_data_free(pcre_md);
+ pcre_md = NULL;
+ }
+ if(rc < 0)
goto next;
}
@@ -2282,9 +2328,10 @@ static int ki_load_gws_furi(
sip_msg_t *_m, int lcr_id, str *ruri_user, str *from_uri)
{
str *request_uri;
- int i, j;
+ int i, j, rc;
unsigned int gw_index, now, dex;
int_str val;
+ pcre2_match_data *pcre_md = NULL;
struct matched_gw_info matched_gws[MAX_NO_OF_GWS + 1];
struct rule_info **rules, *rule, *pl;
struct gw_info *gws;
@@ -2343,14 +2390,22 @@ static int ki_load_gws_furi(
goto next;
/* Match from uri */
- if((rule->from_uri_len != 0)
- && (pcre_exec(rule->from_uri_re, NULL, from_uri->s,
- from_uri->len, 0, 0, NULL, 0)
- < 0)) {
- LM_DBG("from uri <%.*s> did not match to from regex <%.*s>\n",
- from_uri->len, from_uri->s, rule->from_uri_len,
- rule->from_uri);
- goto next;
+ if(rule->from_uri_len != 0) {
+ pcre_md = pcre2_match_data_create_from_pattern(
+ rule->from_uri_re, NULL);
+ rc = pcre2_match(rule->from_uri_re, (PCRE2_SPTR)from_uri->s,
+ (PCRE2_SIZE)from_uri->len, 0, 0, pcre_md, NULL);
+ if(pcre_md) {
+ pcre2_match_data_free(pcre_md);
+ pcre_md = NULL;
+ }
+ if(rc < 0) {
+ LM_DBG("from uri <%.*s> did not match to from regex "
+ "<%.*s>\n",
+ from_uri->len, from_uri->s, rule->from_uri_len,
+ rule->from_uri);
+ goto next;
+ }
}
/* Match from uri user */
@@ -2379,15 +2434,23 @@ static int ki_load_gws_furi(
}
/* Match request uri */
- if((rule->request_uri_len != 0)
- && (pcre_exec(rule->request_uri_re, NULL, request_uri->s,
- request_uri->len, 0, 0, NULL, 0)
- < 0)) {
- LM_DBG("request uri <%.*s> did not match to request regex "
- "<%.*s>\n",
- request_uri->len, request_uri->s, rule->request_uri_len,
- rule->request_uri);
- goto next;
+ if(rule->request_uri_len != 0) {
+ pcre_md = pcre2_match_data_create_from_pattern(
+ rule->request_uri_re, NULL);
+ rc = pcre2_match(rule->request_uri_re,
+ (PCRE2_SPTR)request_uri->s,
+ (PCRE2_SIZE)request_uri->len, 0, 0, pcre_md, NULL);
+ if(pcre_md) {
+ pcre2_match_data_free(pcre_md);
+ pcre_md = NULL;
+ }
+ if(rc < 0) {
+ LM_DBG("request uri <%.*s> did not match to request regex "
+ "<%.*s>\n",
+ request_uri->len, request_uri->s,
+ rule->request_uri_len, rule->request_uri);
+ goto next;
+ }
}
/* Load gws associated with this rule */
@@ -3015,7 +3078,7 @@ static int ki_next_gw(sip_msg_t *_m)
}
/**
- *
+ *
*/
static int next_gw(struct sip_msg *_m, char *_s1, char *_s2)
{
--- a/src/modules/lcr/lcr_mod.h
+++ b/src/modules/lcr/lcr_mod.h
@@ -2,6 +2,7 @@
* Various lcr related constant, types, and external variables
*
* Copyright (C) 2005-2014 Juha Heinanen
+ * Copyright (C) 2023 Victor Seva
*
* This file is part of Kamailio, a free SIP server.
*
@@ -33,7 +34,8 @@
#define LCR_MOD_H
#include <stdio.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "../../core/locking.h"
#include "../../core/parser/parse_uri.h"
#include "../../core/ip_addr.h"
@@ -60,10 +62,10 @@ struct rule_info
unsigned short from_uri_len;
char mt_tvalue[MAX_MT_TVALUE_LEN + 1];
unsigned short mt_tvalue_len;
- pcre *from_uri_re;
+ pcre2_code *from_uri_re;
char request_uri[MAX_URI_LEN + 1];
unsigned short request_uri_len;
- pcre *request_uri_re;
+ pcre2_code *request_uri_re;
unsigned short stopper;
unsigned int enabled;
struct target *targets;

View file

@ -0,0 +1,715 @@
From fb7c59cafceb35628d40c727dbfa2990335b922a Mon Sep 17 00:00:00 2001
From: Victor Seva <linuxmaniac@torreviejawireless.org>
Date: Wed, 17 May 2023 16:37:10 +0200
Subject: [PATCH] regex: clang-format for coherent indentation and coding style
---
src/modules/regex/regex_mod.c | 313 ++++++++++++++++------------------
1 file changed, 150 insertions(+), 163 deletions(-)
--- a/src/modules/regex/regex_mod.c
+++ b/src/modules/regex/regex_mod.c
@@ -49,9 +49,9 @@ MODULE_VERSION
#define START 0
#define RELOAD 1
-#define FILE_MAX_LINE 500 /*!< Max line size in the file */
-#define MAX_GROUPS 20 /*!< Max number of groups */
-#define GROUP_MAX_SIZE 8192 /*!< Max size of a group */
+#define FILE_MAX_LINE 500 /*!< Max line size in the file */
+#define MAX_GROUPS 20 /*!< Max number of groups */
+#define GROUP_MAX_SIZE 8192 /*!< Max size of a group */
static int regex_init_rpc(void);
@@ -66,12 +66,12 @@ gen_lock_t *reload_lock;
* Module exported parameter variables
*/
static char *file;
-static int max_groups = MAX_GROUPS;
-static int group_max_size = GROUP_MAX_SIZE;
-static int pcre_caseless = 0;
-static int pcre_multiline = 0;
-static int pcre_dotall = 0;
-static int pcre_extended = 0;
+static int max_groups = MAX_GROUPS;
+static int group_max_size = GROUP_MAX_SIZE;
+static int pcre_caseless = 0;
+static int pcre_multiline = 0;
+static int pcre_dotall = 0;
+static int pcre_extended = 0;
/*
@@ -100,119 +100,117 @@ static void free_shared_memory(void);
/*
* Script functions
*/
-static int w_pcre_match(struct sip_msg* _msg, char* _s1, char* _s2);
-static int w_pcre_match_group(struct sip_msg* _msg, char* _s1, char* _s2);
+static int w_pcre_match(struct sip_msg *_msg, char *_s1, char *_s2);
+static int w_pcre_match_group(struct sip_msg *_msg, char *_s1, char *_s2);
/*
* Exported functions
*/
-static cmd_export_t cmds[] =
-{
- { "pcre_match", (cmd_function)w_pcre_match, 2, fixup_spve_spve, 0,
- REQUEST_ROUTE|FAILURE_ROUTE|ONREPLY_ROUTE|BRANCH_ROUTE|LOCAL_ROUTE },
- { "pcre_match_group", (cmd_function)w_pcre_match_group, 2, fixup_spve_spve, 0,
- REQUEST_ROUTE|FAILURE_ROUTE|ONREPLY_ROUTE|BRANCH_ROUTE|LOCAL_ROUTE },
- { "pcre_match_group", (cmd_function)w_pcre_match_group, 1, fixup_spve_null, 0,
- REQUEST_ROUTE|FAILURE_ROUTE|ONREPLY_ROUTE|BRANCH_ROUTE|LOCAL_ROUTE },
- { 0, 0, 0, 0, 0, 0 }
-};
+static cmd_export_t cmds[] = {
+ {"pcre_match", (cmd_function)w_pcre_match, 2, fixup_spve_spve, 0,
+ REQUEST_ROUTE | FAILURE_ROUTE | ONREPLY_ROUTE | BRANCH_ROUTE
+ | LOCAL_ROUTE},
+ {"pcre_match_group", (cmd_function)w_pcre_match_group, 2,
+ fixup_spve_spve, 0,
+ REQUEST_ROUTE | FAILURE_ROUTE | ONREPLY_ROUTE | BRANCH_ROUTE
+ | LOCAL_ROUTE},
+ {"pcre_match_group", (cmd_function)w_pcre_match_group, 1,
+ fixup_spve_null, 0,
+ REQUEST_ROUTE | FAILURE_ROUTE | ONREPLY_ROUTE | BRANCH_ROUTE
+ | LOCAL_ROUTE},
+ {0, 0, 0, 0, 0, 0}};
/*
* Exported parameters
*/
-static param_export_t params[] = {
- {"file", PARAM_STRING, &file },
- {"max_groups", INT_PARAM, &max_groups },
- {"group_max_size", INT_PARAM, &group_max_size },
- {"pcre_caseless", INT_PARAM, &pcre_caseless },
- {"pcre_multiline", INT_PARAM, &pcre_multiline },
- {"pcre_dotall", INT_PARAM, &pcre_dotall },
- {"pcre_extended", INT_PARAM, &pcre_extended },
- {0, 0, 0}
-};
+static param_export_t params[] = {{"file", PARAM_STRING, &file},
+ {"max_groups", INT_PARAM, &max_groups},
+ {"group_max_size", INT_PARAM, &group_max_size},
+ {"pcre_caseless", INT_PARAM, &pcre_caseless},
+ {"pcre_multiline", INT_PARAM, &pcre_multiline},
+ {"pcre_dotall", INT_PARAM, &pcre_dotall},
+ {"pcre_extended", INT_PARAM, &pcre_extended}, {0, 0, 0}};
/*
* Module interface
*/
struct module_exports exports = {
- "regex", /*!< module name */
- DEFAULT_DLFLAGS, /*!< dlopen flags */
- cmds, /*!< exported functions */
- params, /*!< exported parameters */
- 0, /*!< exported RPC functions */
- 0, /*!< exported pseudo-variables */
- 0, /*!< response handling function */
- mod_init, /*!< module initialization function */
- 0, /*!< per-child init function */
- destroy /*!< destroy function */
+ "regex", /*!< module name */
+ DEFAULT_DLFLAGS, /*!< dlopen flags */
+ cmds, /*!< exported functions */
+ params, /*!< exported parameters */
+ 0, /*!< exported RPC functions */
+ 0, /*!< exported pseudo-variables */
+ 0, /*!< response handling function */
+ mod_init, /*!< module initialization function */
+ 0, /*!< per-child init function */
+ destroy /*!< destroy function */
};
-
/*! \brief
* Init module function
*/
static int mod_init(void)
{
- if(regex_init_rpc()<0)
- {
+ if(regex_init_rpc() < 0) {
LM_ERR("failed to register RPC commands\n");
return -1;
}
/* Group matching feature */
- if (file == NULL) {
+ if(file == NULL) {
LM_NOTICE("'file' parameter is not set, group matching disabled\n");
} else {
/* Create and init the lock */
reload_lock = lock_alloc();
- if (reload_lock == NULL) {
+ if(reload_lock == NULL) {
LM_ERR("cannot allocate reload_lock\n");
goto err;
}
- if (lock_init(reload_lock) == NULL) {
+ if(lock_init(reload_lock) == NULL) {
LM_ERR("cannot init the reload_lock\n");
lock_dealloc(reload_lock);
goto err;
}
/* PCRE options */
- if (pcre_caseless != 0) {
+ if(pcre_caseless != 0) {
LM_DBG("PCRE CASELESS enabled\n");
pcre_options = pcre_options | PCRE_CASELESS;
}
- if (pcre_multiline != 0) {
+ if(pcre_multiline != 0) {
LM_DBG("PCRE MULTILINE enabled\n");
pcre_options = pcre_options | PCRE_MULTILINE;
}
- if (pcre_dotall != 0) {
+ if(pcre_dotall != 0) {
LM_DBG("PCRE DOTALL enabled\n");
pcre_options = pcre_options | PCRE_DOTALL;
}
- if (pcre_extended != 0) {
+ if(pcre_extended != 0) {
LM_DBG("PCRE EXTENDED enabled\n");
pcre_options = pcre_options | PCRE_EXTENDED;
}
LM_DBG("PCRE options: %i\n", pcre_options);
/* Pointer to pcres */
- if ((pcres_addr = shm_malloc(sizeof(pcre **))) == 0) {
+ if((pcres_addr = shm_malloc(sizeof(pcre **))) == 0) {
LM_ERR("no memory for pcres_addr\n");
goto err;
}
/* Integer containing the number of pcres */
- if ((num_pcres = shm_malloc(sizeof(int))) == 0) {
+ if((num_pcres = shm_malloc(sizeof(int))) == 0) {
LM_ERR("no memory for num_pcres\n");
goto err;
}
/* Load the pcres */
LM_DBG("loading pcres...\n");
- if (load_pcres(START)) {
+ if(load_pcres(START)) {
LM_ERR("failed to load pcres\n");
goto err;
}
@@ -251,21 +249,21 @@ static int load_pcres(int action)
/* Get the lock */
lock_get(reload_lock);
- if (!(f = fopen(file, "r"))) {
+ if(!(f = fopen(file, "r"))) {
LM_ERR("could not open file '%s'\n", file);
goto err;
}
/* Array containing each pattern in the file */
- if ((patterns = pkg_malloc(sizeof(char*) * max_groups)) == 0) {
+ if((patterns = pkg_malloc(sizeof(char *) * max_groups)) == 0) {
LM_ERR("no more memory for patterns\n");
fclose(f);
goto err;
}
- memset(patterns, 0, sizeof(char*) * max_groups);
+ memset(patterns, 0, sizeof(char *) * max_groups);
- for (i=0; i<max_groups; i++) {
- if ((patterns[i] = pkg_malloc(sizeof(char) * group_max_size)) == 0) {
+ for(i = 0; i < max_groups; i++) {
+ if((patterns[i] = pkg_malloc(sizeof(char) * group_max_size)) == 0) {
LM_ERR("no more memory for patterns[%d]\n", i);
fclose(f);
goto err;
@@ -276,26 +274,27 @@ static int load_pcres(int action)
/* Read the file and extract the patterns */
memset(line, 0, FILE_MAX_LINE);
i = -1;
- while (fgets(line, FILE_MAX_LINE-4, f) != NULL) {
+ while(fgets(line, FILE_MAX_LINE - 4, f) != NULL) {
/* Ignore comments and lines starting by space, tab, CR, LF */
- if(isspace(line[0]) || line[0]=='#') {
+ if(isspace(line[0]) || line[0] == '#') {
memset(line, 0, FILE_MAX_LINE);
continue;
}
/* First group */
- if (i == -1 && line[0] != '[') {
- LM_ERR("first group must be initialized with [0] before any regular expression\n");
+ if(i == -1 && line[0] != '[') {
+ LM_ERR("first group must be initialized with [0] before any "
+ "regular expression\n");
fclose(f);
goto err;
}
/* New group */
- if (line[0] == '[') {
+ if(line[0] == '[') {
i++;
/* Check if there are more patterns than the max value */
- if (i >= max_groups) {
+ if(i >= max_groups) {
LM_ERR("max patterns exceeded\n");
fclose(f);
goto err;
@@ -309,14 +308,14 @@ static int load_pcres(int action)
llen = strlen(line);
/* Check if the patter size is too big (aprox) */
- if (strlen(patterns[i]) + llen >= group_max_size - 4) {
+ if(strlen(patterns[i]) + llen >= group_max_size - 4) {
LM_ERR("pattern max file exceeded\n");
fclose(f);
goto err;
}
/* Append ')' at the end of the line */
- if (line[llen - 1] == '\n') {
+ if(line[llen - 1] == '\n') {
line[llen - 1] = ')';
line[llen] = '\n';
line[llen + 1] = '\0';
@@ -328,7 +327,7 @@ static int load_pcres(int action)
/* Append '(' at the beginning of the line */
llen = strlen(patterns[i]);
- memcpy(patterns[i]+llen, "(", 1);
+ memcpy(patterns[i] + llen, "(", 1);
llen++;
/* Append the line to the current pattern (including the ending 0) */
@@ -340,16 +339,16 @@ static int load_pcres(int action)
fclose(f);
- if(num_pcres_tmp==0) {
+ if(num_pcres_tmp == 0) {
LM_ERR("no expressions in the file\n");
goto err;
}
/* Fix the patterns */
- for (i=0; i < num_pcres_tmp; i++) {
+ for(i = 0; i < num_pcres_tmp; i++) {
/* Convert empty groups in unmatcheable regular expression ^$ */
- if (strlen(patterns[i]) == 1) {
+ if(strlen(patterns[i]) == 1) {
patterns[i][0] = '^';
patterns[i][1] = '$';
patterns[i][2] = '\0';
@@ -357,13 +356,13 @@ static int load_pcres(int action)
}
/* Delete possible '\n' at the end of the pattern */
- if (patterns[i][strlen(patterns[i])-1] == '\n') {
- patterns[i][strlen(patterns[i])-1] = '\0';
+ if(patterns[i][strlen(patterns[i]) - 1] == '\n') {
+ patterns[i][strlen(patterns[i]) - 1] = '\0';
}
/* Replace '\n' with '|' (except at the end of the pattern) */
- for (j=0; j < strlen(patterns[i]); j++) {
- if (patterns[i][j] == '\n' && j != strlen(patterns[i])-1) {
+ for(j = 0; j < strlen(patterns[i]); j++) {
+ if(patterns[i][j] == '\n' && j != strlen(patterns[i]) - 1) {
patterns[i][j] = '|';
}
}
@@ -374,38 +373,38 @@ static int load_pcres(int action)
/* Log the group patterns */
LM_INFO("num groups = %d\n", num_pcres_tmp);
- for (i=0; i < num_pcres_tmp; i++) {
- LM_INFO("<group[%d]>%s</group[%d]> (size = %i)\n", i, patterns[i],
- i, (int)strlen(patterns[i]));
+ for(i = 0; i < num_pcres_tmp; i++) {
+ LM_INFO("<group[%d]>%s</group[%d]> (size = %i)\n", i, patterns[i], i,
+ (int)strlen(patterns[i]));
}
/* Temporal pointer of pcres */
- if ((pcres_tmp = pkg_malloc(sizeof(pcre *) * num_pcres_tmp)) == 0) {
+ if((pcres_tmp = pkg_malloc(sizeof(pcre *) * num_pcres_tmp)) == 0) {
LM_ERR("no more memory for pcres_tmp\n");
goto err;
}
- for (i=0; i<num_pcres_tmp; i++) {
+ for(i = 0; i < num_pcres_tmp; i++) {
pcres_tmp[i] = NULL;
}
/* Compile the patters */
- for (i=0; i<num_pcres_tmp; i++) {
+ for(i = 0; i < num_pcres_tmp; i++) {
- pcre_tmp = pcre_compile(patterns[i], pcre_options, &pcre_error,
- &pcre_erroffset, NULL);
- if (pcre_tmp == NULL) {
+ pcre_tmp = pcre_compile(
+ patterns[i], pcre_options, &pcre_error, &pcre_erroffset, NULL);
+ if(pcre_tmp == NULL) {
LM_ERR("pcre_tmp compilation of '%s' failed at offset %d: %s\n",
patterns[i], pcre_erroffset, pcre_error);
goto err;
}
pcre_rc = pcre_fullinfo(pcre_tmp, NULL, PCRE_INFO_SIZE, &pcre_size);
- if (pcre_rc) {
+ if(pcre_rc) {
printf("pcre_fullinfo on compiled pattern[%i] yielded error: %d\n",
i, pcre_rc);
goto err;
}
- if ((pcres_tmp[i] = pkg_malloc(pcre_size)) == 0) {
+ if((pcres_tmp[i] = pkg_malloc(pcre_size)) == 0) {
LM_ERR("no more memory for pcres_tmp[%i]\n", i);
goto err;
}
@@ -417,22 +416,22 @@ static int load_pcres(int action)
}
/* Copy to shared memory */
- if (action == RELOAD) {
- for(i=0; i<*num_pcres; i++) { /* Use the previous num_pcres value */
- if (pcres[i]) {
+ if(action == RELOAD) {
+ for(i = 0; i < *num_pcres; i++) { /* Use the previous num_pcres value */
+ if(pcres[i]) {
shm_free(pcres[i]);
}
}
shm_free(pcres);
}
- if ((pcres = shm_malloc(sizeof(pcre *) * num_pcres_tmp)) == 0) {
+ if((pcres = shm_malloc(sizeof(pcre *) * num_pcres_tmp)) == 0) {
LM_ERR("no more memory for pcres\n");
goto err;
}
memset(pcres, 0, sizeof(pcre *) * num_pcres_tmp);
- for (i=0; i<num_pcres_tmp; i++) {
+ for(i = 0; i < num_pcres_tmp; i++) {
pcre_rc = pcre_fullinfo(pcres_tmp[i], NULL, PCRE_INFO_SIZE, &pcre_size);
- if ((pcres[i] = shm_malloc(pcre_size)) == 0) {
+ if((pcres[i] = shm_malloc(pcre_size)) == 0) {
LM_ERR("no more memory for pcres[%i]\n", i);
goto err;
}
@@ -442,12 +441,12 @@ static int load_pcres(int action)
*pcres_addr = pcres;
/* Free used memory */
- for (i=0; i<num_pcres_tmp; i++) {
+ for(i = 0; i < num_pcres_tmp; i++) {
pkg_free(pcres_tmp[i]);
}
pkg_free(pcres_tmp);
/* Free allocated slots for unused patterns */
- for (i = num_pcres_tmp; i < max_groups; i++) {
+ for(i = num_pcres_tmp; i < max_groups; i++) {
pkg_free(patterns[i]);
}
pkg_free(patterns);
@@ -456,26 +455,26 @@ static int load_pcres(int action)
return 0;
err:
- if (patterns) {
- for(i=0; i<max_groups; i++) {
- if (patterns[i]) {
+ if(patterns) {
+ for(i = 0; i < max_groups; i++) {
+ if(patterns[i]) {
pkg_free(patterns[i]);
}
}
pkg_free(patterns);
}
- if (pcres_tmp) {
- for (i=0; i<num_pcres_tmp; i++) {
- if (pcres_tmp[i]) {
+ if(pcres_tmp) {
+ for(i = 0; i < num_pcres_tmp; i++) {
+ if(pcres_tmp[i]) {
pkg_free(pcres_tmp[i]);
}
}
pkg_free(pcres_tmp);
}
- if (reload_lock) {
+ if(reload_lock) {
lock_release(reload_lock);
}
- if (action == START) {
+ if(action == START) {
free_shared_memory();
}
return -1;
@@ -486,9 +485,9 @@ static void free_shared_memory(void)
{
int i;
- if (pcres) {
- for(i=0; i<*num_pcres; i++) {
- if (pcres[i]) {
+ if(pcres) {
+ for(i = 0; i < *num_pcres; i++) {
+ if(pcres[i]) {
shm_free(pcres[i]);
}
}
@@ -496,21 +495,21 @@ static void free_shared_memory(void)
pcres = NULL;
}
- if (num_pcres) {
+ if(num_pcres) {
shm_free(num_pcres);
num_pcres = NULL;
}
- if (pcres_addr) {
+ if(pcres_addr) {
shm_free(pcres_addr);
pcres_addr = NULL;
}
- if (reload_lock) {
+ if(reload_lock) {
lock_destroy(reload_lock);
lock_dealloc(reload_lock);
reload_lock = NULL;
- }
+ }
}
@@ -519,32 +518,32 @@ static void free_shared_memory(void)
*/
/*! \brief Return true if the argument matches the regular expression parameter */
-static int ki_pcre_match(sip_msg_t* msg, str* string, str* regex)
+static int ki_pcre_match(sip_msg_t *msg, str *string, str *regex)
{
pcre *pcre_re = NULL;
int pcre_rc;
const char *pcre_error;
int pcre_erroffset;
- pcre_re = pcre_compile(regex->s, pcre_options, &pcre_error, &pcre_erroffset, NULL);
- if (pcre_re == NULL) {
+ pcre_re = pcre_compile(
+ regex->s, pcre_options, &pcre_error, &pcre_erroffset, NULL);
+ if(pcre_re == NULL) {
LM_ERR("pcre_re compilation of '%s' failed at offset %d: %s\n",
regex->s, pcre_erroffset, pcre_error);
return -4;
}
- pcre_rc = pcre_exec(
- pcre_re, /* the compiled pattern */
- NULL, /* no extra data - we didn't study the pattern */
- string->s, /* the matching string */
- (int)(string->len), /* the length of the subject */
- 0, /* start at offset 0 in the string */
- 0, /* default options */
- NULL, /* output vector for substring information */
- 0); /* number of elements in the output vector */
+ pcre_rc = pcre_exec(pcre_re, /* the compiled pattern */
+ NULL, /* no extra data - we didn't study the pattern */
+ string->s, /* the matching string */
+ (int)(string->len), /* the length of the subject */
+ 0, /* start at offset 0 in the string */
+ 0, /* default options */
+ NULL, /* output vector for substring information */
+ 0); /* number of elements in the output vector */
/* Matching failed: handle error cases */
- if (pcre_rc < 0) {
+ if(pcre_rc < 0) {
switch(pcre_rc) {
case PCRE_ERROR_NOMATCH:
LM_DBG("'%s' doesn't match '%s'\n", string->s, regex->s);
@@ -562,28 +561,26 @@ static int ki_pcre_match(sip_msg_t* msg,
}
/*! \brief Return true if the argument matches the regular expression parameter */
-static int w_pcre_match(struct sip_msg* _msg, char* _s1, char* _s2)
+static int w_pcre_match(struct sip_msg *_msg, char *_s1, char *_s2)
{
str string;
str regex;
- if (_s1 == NULL) {
+ if(_s1 == NULL) {
LM_ERR("bad parameters\n");
return -2;
}
- if (_s2 == NULL) {
+ if(_s2 == NULL) {
LM_ERR("bad parameters\n");
return -2;
}
- if (fixup_get_svalue(_msg, (gparam_p)_s1, &string))
- {
+ if(fixup_get_svalue(_msg, (gparam_p)_s1, &string)) {
LM_ERR("cannot print the format for string\n");
return -3;
}
- if (fixup_get_svalue(_msg, (gparam_p)_s2, &regex))
- {
+ if(fixup_get_svalue(_msg, (gparam_p)_s2, &regex)) {
LM_ERR("cannot print the format for regex\n");
return -3;
}
@@ -592,17 +589,17 @@ static int w_pcre_match(struct sip_msg*
}
/*! \brief Return true if the string argument matches the pattern group parameter */
-static int ki_pcre_match_group(sip_msg_t* _msg, str* string, int num_pcre)
+static int ki_pcre_match_group(sip_msg_t *_msg, str *string, int num_pcre)
{
int pcre_rc;
/* Check if group matching feature is enabled */
- if (file == NULL) {
+ if(file == NULL) {
LM_ERR("group matching is disabled\n");
return -2;
}
- if (num_pcre >= *num_pcres) {
+ if(num_pcre >= *num_pcres) {
LM_ERR("invalid pcre index '%i', there are %i pcres\n", num_pcre,
*num_pcres);
return -4;
@@ -610,20 +607,19 @@ static int ki_pcre_match_group(sip_msg_t
lock_get(reload_lock);
- pcre_rc = pcre_exec(
- (*pcres_addr)[num_pcre], /* the compiled pattern */
- NULL, /* no extra data - we didn't study the pattern */
- string->s, /* the matching string */
- (int)(string->len), /* the length of the subject */
- 0, /* start at offset 0 in the string */
- 0, /* default options */
- NULL, /* output vector for substring information */
- 0); /* number of elements in the output vector */
+ pcre_rc = pcre_exec((*pcres_addr)[num_pcre], /* the compiled pattern */
+ NULL, /* no extra data - we didn't study the pattern */
+ string->s, /* the matching string */
+ (int)(string->len), /* the length of the subject */
+ 0, /* start at offset 0 in the string */
+ 0, /* default options */
+ NULL, /* output vector for substring information */
+ 0); /* number of elements in the output vector */
lock_release(reload_lock);
/* Matching failed: handle error cases */
- if (pcre_rc < 0) {
+ if(pcre_rc < 0) {
switch(pcre_rc) {
case PCRE_ERROR_NOMATCH:
LM_DBG("'%s' doesn't match pcres[%i]\n", string->s, num_pcre);
@@ -640,29 +636,27 @@ static int ki_pcre_match_group(sip_msg_t
}
/*! \brief Return true if the string argument matches the pattern group parameter */
-static int w_pcre_match_group(struct sip_msg* _msg, char* _s1, char* _s2)
+static int w_pcre_match_group(struct sip_msg *_msg, char *_s1, char *_s2)
{
str string, group;
unsigned int num_pcre = 0;
- if (_s1 == NULL) {
+ if(_s1 == NULL) {
LM_ERR("bad parameters\n");
return -3;
}
- if (_s2 == NULL) {
+ if(_s2 == NULL) {
num_pcre = 0;
} else {
- if (fixup_get_svalue(_msg, (gparam_p)_s2, &group))
- {
+ if(fixup_get_svalue(_msg, (gparam_p)_s2, &group)) {
LM_ERR("cannot print the format for second param\n");
return -5;
}
str2int(&group, &num_pcre);
}
- if (fixup_get_svalue(_msg, (gparam_p)_s1, &string))
- {
+ if(fixup_get_svalue(_msg, (gparam_p)_s1, &string)) {
LM_ERR("cannot print the format for first param\n");
return -5;
}
@@ -676,42 +670,35 @@ static int w_pcre_match_group(struct sip
*/
/*! \brief Reload pcres by reading the file again */
-void regex_rpc_reload(rpc_t* rpc, void* ctx)
+void regex_rpc_reload(rpc_t *rpc, void *ctx)
{
/* Check if group matching feature is enabled */
- if (file == NULL) {
+ if(file == NULL) {
LM_NOTICE("'file' parameter is not set, group matching disabled\n");
rpc->fault(ctx, 500, "Group matching not enabled");
return;
}
LM_INFO("reloading pcres...\n");
- if (load_pcres(RELOAD)) {
+ if(load_pcres(RELOAD)) {
LM_ERR("failed to reload pcres\n");
rpc->fault(ctx, 500, "Failed to reload");
return;
}
LM_INFO("reload success\n");
-
}
-static const char* regex_rpc_reload_doc[2] = {
- "Reload regex file",
- 0
-};
+static const char *regex_rpc_reload_doc[2] = {"Reload regex file", 0};
rpc_export_t regex_rpc_cmds[] = {
- {"regex.reload", regex_rpc_reload,
- regex_rpc_reload_doc, 0},
- {0, 0, 0, 0}
-};
+ {"regex.reload", regex_rpc_reload, regex_rpc_reload_doc, 0},
+ {0, 0, 0, 0}};
/**
* register RPC commands
*/
static int regex_init_rpc(void)
{
- if (rpc_register_array(regex_rpc_cmds)!=0)
- {
+ if(rpc_register_array(regex_rpc_cmds) != 0) {
LM_ERR("failed to register RPC commands\n");
return -1;
}

View file

@ -0,0 +1,39 @@
From 650b109dbcfe2c3083e09c987bae7ca39e4a19d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=94=D0=B8=D0=BB=D1=8F=D0=BD=20=D0=9F=D0=B0=D0=BB=D0=B0?=
=?UTF-8?q?=D1=83=D0=B7=D0=BE=D0=B2?= <git-dpa@aegee.org>
Date: Wed, 21 Jun 2023 21:34:21 +0200
Subject: [PATCH] regex: typos
---
src/modules/regex/regex_mod.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
--- a/src/modules/regex/regex_mod.c
+++ b/src/modules/regex/regex_mod.c
@@ -230,7 +230,7 @@ static void destroy(void)
}
-/*! \brief Convert the file content into regular expresions and store them in pcres */
+/*! \brief Convert the file content into regular expressions and store them in pcres */
static int load_pcres(int action)
{
int i, j;
@@ -307,7 +307,7 @@ static int load_pcres(int action)
}
llen = strlen(line);
- /* Check if the patter size is too big (aprox) */
+ /* Check if the pattern size is too big (approx) */
if(strlen(patterns[i]) + llen >= group_max_size - 4) {
LM_ERR("pattern max file exceeded\n");
fclose(f);
@@ -387,7 +387,7 @@ static int load_pcres(int action)
pcres_tmp[i] = NULL;
}
- /* Compile the patters */
+ /* Compile the patterns */
for(i = 0; i < num_pcres_tmp; i++) {
pcre_tmp = pcre_compile(

View file

@ -0,0 +1,44 @@
From 5c7de00bc0826cf739577010ba7b4882e83819cc Mon Sep 17 00:00:00 2001
From: Victor Seva <linuxmaniac@torreviejawireless.org>
Date: Wed, 9 Aug 2023 10:52:47 +0000
Subject: [PATCH] regex: convert to memory error logging helper
---
src/modules/regex/regex_mod.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
--- a/src/modules/regex/regex_mod.c
+++ b/src/modules/regex/regex_mod.c
@@ -198,13 +198,13 @@ static int mod_init(void)
/* Pointer to pcres */
if((pcres_addr = shm_malloc(sizeof(pcre **))) == 0) {
- LM_ERR("no memory for pcres_addr\n");
+ SHM_MEM_ERROR;
goto err;
}
/* Integer containing the number of pcres */
if((num_pcres = shm_malloc(sizeof(int))) == 0) {
- LM_ERR("no memory for num_pcres\n");
+ SHM_MEM_ERROR;
goto err;
}
@@ -425,14 +425,14 @@ static int load_pcres(int action)
shm_free(pcres);
}
if((pcres = shm_malloc(sizeof(pcre *) * num_pcres_tmp)) == 0) {
- LM_ERR("no more memory for pcres\n");
+ SHM_MEM_ERROR;
goto err;
}
memset(pcres, 0, sizeof(pcre *) * num_pcres_tmp);
for(i = 0; i < num_pcres_tmp; i++) {
pcre_rc = pcre_fullinfo(pcres_tmp[i], NULL, PCRE_INFO_SIZE, &pcre_size);
if((pcres[i] = shm_malloc(pcre_size)) == 0) {
- LM_ERR("no more memory for pcres[%i]\n", i);
+ SHM_MEM_ERROR;
goto err;
}
memcpy(pcres[i], pcres_tmp[i], pcre_size);

View file

@ -0,0 +1,433 @@
From 325c7a34fca74770a4351e00e27fcae75d57852e Mon Sep 17 00:00:00 2001
From: Victor Seva <linuxmaniac@torreviejawireless.org>
Date: Wed, 9 Aug 2023 10:48:41 +0000
Subject: [PATCH] regex: migration to pcre2
---
src/modules/regex/Makefile | 11 +-
src/modules/regex/regex_mod.c | 240 ++++++++++++++++++++++------------
2 files changed, 158 insertions(+), 93 deletions(-)
--- a/src/modules/regex/Makefile
+++ b/src/modules/regex/Makefile
@@ -5,20 +5,15 @@ auto_gen=
NAME=regex.so
ifeq ($(CROSS_COMPILE),)
-PCRE_BUILDER = $(shell \
- if pkg-config --exists libcre; then \
- echo 'pkg-config libpcre'; \
- else \
- which pcre-config; \
- fi)
+PCRE_BUILDER = $(shell command -v pcre2-config)
endif
ifeq ($(PCRE_BUILDER),)
PCREDEFS=-I$(LOCALBASE)/include
- PCRELIBS=-L$(LOCALBASE)/lib -lpcre
+ PCRELIBS=-L$(LOCALBASE)/lib -lpcre2-8
else
PCREDEFS = $(shell $(PCRE_BUILDER) --cflags)
- PCRELIBS = $(shell $(PCRE_BUILDER) --libs)
+ PCRELIBS = $(shell $(PCRE_BUILDER) --libs8)
endif
DEFS+=$(PCREDEFS)
--- a/src/modules/regex/regex_mod.c
+++ b/src/modules/regex/regex_mod.c
@@ -2,6 +2,7 @@
* regex module - pcre operations
*
* Copyright (C) 2008 Iñaki Baz Castillo
+ * Copyright (C) 2023 Victor Seva
*
* This file is part of Kamailio, a free SIP server.
*
@@ -25,6 +26,7 @@
* \file
* \brief REGEX :: Perl-compatible regular expressions using PCRE library
* Copyright (C) 2008 Iñaki Baz Castillo
+ * Copyright (C) 2023 Victor Seva
* \ingroup regex
*/
@@ -32,7 +34,8 @@
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#include "../../core/sr_module.h"
#include "../../core/dprint.h"
#include "../../core/pt.h"
@@ -77,8 +80,11 @@ static int pcre_extended = 0;
/*
* Module internal parameter variables
*/
-static pcre **pcres;
-static pcre ***pcres_addr;
+static pcre2_general_context *pcres_gctx = NULL;
+static pcre2_match_context *pcres_mctx = NULL;
+static pcre2_compile_context *pcres_ctx = NULL;
+static pcre2_code **pcres;
+static pcre2_code ***pcres_addr;
static int *num_pcres;
static int pcre_options = 0x00000000;
@@ -151,6 +157,17 @@ struct module_exports exports = {
};
+static void *pcre2_malloc(size_t size, void *ext)
+{
+ return shm_malloc(size);
+}
+
+static void pcre2_free(void *ptr, void *ext)
+{
+ shm_free(ptr);
+ ptr = NULL;
+}
+
/*! \brief
* Init module function
*/
@@ -180,24 +197,39 @@ static int mod_init(void)
/* PCRE options */
if(pcre_caseless != 0) {
LM_DBG("PCRE CASELESS enabled\n");
- pcre_options = pcre_options | PCRE_CASELESS;
+ pcre_options = pcre_options | PCRE2_CASELESS;
}
if(pcre_multiline != 0) {
LM_DBG("PCRE MULTILINE enabled\n");
- pcre_options = pcre_options | PCRE_MULTILINE;
+ pcre_options = pcre_options | PCRE2_MULTILINE;
}
if(pcre_dotall != 0) {
LM_DBG("PCRE DOTALL enabled\n");
- pcre_options = pcre_options | PCRE_DOTALL;
+ pcre_options = pcre_options | PCRE2_DOTALL;
}
if(pcre_extended != 0) {
LM_DBG("PCRE EXTENDED enabled\n");
- pcre_options = pcre_options | PCRE_EXTENDED;
+ pcre_options = pcre_options | PCRE2_EXTENDED;
}
LM_DBG("PCRE options: %i\n", pcre_options);
+ if((pcres_gctx = pcre2_general_context_create(
+ pcre2_malloc, pcre2_free, NULL))
+ == NULL) {
+ LM_ERR("pcre2 general context creation failed\n");
+ return -1;
+ }
+ if((pcres_ctx = pcre2_compile_context_create(pcres_gctx)) == NULL) {
+ LM_ERR("pcre2 compile context creation failed\n");
+ return -1;
+ }
+ if((pcres_mctx = pcre2_match_context_create(pcres_gctx)) == NULL) {
+ LM_ERR("pcre2 match context creation failed\n");
+ return -1;
+ }
+
/* Pointer to pcres */
- if((pcres_addr = shm_malloc(sizeof(pcre **))) == 0) {
+ if((pcres_addr = shm_malloc(sizeof(pcre2_code **))) == 0) {
SHM_MEM_ERROR;
goto err;
}
@@ -227,6 +259,18 @@ err:
static void destroy(void)
{
free_shared_memory();
+
+ if(pcres_ctx) {
+ pcre2_compile_context_free(pcres_ctx);
+ }
+
+ if(pcres_mctx) {
+ pcre2_match_context_free(pcres_mctx);
+ }
+
+ if(pcres_gctx) {
+ pcre2_general_context_free(pcres_gctx);
+ }
}
@@ -237,13 +281,11 @@ static int load_pcres(int action)
FILE *f;
char line[FILE_MAX_LINE];
char **patterns = NULL;
- pcre *pcre_tmp = NULL;
- size_t pcre_size;
- int pcre_rc;
- const char *pcre_error;
- int pcre_erroffset;
+ int pcre_error_num = 0;
+ char pcre_error[128];
+ size_t pcre_erroffset;
int num_pcres_tmp = 0;
- pcre **pcres_tmp = NULL;
+ pcre2_code **pcres_tmp = NULL;
int llen;
/* Get the lock */
@@ -379,38 +421,34 @@ static int load_pcres(int action)
}
/* Temporal pointer of pcres */
- if((pcres_tmp = pkg_malloc(sizeof(pcre *) * num_pcres_tmp)) == 0) {
+ if((pcres_tmp = pkg_malloc(sizeof(pcre2_code *) * num_pcres_tmp)) == 0) {
LM_ERR("no more memory for pcres_tmp\n");
goto err;
}
- for(i = 0; i < num_pcres_tmp; i++) {
- pcres_tmp[i] = NULL;
- }
+ memset(pcres_tmp, 0, sizeof(pcre2_code *) * num_pcres_tmp);
/* Compile the patterns */
for(i = 0; i < num_pcres_tmp; i++) {
-
- pcre_tmp = pcre_compile(
- patterns[i], pcre_options, &pcre_error, &pcre_erroffset, NULL);
- if(pcre_tmp == NULL) {
- LM_ERR("pcre_tmp compilation of '%s' failed at offset %d: %s\n",
+ pcres_tmp[i] = pcre2_compile((PCRE2_SPTR)patterns[i],
+ PCRE2_ZERO_TERMINATED, pcre_options, &pcre_error_num,
+ &pcre_erroffset, pcres_ctx);
+ if(pcres_tmp[i] == NULL) {
+ switch(pcre2_get_error_message(
+ pcre_error_num, (PCRE2_UCHAR *)pcre_error, 128)) {
+ case PCRE2_ERROR_NOMEMORY:
+ snprintf(pcre_error, 128,
+ "unknown error[%d]: pcre2 error buffer too small",
+ pcre_error_num);
+ break;
+ case PCRE2_ERROR_BADDATA:
+ snprintf(pcre_error, 128, "unknown pcre2 error[%d]",
+ pcre_error_num);
+ break;
+ }
+ LM_ERR("pcre_tmp compilation of '%s' failed at offset %zu: %s\n",
patterns[i], pcre_erroffset, pcre_error);
goto err;
}
- pcre_rc = pcre_fullinfo(pcre_tmp, NULL, PCRE_INFO_SIZE, &pcre_size);
- if(pcre_rc) {
- printf("pcre_fullinfo on compiled pattern[%i] yielded error: %d\n",
- i, pcre_rc);
- goto err;
- }
-
- if((pcres_tmp[i] = pkg_malloc(pcre_size)) == 0) {
- LM_ERR("no more memory for pcres_tmp[%i]\n", i);
- goto err;
- }
-
- memcpy(pcres_tmp[i], pcre_tmp, pcre_size);
- pcre_free(pcre_tmp);
pkg_free(patterns[i]);
patterns[i] = NULL;
}
@@ -419,31 +457,15 @@ static int load_pcres(int action)
if(action == RELOAD) {
for(i = 0; i < *num_pcres; i++) { /* Use the previous num_pcres value */
if(pcres[i]) {
- shm_free(pcres[i]);
+ pcre2_code_free(pcres[i]);
}
}
shm_free(pcres);
}
- if((pcres = shm_malloc(sizeof(pcre *) * num_pcres_tmp)) == 0) {
- SHM_MEM_ERROR;
- goto err;
- }
- memset(pcres, 0, sizeof(pcre *) * num_pcres_tmp);
- for(i = 0; i < num_pcres_tmp; i++) {
- pcre_rc = pcre_fullinfo(pcres_tmp[i], NULL, PCRE_INFO_SIZE, &pcre_size);
- if((pcres[i] = shm_malloc(pcre_size)) == 0) {
- SHM_MEM_ERROR;
- goto err;
- }
- memcpy(pcres[i], pcres_tmp[i], pcre_size);
- }
*num_pcres = num_pcres_tmp;
+ *pcres = *pcres_tmp;
*pcres_addr = pcres;
- /* Free used memory */
- for(i = 0; i < num_pcres_tmp; i++) {
- pkg_free(pcres_tmp[i]);
- }
pkg_free(pcres_tmp);
/* Free allocated slots for unused patterns */
for(i = num_pcres_tmp; i < max_groups; i++) {
@@ -466,7 +488,7 @@ err:
if(pcres_tmp) {
for(i = 0; i < num_pcres_tmp; i++) {
if(pcres_tmp[i]) {
- pkg_free(pcres_tmp[i]);
+ pcre2_code_free(pcres_tmp[i]);
}
}
pkg_free(pcres_tmp);
@@ -520,42 +542,73 @@ static void free_shared_memory(void)
/*! \brief Return true if the argument matches the regular expression parameter */
static int ki_pcre_match(sip_msg_t *msg, str *string, str *regex)
{
- pcre *pcre_re = NULL;
+ pcre2_code *pcre_re = NULL;
+ pcre2_match_data *pcre_md = NULL;
int pcre_rc;
- const char *pcre_error;
- int pcre_erroffset;
+ int pcre_error_num = 0;
+ char pcre_error[128];
+ size_t pcre_erroffset;
- pcre_re = pcre_compile(
- regex->s, pcre_options, &pcre_error, &pcre_erroffset, NULL);
+ pcre_re = pcre2_compile((PCRE2_SPTR)regex->s, PCRE2_ZERO_TERMINATED,
+ pcre_options, &pcre_error_num, &pcre_erroffset, pcres_ctx);
if(pcre_re == NULL) {
- LM_ERR("pcre_re compilation of '%s' failed at offset %d: %s\n",
+ switch(pcre2_get_error_message(
+ pcre_error_num, (PCRE2_UCHAR *)pcre_error, 128)) {
+ case PCRE2_ERROR_NOMEMORY:
+ snprintf(pcre_error, 128,
+ "unknown error[%d]: pcre2 error buffer too small",
+ pcre_error_num);
+ break;
+ case PCRE2_ERROR_BADDATA:
+ snprintf(pcre_error, 128, "unknown pcre2 error[%d]",
+ pcre_error_num);
+ break;
+ }
+ LM_ERR("pcre_re compilation of '%s' failed at offset %zu: %s\n",
regex->s, pcre_erroffset, pcre_error);
return -4;
}
- pcre_rc = pcre_exec(pcre_re, /* the compiled pattern */
- NULL, /* no extra data - we didn't study the pattern */
- string->s, /* the matching string */
- (int)(string->len), /* the length of the subject */
- 0, /* start at offset 0 in the string */
- 0, /* default options */
- NULL, /* output vector for substring information */
- 0); /* number of elements in the output vector */
+ pcre_md = pcre2_match_data_create_from_pattern(pcre_re, pcres_gctx);
+ pcre_rc = pcre2_match(pcre_re, /* the compiled pattern */
+ (PCRE2_SPTR)string->s, /* the matching string */
+ (PCRE2_SIZE)(string->len), /* the length of the subject */
+ 0, /* start at offset 0 in the string */
+ 0, /* default options */
+ pcre_md, /* the match data block */
+ pcres_mctx); /* a match context; NULL means use defaults */
/* Matching failed: handle error cases */
if(pcre_rc < 0) {
switch(pcre_rc) {
- case PCRE_ERROR_NOMATCH:
+ case PCRE2_ERROR_NOMATCH:
LM_DBG("'%s' doesn't match '%s'\n", string->s, regex->s);
break;
default:
- LM_DBG("matching error '%d'\n", pcre_rc);
+ switch(pcre2_get_error_message(
+ pcre_rc, (PCRE2_UCHAR *)pcre_error, 128)) {
+ case PCRE2_ERROR_NOMEMORY:
+ snprintf(pcre_error, 128,
+ "unknown error[%d]: pcre2 error buffer too "
+ "small",
+ pcre_rc);
+ break;
+ case PCRE2_ERROR_BADDATA:
+ snprintf(pcre_error, 128, "unknown pcre2 error[%d]",
+ pcre_rc);
+ break;
+ }
+ LM_ERR("matching error:'%s' failed[%d]\n", pcre_error, pcre_rc);
break;
}
- pcre_free(pcre_re);
+ if(pcre_md)
+ pcre2_match_data_free(pcre_md);
+ pcre2_code_free(pcre_re);
return -1;
}
- pcre_free(pcre_re);
+ if(pcre_md)
+ pcre2_match_data_free(pcre_md);
+ pcre2_code_free(pcre_re);
LM_DBG("'%s' matches '%s'\n", string->s, regex->s);
return 1;
}
@@ -592,6 +645,8 @@ static int w_pcre_match(struct sip_msg *
static int ki_pcre_match_group(sip_msg_t *_msg, str *string, int num_pcre)
{
int pcre_rc;
+ pcre2_match_data *pcre_md = NULL;
+ char pcre_error[128];
/* Check if group matching feature is enabled */
if(file == NULL) {
@@ -606,26 +661,41 @@ static int ki_pcre_match_group(sip_msg_t
}
lock_get(reload_lock);
-
- pcre_rc = pcre_exec((*pcres_addr)[num_pcre], /* the compiled pattern */
- NULL, /* no extra data - we didn't study the pattern */
- string->s, /* the matching string */
- (int)(string->len), /* the length of the subject */
- 0, /* start at offset 0 in the string */
- 0, /* default options */
- NULL, /* output vector for substring information */
- 0); /* number of elements in the output vector */
+ pcre_md = pcre2_match_data_create_from_pattern(
+ (*pcres_addr)[num_pcre], pcres_gctx);
+ pcre_rc = pcre2_match((*pcres_addr)[num_pcre], /* the compiled pattern */
+ (PCRE2_SPTR)string->s, /* the matching string */
+ (PCRE2_SIZE)(string->len), /* the length of the subject */
+ 0, /* start at offset 0 in the string */
+ 0, /* default options */
+ pcre_md, /* the match data block */
+ pcres_mctx); /* a match context; NULL means use defaults */
lock_release(reload_lock);
+ if(pcre_md)
+ pcre2_match_data_free(pcre_md);
/* Matching failed: handle error cases */
if(pcre_rc < 0) {
switch(pcre_rc) {
- case PCRE_ERROR_NOMATCH:
+ case PCRE2_ERROR_NOMATCH:
LM_DBG("'%s' doesn't match pcres[%i]\n", string->s, num_pcre);
break;
default:
- LM_DBG("matching error '%d'\n", pcre_rc);
+ switch(pcre2_get_error_message(
+ pcre_rc, (PCRE2_UCHAR *)pcre_error, 128)) {
+ case PCRE2_ERROR_NOMEMORY:
+ snprintf(pcre_error, 128,
+ "unknown error[%d]: pcre2 error buffer too "
+ "small",
+ pcre_rc);
+ break;
+ case PCRE2_ERROR_BADDATA:
+ snprintf(pcre_error, 128, "unknown pcre2 error[%d]",
+ pcre_rc);
+ break;
+ }
+ LM_ERR("matching error:'%s' failed[%d]\n", pcre_error, pcre_rc);
break;
}
return -1;

View file

@ -1,8 +1,8 @@
--- a/utils/kamctl/kamctlrc --- a/utils/kamctl/kamctlrc
+++ b/utils/kamctl/kamctlrc +++ b/utils/kamctl/kamctlrc
@@ -162,3 +162,6 @@ @@ -166,3 +166,6 @@
## Extra start options - default is: not set ## Extra start options - default is: not set
## example: start Kamailio with 64MB share memory: STARTOPTIONS="-m 64" ## example: start Kamailio with 64MB shared memory: STARTOPTIONS="-m 64"
# STARTOPTIONS= # STARTOPTIONS=
+ +
+# Disable colour printing in terminal +# Disable colour printing in terminal

View file

@ -0,0 +1,45 @@
From 8421e2be8331a03b0087eb33241fac98e1fd821f Mon Sep 17 00:00:00 2001
From: Christian Marangi <ansuelsmth@gmail.com>
Date: Fri, 3 Nov 2023 03:09:21 +0100
Subject: [PATCH] kamcmd: don't clash with ENV NAME or ctl.so module
NAME variable might be set to the current HOSTNAME in some shell and
also clash with the value set by the module calling MOD_INSTALL_UTILS by
passing a NAME variable.
With commit 1774cee62098 ("kamcmd: allow defining the name of the
application from command line") this resulted in the kamcmd bin being
renamed to all kind of name from hostname to ctl.so.
Fix this by checking the variable to a more safe name that is not
already defined in shell by default and also that doesn't clash with
module variables, use UTIL_NAME as an alternative to NAME.
UTIL_NAME now needs to be used to create kamcmd with custom name.
Fixes: 1774cee62098 ("kamcmd: allow defining the name of the application from command line")
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
---
utils/kamcmd/Makefile | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
--- a/utils/kamcmd/Makefile
+++ b/utils/kamcmd/Makefile
@@ -8,10 +8,15 @@ include $(COREPATH)/Makefile.targets
auto_gen=
RELEASE=1.5
UTIL_SRC_NAME=kamcmd
+# Pass CUSTOM_NAME to overwrite the kamcmd/sercmd bin name
+ifeq ($(CUSTOM_NAME),)
ifeq ($(FLAVOUR),ser)
- NAME?=sercmd
+ NAME=sercmd
else
- NAME?=kamcmd
+ NAME=kamcmd
+endif
+else
+ NAME=$(CUSTOM_NAME)
endif
readline_localpath=$(LOCALBASE)/include/readline/readline.h

View file

@ -1,49 +0,0 @@
From f32e1d9c96f6ba9df3c27178c689ccd27eabaafc Mon Sep 17 00:00:00 2001
From: Sebastian Kemper <sebastian_ml@gmx.net>
Date: Sun, 16 Oct 2022 16:51:41 +0200
Subject: [PATCH] siputils: fix time_t warning and a typo
Fix the below warning one gets when compiling siputils for a 32 bit
target against a time64 libc (musl).
Also fix a spelling mistake on the same line ("autdated" -> "outdated").
siputils.c: In function 'ki_hdr_date_check':
../../core/parser/../dprint.h:321:73: warning: format '%ld' expects argument of type 'long int', but argument 11 has type 'time_t' {aka 'long long int'} [-Wformat=]
321 | fprintf(stderr, "%2d(%d) %s: %.*s%s%s%s" fmt, \
| ^~~~~~~~~~~~~~~~~~~~~~~~
../../core/parser/../dprint.h:345:25: note: in expansion of macro 'LOG_FX'
345 | LOG_FX(facility, level, lname, prefix, _FUNC_NAME_, fmt, ## args)
| ^~~~~~
../../core/parser/../dprint.h:351:25: note: in expansion of macro 'LOG_FL'
351 | LOG_FL(facility, level, NULL, prefix, fmt, ## args)
| ^~~~~~
../../core/parser/../dprint.h:354:25: note: in expansion of macro 'LOG_FP'
354 | LOG_FP(DEFAULT_FACILITY, (level), LOC_INFO, fmt, ## args)
| ^~~~~~
../../core/parser/../dprint.h:392:37: note: in expansion of macro 'LOG'
392 | # define ERR(fmt, args...) LOG(L_ERR, fmt , ## args)
| ^~~
../../core/parser/../dprint.h:418:16: note: in expansion of macro 'ERR'
418 | #define LM_ERR ERR
| ^~~
siputils.c:562:17: note: in expansion of macro 'LM_ERR'
562 | LM_ERR("autdated date header value (%ld sec)\n", tnow - tmsg + tdiff);
| ^~~~~~
Signed-off-by: Sebastian Kemper <sebastian_ml@gmx.net>
---
src/modules/siputils/siputils.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- a/src/modules/siputils/siputils.c
+++ b/src/modules/siputils/siputils.c
@@ -559,7 +559,7 @@ static int ki_hdr_date_check(sip_msg_t*
}
if (tnow > tmsg + tdiff) {
- LM_ERR("autdated date header value (%ld sec)\n", tnow - tmsg + tdiff);
+ LM_ERR("outdated date header value (%" TIME_T_FMT " sec)\n", TIME_T_CAST(tnow - tmsg + tdiff));
return -4;
} else {
LM_ERR("Date header value OK\n");

View file

@ -1,60 +0,0 @@
From b8bf86eb11a17c853450e5c7f81d2446cf719fbc Mon Sep 17 00:00:00 2001
From: Daniel-Constantin Mierla <miconda@gmail.com>
Date: Thu, 21 Jul 2022 20:15:29 +0200
Subject: [PATCH] app_python3: use new Python 3.10+ API functions for tracking
execution
- GH #3187
---
src/modules/app_python3/apy_kemi.c | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
--- a/src/modules/app_python3/apy_kemi.c
+++ b/src/modules/app_python3/apy_kemi.c
@@ -1810,6 +1810,9 @@ PyObject *sr_apy_kemi_exec_func(PyObject
PyObject *ret = NULL;
PyThreadState *pstate = NULL;
PyFrameObject *pframe = NULL;
+#if PY_VERSION_HEX >= 0x03100000
+ PyCodeObject *pcode = NULL;
+#endif
struct timeval tvb = {0}, tve = {0};
struct timezone tz;
unsigned int tdiff;
@@ -1832,10 +1835,27 @@ PyObject *sr_apy_kemi_exec_func(PyObject
+ (tve.tv_usec - tvb.tv_usec);
if(tdiff >= cfg_get(core, core_cfg, latency_limit_action)) {
pstate = PyThreadState_GET();
- if (pstate != NULL && pstate->frame != NULL) {
+ if (pstate != NULL) {
+#if PY_VERSION_HEX >= 0x03100000
+ pframe = PyThreadState_GetFrame(pstate);
+ if(pframe != NULL) {
+ pcode = PyFrame_GetCode(pframe);
+ }
+#else
pframe = pstate->frame;
+#endif
}
+#if PY_VERSION_HEX >= 0x03100000
+ LOG(cfg_get(core, core_cfg, latency_log),
+ "alert - action KSR.%s%s%s(...)"
+ " took too long [%u ms] (file:%s func:%s line:%d)\n",
+ (ket->mname.len>0)?ket->mname.s:"",
+ (ket->mname.len>0)?".":"", ket->fname.s, tdiff,
+ (pcode)?PyBytes_AsString(pcode->co_filename):"",
+ (pcode)?PyBytes_AsString(pcode->co_name):"",
+ (pframe)?PyFrame_GetLineNumber(pframe):0);
+#else
LOG(cfg_get(core, core_cfg, latency_log),
"alert - action KSR.%s%s%s(...)"
" took too long [%u ms] (file:%s func:%s line:%d)\n",
@@ -1844,6 +1864,7 @@ PyObject *sr_apy_kemi_exec_func(PyObject
(pframe && pframe->f_code)?PyBytes_AsString(pframe->f_code->co_filename):"",
(pframe && pframe->f_code)?PyBytes_AsString(pframe->f_code->co_name):"",
(pframe && pframe->f_code)?PyCode_Addr2Line(pframe->f_code, pframe->f_lasti):0);
+#endif
}
}

View file

@ -1,38 +0,0 @@
From 8546fb87e3277b675bd47eba9435f739cf3bb69d Mon Sep 17 00:00:00 2001
From: Daniel-Constantin Mierla <miconda@gmail.com>
Date: Fri, 13 Jan 2023 12:33:20 +0100
Subject: [PATCH] app_python3: proper check of PY_VERSION_HEX for python 3.11
---
src/modules/app_python3/apy_kemi.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
--- a/src/modules/app_python3/apy_kemi.c
+++ b/src/modules/app_python3/apy_kemi.c
@@ -1810,7 +1810,7 @@ PyObject *sr_apy_kemi_exec_func(PyObject
PyObject *ret = NULL;
PyThreadState *pstate = NULL;
PyFrameObject *pframe = NULL;
-#if PY_VERSION_HEX >= 0x03100000
+#if PY_VERSION_HEX >= 0x030B0000
PyCodeObject *pcode = NULL;
#endif
struct timeval tvb = {0}, tve = {0};
@@ -1836,7 +1836,7 @@ PyObject *sr_apy_kemi_exec_func(PyObject
if(tdiff >= cfg_get(core, core_cfg, latency_limit_action)) {
pstate = PyThreadState_GET();
if (pstate != NULL) {
-#if PY_VERSION_HEX >= 0x03100000
+#if PY_VERSION_HEX >= 0x030B0000
pframe = PyThreadState_GetFrame(pstate);
if(pframe != NULL) {
pcode = PyFrame_GetCode(pframe);
@@ -1846,7 +1846,7 @@ PyObject *sr_apy_kemi_exec_func(PyObject
#endif
}
-#if PY_VERSION_HEX >= 0x03100000
+#if PY_VERSION_HEX >= 0x030B0000
LOG(cfg_get(core, core_cfg, latency_log),
"alert - action KSR.%s%s%s(...)"
" took too long [%u ms] (file:%s func:%s line:%d)\n",

View file

@ -1,23 +0,0 @@
From fc75b4c3f8f9bdba320f74ddf942686c09316b56 Mon Sep 17 00:00:00 2001
From: Daniel-Constantin Mierla <miconda@gmail.com>
Date: Fri, 13 Jan 2023 12:41:12 +0100
Subject: [PATCH] app_python3: use Py_SET_TYPE() from python 3.9
---
src/modules/app_python3/python_msgobj.c | 4 ++++
1 file changed, 4 insertions(+)
--- a/src/modules/app_python3/python_msgobj.c
+++ b/src/modules/app_python3/python_msgobj.c
@@ -507,7 +507,11 @@ static PyTypeObject MSGtype = {
int python_msgobj_init(void)
{
+#if PY_VERSION_HEX >= 0x03090000
+ Py_SET_TYPE(&MSGtype, &PyType_Type);
+#else
Py_TYPE(&MSGtype) = &PyType_Type;
+#endif
if (PyType_Ready(&MSGtype) < 0)
return -1;
return 0;