From 5fd5eb55c6ac97e226c8d8f949ee3782b01d6c12 Mon Sep 17 00:00:00 2001 From: Vladimir Dubrovin <3proxy@3proxy.ru> Date: Thu, 2 Apr 2026 17:55:10 +0300 Subject: [PATCH] switch PCREPlugin to PCRE2 --- .github/workflows/c-cpp.yml | 4 +- Dockerfile.full | 2 +- Makefile.FreeBSD | 2 +- Makefile.Linux | 2 +- Makefile.openwrt-mips | 2 +- Makefile.unix | 2 +- Makefile.win | 2 +- README | 2 +- src/plugins/PCREPlugin/Makefile.inc | 2 +- src/plugins/PCREPlugin/pcre_plugin.c | 251 +++++++++++++++++++++------ 10 files changed, 209 insertions(+), 62 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 77561de..1e20f3a 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -25,7 +25,7 @@ jobs: # run: ./configure - name: Linux libraries if: ${{ startsWith(matrix.target, 'ubuntu') }} - run: sudo apt install libssl-dev libpam-dev libpcre3 libpcre3-dev + run: sudo apt install libssl-dev libpam-dev libpcre2-dev - name: make Ubuntu if: ${{ startsWith(matrix.target, 'ubuntu') }} run: make -f Makefile.Linux @@ -40,7 +40,7 @@ jobs: run: make -f Makefile.Linux clean - name: Mac libraries if: ${{ startsWith(matrix.target, 'macos') }} - run: brew install pcre + run: brew install pcre2 - name: make MacOS if: ${{ startsWith(matrix.target, 'macos') }} run: make -f Makefile.FreeBSD diff --git a/Dockerfile.full b/Dockerfile.full index f962c22..cbeb35a 100644 --- a/Dockerfile.full +++ b/Dockerfile.full @@ -27,7 +27,7 @@ FROM gcc AS buildenv COPY . 3proxy RUN cd 3proxy &&\ - apt update && apt install libssl-dev libpam-dev libpcre3 libpcre3-dev &&\ + apt update && apt install libssl-dev libpam-dev libpcre2-dev &&\ make -f Makefile.Linux &&\ strip bin/3proxy &&\ strip bin/StringsPlugin.ld.so &&\ diff --git a/Makefile.FreeBSD b/Makefile.FreeBSD index 693d5f8..49c6bae 100644 --- a/Makefile.FreeBSD +++ b/Makefile.FreeBSD @@ -39,7 +39,7 @@ PAM_CHECK = $(shell echo "\#include \\n int main(){return 0 ifeq ($(PAM_CHECK), true) PLUGINS += PamAuth endif -PCRE_CHECK = $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false) +PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre2-8 -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false) ifeq ($(PCRE_CHECK), true) PLUGINS += PCREPlugin endif diff --git a/Makefile.Linux b/Makefile.Linux index db63281..732c0f2 100644 --- a/Makefile.Linux +++ b/Makefile.Linux @@ -41,7 +41,7 @@ ifeq ($(OPENSSL_CHECK), true) LIBS += -l crypto -l ssl PLUGINS += SSLPlugin endif -PCRE_CHECK = $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false) +PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre2-8 -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false) ifeq ($(PCRE_CHECK), true) PLUGINS += PCREPlugin endif diff --git a/Makefile.openwrt-mips b/Makefile.openwrt-mips index 6ea07f5..0cbe8f0 100644 --- a/Makefile.openwrt-mips +++ b/Makefile.openwrt-mips @@ -41,7 +41,7 @@ ifeq ($(OPENSSL_CHECK), true) LIBS += -l crypto -l ssl PLUGINS += SSLPlugin endif -PCRE_CHECK = $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false) +PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre2-8 -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false) ifeq ($(PCRE_CHECK), true) PLUGINS += PCREPlugin endif diff --git a/Makefile.unix b/Makefile.unix index c8151cc..6082a79 100644 --- a/Makefile.unix +++ b/Makefile.unix @@ -43,7 +43,7 @@ PAM_CHECK = $(shell echo "\#include \\n int main(){return 0 ifeq ($(PAM_CHECK), true) PLUGINS += PamAuth endif -PCRE_CHECK = $(shell echo "\#include \\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false) +PCRE_CHECK = $(shell echo "\#define PCRE2_CODE_UNIT_WIDTH 8\\n\#include \\n int main(){return 0;}" | tr -d \\\\ | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre2-8 -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false) ifeq ($(PCRE_CHECK), true) PLUGINS += PCREPlugin endif diff --git a/Makefile.win b/Makefile.win index ea97c65..5e67228 100644 --- a/Makefile.win +++ b/Makefile.win @@ -40,7 +40,7 @@ ifeq ($(OPENSSL_CHECK), true) LIBS += -l crypto -l ssl PLUGINS += SSLPlugin endif -PCRE_CHECK = $(shell echo "#include \\n int main(){return 0;}" | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false) +PCRE_CHECK = $(shell echo "#define PCRE2_CODE_UNIT_WIDTH 8\\n#include \\n int main(){return 0;}" | cc -x c $(CFLAGS) $(LDFLAGS) -l pcre2-8 -o testpcre - 2>/dev/null && rm testpcre && echo true||echo false) ifeq ($(PCRE_CHECK), true) PLUGINS += PCREPlugin endif diff --git a/README b/README index ab08a30..84e2117 100644 --- a/README +++ b/README @@ -141,7 +141,7 @@ make + All access control entries now support weekday and time limitations + Hostnames and * templates are supported instead of IP address 5. Extensions - + Regular expression filtering (with PCRE) via PCREPlugin + + Regular expression filtering (with PCRE2) via PCREPlugin + Authentication with Windows username/password (cleartext only) + SSL/TLS decryptions with certificate spoofing + Transparent redirection support for Linux and *BSD diff --git a/src/plugins/PCREPlugin/Makefile.inc b/src/plugins/PCREPlugin/Makefile.inc index cd4c15a..a9c356e 100644 --- a/src/plugins/PCREPlugin/Makefile.inc +++ b/src/plugins/PCREPlugin/Makefile.inc @@ -1,4 +1,4 @@ all: $(BUILDDIR)PCREPlugin$(DLSUFFICS) $(BUILDDIR)PCREPlugin$(DLSUFFICS): pcre_plugin$(OBJSUFFICS) - $(LN) $(LNOUT)../../$(BUILDDIR)PCREPlugin$(DLSUFFICS) $(LDFLAGS) $(DLFLAGS) pcre_plugin$(OBJSUFFICS) $(LIBSPREFIX)pcre$(LIBSSUFFIX) + $(LN) $(LNOUT)../../$(BUILDDIR)PCREPlugin$(DLSUFFICS) $(LDFLAGS) $(DLFLAGS) pcre_plugin$(OBJSUFFICS) $(LIBSPREFIX)pcre2-8$(LIBSSUFFIX) diff --git a/src/plugins/PCREPlugin/pcre_plugin.c b/src/plugins/PCREPlugin/pcre_plugin.c index 9c79d10..346aa77 100644 --- a/src/plugins/PCREPlugin/pcre_plugin.c +++ b/src/plugins/PCREPlugin/pcre_plugin.c @@ -7,7 +7,8 @@ #include "../../structures.h" #include -#include +#define PCRE2_CODE_UNIT_WIDTH 8 +#include #ifdef __cplusplus extern "C" { @@ -34,46 +35,76 @@ static struct filter pcre_first_filter = { static struct filter *pcre_last_filter; static int pcre_loaded = 0; -static int pcre_options = 0; +static uint32_t pcre_options = 0; static struct pcreopt { char * name; - int value; + uint32_t value; } pcreopts[]= { - {"PCRE_CASELESS", PCRE_CASELESS}, - {"PCRE_MULTILINE", PCRE_MULTILINE}, - {"PCRE_DOTALL", PCRE_DOTALL}, - {"PCRE_EXTENDED", PCRE_EXTENDED}, - {"PCRE_ANCHORED", PCRE_ANCHORED}, - {"PCRE_DOLLAR_ENDONLY", PCRE_DOLLAR_ENDONLY}, - {"PCRE_EXTRA", PCRE_EXTRA}, - {"PCRE_NOTBOL", PCRE_NOTBOL}, - {"PCRE_NOTEOL", PCRE_NOTEOL}, - {"PCRE_UNGREEDY", PCRE_UNGREEDY}, - {"PCRE_NOTEMPTY", PCRE_NOTEMPTY}, - {"PCRE_UTF8", PCRE_UTF8}, - {"PCRE_NO_AUTO_CAPTURE", PCRE_NO_AUTO_CAPTURE}, - {"PCRE_NO_UTF8_CHECK", PCRE_NO_UTF8_CHECK}, - {"PCRE_AUTO_CALLOUT", PCRE_AUTO_CALLOUT}, - {"PCRE_PARTIAL", PCRE_PARTIAL}, - {"PCRE_DFA_SHORTEST", PCRE_DFA_SHORTEST}, - {"PCRE_DFA_RESTART", PCRE_DFA_RESTART}, - {"PCRE_FIRSTLINE", PCRE_FIRSTLINE}, - {"PCRE_DUPNAMES", PCRE_DUPNAMES}, - {"PCRE_NEWLINE_CR", PCRE_NEWLINE_CR}, - {"PCRE_NEWLINE_LF", PCRE_NEWLINE_LF}, - {"PCRE_NEWLINE_CRLF", PCRE_NEWLINE_CRLF}, - {"PCRE_NEWLINE_ANY", PCRE_NEWLINE_ANY}, - {"PCRE_NEWLINE_ANYCRLF", PCRE_NEWLINE_ANYCRLF}, - {"PCRE_BSR_ANYCRLF", PCRE_BSR_ANYCRLF}, - {"PCRE_BSR_UNICODE", PCRE_BSR_UNICODE}, + {"PCRE2_ALLOW_EMPTY_CLASS", PCRE2_ALLOW_EMPTY_CLASS}, + {"PCRE2_ALT_BSUX", PCRE2_ALT_BSUX}, + {"PCRE2_AUTO_CALLOUT", PCRE2_AUTO_CALLOUT}, + {"PCRE2_CASELESS", PCRE2_CASELESS}, + {"PCRE2_DOLLAR_ENDONLY", PCRE2_DOLLAR_ENDONLY}, + {"PCRE2_DOTALL", PCRE2_DOTALL}, + {"PCRE2_DUPNAMES", PCRE2_DUPNAMES}, + {"PCRE2_EXTENDED", PCRE2_EXTENDED}, + {"PCRE2_FIRSTLINE", PCRE2_FIRSTLINE}, + {"PCRE2_MATCH_UNSET_BACKREF", PCRE2_MATCH_UNSET_BACKREF}, + {"PCRE2_MULTILINE", PCRE2_MULTILINE}, + {"PCRE2_NEVER_UCP", PCRE2_NEVER_UCP}, + {"PCRE2_NEVER_UTF", PCRE2_NEVER_UTF}, + {"PCRE2_NO_AUTO_CAPTURE", PCRE2_NO_AUTO_CAPTURE}, + {"PCRE2_NO_AUTO_POSSESS", PCRE2_NO_AUTO_POSSESS}, + {"PCRE2_NO_DOTSTAR_ANCHOR", PCRE2_NO_DOTSTAR_ANCHOR}, + {"PCRE2_NO_START_OPTIMIZE", PCRE2_NO_START_OPTIMIZE}, + {"PCRE2_UCP", PCRE2_UCP}, + {"PCRE2_UNGREEDY", PCRE2_UNGREEDY}, + {"PCRE2_UTF", PCRE2_UTF}, + {"PCRE2_NEVER_BACKSLASH_C", PCRE2_NEVER_BACKSLASH_C}, + {"PCRE2_ALT_CIRCUMFLEX", PCRE2_ALT_CIRCUMFLEX}, + {"PCRE2_ALT_VERBNAMES", PCRE2_ALT_VERBNAMES}, + {"PCRE2_USE_OFFSET_LIMIT", PCRE2_USE_OFFSET_LIMIT}, + {"PCRE2_EXTENDED_MORE", PCRE2_EXTENDED_MORE}, + {"PCRE2_LITERAL", PCRE2_LITERAL}, + {"PCRE2_MATCH_INVALID_UTF", PCRE2_MATCH_INVALID_UTF}, + + {"PCRE_CASELESS", PCRE2_CASELESS}, + {"PCRE_MULTILINE", PCRE2_MULTILINE}, + {"PCRE_DOTALL", PCRE2_DOTALL}, + {"PCRE_EXTENDED", PCRE2_EXTENDED}, + {"PCRE_ANCHORED", PCRE2_ANCHORED}, + {"PCRE_DOLLAR_ENDONLY", PCRE2_DOLLAR_ENDONLY}, + {"PCRE_EXTRA", PCRE2_EXTENDED_MORE}, + {"PCRE_NOTBOL", PCRE2_NOTBOL}, + {"PCRE_NOTEOL", PCRE2_NOTEOL}, + {"PCRE_UNGREEDY", PCRE2_UNGREEDY}, + {"PCRE_NOTEMPTY", PCRE2_NOTEMPTY}, + {"PCRE_UTF8", PCRE2_UTF}, + {"PCRE_NO_AUTO_CAPTURE", PCRE2_NO_AUTO_CAPTURE}, + {"PCRE_NO_UTF8_CHECK", PCRE2_MATCH_INVALID_UTF}, + {"PCRE_AUTO_CALLOUT", PCRE2_AUTO_CALLOUT}, + {"PCRE_PARTIAL", PCRE2_PARTIAL_SOFT}, + {"PCRE_DFA_SHORTEST", PCRE2_DFA_SHORTEST}, + {"PCRE_DFA_RESTART", PCRE2_DFA_RESTART}, + {"PCRE_FIRSTLINE", PCRE2_FIRSTLINE}, + {"PCRE_DUPNAMES", PCRE2_DUPNAMES}, + {"PCRE_NEWLINE_CR", PCRE2_NEWLINE_CR}, + {"PCRE_NEWLINE_LF", PCRE2_NEWLINE_LF}, + {"PCRE_NEWLINE_CRLF", PCRE2_NEWLINE_CRLF}, + {"PCRE_NEWLINE_ANY", PCRE2_NEWLINE_ANY}, + {"PCRE_NEWLINE_ANYCRLF", PCRE2_NEWLINE_ANYCRLF}, + {"PCRE_BSR_ANYCRLF", PCRE2_BSR_ANYCRLF}, + {"PCRE_BSR_UNICODE", PCRE2_BSR_UNICODE}, + {NULL, 0} }; struct pcre_filter_data { int users; - pcre * re; + pcre2_code * re; + pcre2_match_data * match_data; int action; char * replace; struct ace *acl; @@ -83,7 +114,8 @@ static void pcre_data_free(struct pcre_filter_data *pcrefd){ pthread_mutex_lock(&pcre_mutex); pcrefd->users--; if(!pcrefd->users){ - if(pcrefd->re) pl->freefunc(pcrefd->re); + if(pcrefd->match_data) pcre2_match_data_free(pcrefd->match_data); + if(pcrefd->re) pcre2_code_free(pcrefd->re); if(pcrefd->acl) pl->freeacl(pcrefd->acl); if(pcrefd->replace) pl->freefunc(pcrefd->replace); pl->freefunc(pcrefd); @@ -123,7 +155,7 @@ static FILTER_ACTION pcre_filter_client(void *fo, struct clientparam * param, vo } static FILTER_ACTION pcre_filter_buffer(void *fc, struct clientparam *param, unsigned char ** buf_p, int * bufsize_p, int offset, int * length_p){ - int ovector[48]; + PCRE2_SIZE *ovector; int count = 0; struct ace *acl; int match = 0; @@ -143,8 +175,9 @@ static FILTER_ACTION pcre_filter_buffer(void *fc, struct clientparam *param, uns if(!pcrefd->re) return pcrefd->action; for(; offset < *length_p; nreplaces++){ - count = pcre_exec(pcrefd->re, NULL, (char *)*buf_p, *length_p, offset, 0, ovector, 48); + count = pcre2_match(pcrefd->re, (PCRE2_SPTR)*buf_p, *length_p, offset, 0, pcrefd->match_data, NULL); if(count <= 0) break; + ovector = pcre2_get_ovector_pointer(pcrefd->match_data); if(!(replace = pcrefd->replace) || param->nooverwritefilter) return pcrefd->action; replen = *length_p - ovector[1]; @@ -220,14 +253,15 @@ static void pcre_filter_close(void *fo){ static int h_pcre(int argc, unsigned char **argv){ int action = 0; - pcre *re = NULL; + pcre2_code *re = NULL; + pcre2_match_data *match_data = NULL; struct ace *acl; - int offset = 4; - const char * errptr; + int errcode; + PCRE2_SIZE erroffset; struct pcre_filter_data *flt; struct filter *newf; char *replace = NULL; - + if(!strncmp((char *)argv[2], "allow",5)) action = PASS; else if(!strncmp((char *)argv[2], "deny",4)) action = REJECT; else if(!strncmp((char *)argv[2], "remove",6)) action = REMOVE; @@ -235,7 +269,6 @@ static int h_pcre(int argc, unsigned char **argv){ else return 1; if(!strncmp((char *)argv[0], "pcre_rewrite", 12)) { int i,j; - offset = 5; replace = pl->strdupfunc((char *)argv[4]); if(!replace) return 9; for(i=0, j=0; replace[i]; i++, j++){ @@ -264,22 +297,30 @@ static int h_pcre(int argc, unsigned char **argv){ } replace[j] = 0; } - if(!(acl = pl->make_ace(argc - offset, argv + offset))) return 2; + if(!(acl = pl->make_ace(argc - 4, argv + 4))) return 2; acl->nolog = (strstr((char *)argv[2],"log") == 0); if(*argv[3] && !(*argv[3] == '*' && !argv[3][1]) ){ - re = pcre_compile((char *)argv[3], pcre_options, &errptr, &offset, NULL); + re = pcre2_compile((PCRE2_SPTR)argv[3], PCRE2_ZERO_TERMINATED, pcre_options, &errcode, &erroffset, NULL); if(!re) { pl->freefunc(acl); if(replace) pl->freefunc(replace); return 3; } + match_data = pcre2_match_data_create_from_pattern(re, NULL); + if(!match_data) { + pcre2_code_free(re); + pl->freefunc(acl); + if(replace) pl->freefunc(replace); + return 4; + } } flt = pl->mallocfunc(sizeof(struct pcre_filter_data)); newf = pl->mallocfunc(sizeof(struct filter)); - + if(!flt || !newf) { + if(match_data) pcre2_match_data_free(match_data); + if(re) pcre2_code_free(re); pl->freefunc(acl); - pl->freefunc(re); if(replace) pl->freefunc(replace); if(flt) pl->freefunc(flt); return 4; @@ -288,6 +329,7 @@ static int h_pcre(int argc, unsigned char **argv){ memset(newf, 0, sizeof(struct filter)); flt->action = action; flt->re = re; + flt->match_data = match_data; flt->acl = acl; flt->replace = replace; flt->users = 1; @@ -302,7 +344,114 @@ static int h_pcre(int argc, unsigned char **argv){ if(strstr((char *)argv[1], "srvdata"))newf->filter_data_srv = pcre_filter_buffer; newf->filter_clear = pcre_filter_clear; newf->filter_close = pcre_filter_close; - + + if(!pcre_last_filter){ + newf->next = pcre_first_filter.next; + pcre_first_filter.next=newf; + } + else { + newf->next = pcre_last_filter->next; + pcre_last_filter->next = newf; + } + pcre_last_filter=newf; + + return 0; +} + +static int h_pcre_rewrite(int argc, unsigned char **argv){ + int action = 0; + pcre2_code *re = NULL; + pcre2_match_data *match_data = NULL; + struct ace *acl; + int errcode; + PCRE2_SIZE erroffset; + struct pcre_filter_data *flt; + struct filter *newf; + char *replace = NULL; + + if(!strncmp((char *)argv[2], "allow",5)) action = PASS; + else if(!strncmp((char *)argv[2], "deny",4)) action = REJECT; + else if(!strncmp((char *)argv[2], "remove",6)) action = REMOVE; + else if(!strncmp((char *)argv[2], "dunno",5)) action = CONTINUE; + else return 1; + { + int i,j; + replace = pl->strdupfunc((char *)argv[4]); + if(!replace) return 9; + for(i=0, j=0; replace[i]; i++, j++){ + if(replace[i] == '\\'){ + switch(replace[i+1]){ + case 'r': + i++; + replace[j] = '\r'; + break; + case 'n': + i++; + replace[j] = '\n'; + break; + case '0': + i++; + replace[j] = 0; + break; + case '\\': + i++; + default: + replace[j] = '\\'; + break; + } + } + else replace[j] = replace[i]; + } + replace[j] = 0; + } + if(!(acl = pl->make_ace(argc - 5, argv + 5))) return 2; + acl->nolog = (strstr((char *)argv[2],"log") == 0); + if(*argv[3] && !(*argv[3] == '*' && !argv[3][1]) ){ + re = pcre2_compile((PCRE2_SPTR)argv[3], PCRE2_ZERO_TERMINATED, pcre_options, &errcode, &erroffset, NULL); + if(!re) { + pl->freefunc(acl); + if(replace) pl->freefunc(replace); + return 3; + } + match_data = pcre2_match_data_create_from_pattern(re, NULL); + if(!match_data) { + pcre2_code_free(re); + pl->freefunc(acl); + if(replace) pl->freefunc(replace); + return 4; + } + } + flt = pl->mallocfunc(sizeof(struct pcre_filter_data)); + newf = pl->mallocfunc(sizeof(struct filter)); + + if(!flt || !newf) { + if(match_data) pcre2_match_data_free(match_data); + if(re) pcre2_code_free(re); + pl->freefunc(acl); + if(replace) pl->freefunc(replace); + if(flt) pl->freefunc(flt); + return 4; + } + memset(flt, 0, sizeof(struct pcre_filter_data)); + memset(newf, 0, sizeof(struct filter)); + flt->action = action; + flt->re = re; + flt->match_data = match_data; + flt->acl = acl; + flt->replace = replace; + flt->users = 1; + newf->instance = "pcre"; + newf->data = flt; + newf->filter_open = pcre_filter_open; + newf->filter_client = pcre_filter_client; + if(strstr((char *)argv[1], "request"))newf->filter_request = pcre_filter_buffer; + if(strstr((char *)argv[1], "cliheader"))newf->filter_header_cli = pcre_filter_buffer; + if(strstr((char *)argv[1], "clidata"))newf->filter_data_cli = pcre_filter_buffer; + if(strstr((char *)argv[1], "srvheader"))newf->filter_header_srv = pcre_filter_buffer; + if(strstr((char *)argv[1], "srvdata"))newf->filter_data_srv = pcre_filter_buffer; + newf->filter_clear = pcre_filter_clear; + newf->filter_close = pcre_filter_close; + if(!pcre_last_filter){ newf->next = pcre_first_filter.next; pcre_first_filter.next=newf; @@ -335,21 +484,21 @@ static int h_pcre_options(int argc, unsigned char **argv){ for(i=0; pcreopts[i].name; i++) if(!strcmp(pcreopts[i].name, (char *)argv[j])) pcre_options |= pcreopts[i].value; - + return 0; } static struct commands pcre_commandhandlers[] = { {pcre_commandhandlers+1, "pcre", h_pcre, 4, 0}, - {pcre_commandhandlers+2, "pcre_rewrite", h_pcre, 5, 0}, + {pcre_commandhandlers+2, "pcre_rewrite", h_pcre_rewrite, 5, 0}, {pcre_commandhandlers+3, "pcre_extend", h_pcre_extend, 2, 0}, {NULL, "pcre_options", h_pcre_options, 2, 0} }; static struct symbol regexp_symbols[] = { - {regexp_symbols+1, "pcre_compile", (void*) pcre_compile}, - {regexp_symbols+2, "pcre_exec", (void*) pcre_exec}, + {regexp_symbols+1, "pcre2_compile", (void*) pcre2_compile}, + {regexp_symbols+2, "pcre2_match", (void*) pcre2_match}, {NULL, "pcre_options", (void *)&pcre_options}, }; @@ -359,15 +508,13 @@ static struct symbol regexp_symbols[] = { #define PLUGINCALL #endif -PLUGINAPI int PLUGINCALL pcre_plugin (struct pluginlink * pluginlink, +PLUGINAPI int PLUGINCALL pcre_plugin (struct pluginlink * pluginlink, int argc, char** argv){ struct filter *flt, *tmpflt; pl = pluginlink; pcre_options = 0; if(!pcre_loaded){ - pcre_malloc = pl->mallocfunc; - pcre_free = pl->freefunc; pcre_loaded = 1; pthread_mutex_init(&pcre_mutex, NULL); regexp_symbols[2].next = pl->symbols.next; @@ -390,7 +537,7 @@ PLUGINAPI int PLUGINCALL pcre_plugin (struct pluginlink * pluginlink, } pcre_last_filter = NULL; return 0; - + } #ifdef __cplusplus }