Fix: pcre/ssl command handlers broken in last commits
Some checks are pending
C/C++ CI Linux / ${{ matrix.target }} (ubuntu-24.04-arm) (push) Waiting to run
C/C++ CI Linux / ${{ matrix.target }} (ubuntu-latest) (push) Waiting to run
C/C++ CI MacOS / ${{ matrix.target }} (macos-15) (push) Waiting to run
C/C++ CI Windows / ${{ matrix.target }} (windows-2022) (push) Waiting to run
C/C++ CI cmake / ${{ matrix.target }} (macos-15) (push) Waiting to run
C/C++ CI cmake / ${{ matrix.target }} (ubuntu-24.04-arm) (push) Waiting to run
C/C++ CI cmake / ${{ matrix.target }} (ubuntu-latest) (push) Waiting to run
C/C++ CI cmake / ${{ matrix.target }} (windows-2022) (push) Waiting to run
C/C++ CI cmake / ubuntu-latest (wolfSSL) (push) Waiting to run

This commit is contained in:
Vladimir Dubrovin 2026-07-26 15:51:55 +03:00
parent ed5103d176
commit 4af02c9268
3 changed files with 124 additions and 88 deletions

View File

@ -1611,6 +1611,48 @@ static int h_chroot(int argc, unsigned char **argv){
#endif
#ifdef WITH_SSL
int h_mitm(int argc, unsigned char **argv);
int h_nomitm(int argc, unsigned char **argv);
int h_serv(int argc, unsigned char **argv);
int h_noserv(int argc, unsigned char **argv);
int h_cli(int argc, unsigned char **argv);
int h_nocli(int argc, unsigned char **argv);
int h_certcache(int argc, unsigned char **argv);
int h_srvcert(int argc, unsigned char **argv);
int h_srvkey(int argc, unsigned char **argv);
int h_clicert(int argc, unsigned char **argv);
int h_clikey(int argc, unsigned char **argv);
int h_client_cipher_list(int argc, unsigned char **argv);
int h_server_cipher_list(int argc, unsigned char **argv);
int h_client_ciphersuites(int argc, unsigned char **argv);
int h_server_ciphersuites(int argc, unsigned char **argv);
int h_server_ca_file(int argc, unsigned char **argv);
int h_server_ca_key(int argc, unsigned char **argv);
int h_client_ca_file(int argc, unsigned char **argv);
int h_client_ca_dir(int argc, unsigned char **argv);
int h_client_ca_store(int argc, unsigned char **argv);
int h_client_sni(int argc, unsigned char **argv);
int h_client_alpn(int argc, unsigned char **argv);
int h_server_ca_dir(int argc, unsigned char **argv);
int h_server_ca_store(int argc, unsigned char **argv);
int h_client_min_proto_version(int argc, unsigned char **argv);
int h_client_max_proto_version(int argc, unsigned char **argv);
int h_server_min_proto_version(int argc, unsigned char **argv);
int h_server_max_proto_version(int argc, unsigned char **argv);
int h_client_verify(int argc, unsigned char **argv);
int h_no_client_verify(int argc, unsigned char **argv);
int h_server_verify(int argc, unsigned char **argv);
int h_no_server_verify(int argc, unsigned char **argv);
int h_client_mode(int argc, unsigned char **argv);
#endif
#ifdef WITH_PCRE
int h_pcre(int argc, unsigned char **argv);
int h_pcre_rewrite(int argc, unsigned char **argv);
int h_pcre_extend(int argc, unsigned char **argv);
int h_pcre_options(int argc, unsigned char **argv);
#endif
struct commands commandhandlers[]={
{NULL, "", h_noop, 1, 0},
{NULL, "proxy", h_proxy, 1, 0},
@ -1687,6 +1729,51 @@ struct commands commandhandlers[]={
{NULL, "setuid", h_setuid, 2, 2},
{NULL, "setgid", h_setgid, 2, 2},
{NULL, "chroot", h_chroot, 2, 4},
#endif
#ifdef WITH_SSL
{NULL, "ssl_mitm", h_mitm, 1, 1},
{NULL, "ssl_nomitm", h_nomitm, 1, 1},
{NULL, "ssl_serv", h_serv, 1, 1},
{NULL, "ssl_noserv", h_noserv, 1, 1},
{NULL, "ssl_server_cert", h_srvcert, 1, 2},
{NULL, "ssl_server_key", h_srvkey, 1, 2},
{NULL, "ssl_server_ca_file", h_server_ca_file, 1, 2},
{NULL, "ssl_server_ca_key", h_server_ca_key, 1, 2},
{NULL, "ssl_client_ca_file", h_client_ca_file, 1, 2},
{NULL, "ssl_client_ca_dir", h_client_ca_dir, 1, 2},
{NULL, "ssl_client_ca_store", h_client_ca_store, 1, 2},
{NULL, "ssl_client_ciphersuites", h_client_ciphersuites, 1, 2},
{NULL, "ssl_server_ciphersuites", h_server_ciphersuites, 1, 2},
{NULL, "ssl_client_cipher_list", h_client_cipher_list, 1, 2},
{NULL, "ssl_server_cipher_list", h_server_cipher_list, 1, 2},
{NULL, "ssl_client_min_proto_version", h_client_min_proto_version, 1, 2},
{NULL, "ssl_server_min_proto_version", h_server_min_proto_version, 1, 2},
{NULL, "ssl_client_max_proto_version", h_client_max_proto_version, 1, 2},
{NULL, "ssl_server_max_proto_version", h_server_max_proto_version, 1, 2},
{NULL, "ssl_client_verify", h_client_verify, 1, 1},
{NULL, "ssl_client_no_verify", h_no_client_verify, 1, 1},
{NULL, "ssl_cli", h_cli, 1, 1},
{NULL, "ssl_nocli", h_nocli, 1, 1},
{NULL, "ssl_client_cert", h_clicert, 1, 2},
{NULL, "ssl_client_key", h_clikey, 1, 2},
{NULL, "ssl_server", h_serv, 1, 1},
{NULL, "ssl_noserver", h_noserv, 1, 1},
{NULL, "ssl_client", h_cli, 1, 1},
{NULL, "ssl_noclient", h_nocli, 1, 1},
{NULL, "ssl_server_verify", h_server_verify, 1, 1},
{NULL, "ssl_server_no_verify", h_no_server_verify, 1, 1},
{NULL, "ssl_server_ca_dir", h_server_ca_dir, 1, 2},
{NULL, "ssl_server_ca_store", h_server_ca_store, 1, 2},
{NULL, "ssl_client_sni", h_client_sni, 1, 2},
{NULL, "ssl_client_alpn", h_client_alpn, 1, 0},
{NULL, "ssl_client_mode", h_client_mode, 1, 2},
{NULL, "ssl_certcache", h_certcache, 2, 2},
#endif
#ifdef WITH_PCRE
{NULL, "pcre", h_pcre, 4, 0},
{NULL, "pcre_rewrite", h_pcre_rewrite, 5, 0},
{NULL, "pcre_extend", h_pcre_extend, 2, 0},
{NULL, "pcre_options", h_pcre_options, 2, 0},
#endif
{NULL, "", h_noop, 1, 0}
};

View File

@ -370,7 +370,7 @@ static void pcre_filter_close(void *fo){
pcre_data_free((struct pcre_filter_data *)fo);
}
static int h_pcre(int argc, unsigned char **argv){
int h_pcre(int argc, unsigned char **argv){
int action = 0;
pcre2_code *re = NULL;
pcre2_match_data *match_data = NULL;
@ -484,7 +484,7 @@ static int h_pcre(int argc, unsigned char **argv){
return 0;
}
static int h_pcre_rewrite(int argc, unsigned char **argv){
int h_pcre_rewrite(int argc, unsigned char **argv){
int action = 0;
pcre2_code *re = NULL;
pcre2_match_data *match_data = NULL;
@ -598,7 +598,7 @@ static int h_pcre_rewrite(int argc, unsigned char **argv){
return 0;
}
static int h_pcre_extend(int argc, unsigned char **argv){
int h_pcre_extend(int argc, unsigned char **argv){
struct ace *acl;
if(!pcre_last_filter || !pcre_last_filter->data) return 1;
acl = ((struct pcre_filter_data *)pcre_last_filter->data)->acl;
@ -609,7 +609,7 @@ static int h_pcre_extend(int argc, unsigned char **argv){
return 0;
}
static int h_pcre_options(int argc, unsigned char **argv){
int h_pcre_options(int argc, unsigned char **argv){
int i,j;
pcre_options = 0;
@ -622,13 +622,6 @@ static int h_pcre_options(int argc, unsigned char **argv){
}
static struct commands pcre_commandhandlers[] = {
{pcre_commandhandlers+1, "pcre", h_pcre, 4, 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, "pcre2_compile", (void*) pcre2_compile},
{regexp_symbols+2, "pcre2_match", (void*) pcre2_match},
@ -646,8 +639,6 @@ void pcre_install(void){
_3proxy_mutex_init(&pcre_mutex);
regexp_symbols[2].next = pl->symbols.next;
pl->symbols.next = regexp_symbols;
pcre_commandhandlers[3].next = pl->commandhandlers->next;
pl->commandhandlers->next = pcre_commandhandlers;
pcre_first_filter.next = pl->conf->filters;
pl->conf->filters = &pcre_first_filter;
}

108
src/ssl.c
View File

@ -880,7 +880,7 @@ static void unsetfilters(){
}
}
static int h_mitm(int argc, unsigned char **argv){
int h_mitm(int argc, unsigned char **argv){
if(mitm) return 0;
if(serv) return 2;
mitm = 1;
@ -888,14 +888,14 @@ static int h_mitm(int argc, unsigned char **argv){
return 0;
}
static int h_nomitm(int argc, unsigned char **argv){
int h_nomitm(int argc, unsigned char **argv){
if(!mitm) return 0;
mitm = 0;
unsetfilters();
return 0;
}
static int h_serv(int argc, unsigned char **argv){
int h_serv(int argc, unsigned char **argv){
if(serv) return 0;
if(mitm) return 2;
serv = 1;
@ -903,14 +903,14 @@ static int h_serv(int argc, unsigned char **argv){
return 0;
}
static int h_noserv(int argc, unsigned char **argv){
int h_noserv(int argc, unsigned char **argv){
if(!serv) return 0;
serv = 0;
unsetfilters();
return 0;
}
static int h_cli(int argc, unsigned char **argv){
int h_cli(int argc, unsigned char **argv){
if(cli) return 0;
if(mitm) return 2;
cli = 1;
@ -918,7 +918,7 @@ static int h_cli(int argc, unsigned char **argv){
return 0;
}
static int h_nocli(int argc, unsigned char **argv){
int h_nocli(int argc, unsigned char **argv){
if(!cli) return 0;
cli = 0;
unsetfilters();
@ -926,7 +926,7 @@ static int h_nocli(int argc, unsigned char **argv){
}
static int h_certcache(int argc, unsigned char **argv){
int h_certcache(int argc, unsigned char **argv){
size_t len;
len = strlen((char *)argv[1]);
if(!len || (argv[1][len - 1] != '/' && argv[1][len - 1] != '\\')) return 1;
@ -935,92 +935,92 @@ static int h_certcache(int argc, unsigned char **argv){
return 0;
}
static int h_srvcert(int argc, unsigned char **argv){
int h_srvcert(int argc, unsigned char **argv){
free(srvcert);
srvcert = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_srvkey(int argc, unsigned char **argv){
int h_srvkey(int argc, unsigned char **argv){
free(srvkey);
srvkey = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_clicert(int argc, unsigned char **argv){
int h_clicert(int argc, unsigned char **argv){
free(clicert);
clicert = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_clikey(int argc, unsigned char **argv){
int h_clikey(int argc, unsigned char **argv){
free(clikey);
clikey = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_client_cipher_list(int argc, unsigned char **argv){
int h_client_cipher_list(int argc, unsigned char **argv){
free(client_cipher_list);
client_cipher_list = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_server_cipher_list(int argc, unsigned char **argv){
int h_server_cipher_list(int argc, unsigned char **argv){
free(server_cipher_list);
server_cipher_list = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_client_ciphersuites(int argc, unsigned char **argv){
int h_client_ciphersuites(int argc, unsigned char **argv){
free(client_ciphersuites);
client_ciphersuites = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_server_ciphersuites(int argc, unsigned char **argv){
int h_server_ciphersuites(int argc, unsigned char **argv){
free(server_ciphersuites);
server_ciphersuites = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_server_ca_file(int argc, unsigned char **argv){
int h_server_ca_file(int argc, unsigned char **argv){
free(server_ca_file);
server_ca_file = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_server_ca_key(int argc, unsigned char **argv){
int h_server_ca_key(int argc, unsigned char **argv){
free(server_ca_key);
server_ca_key = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_client_ca_file(int argc, unsigned char **argv){
int h_client_ca_file(int argc, unsigned char **argv){
free(client_ca_file);
client_ca_file = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_client_ca_dir(int argc, unsigned char **argv){
int h_client_ca_dir(int argc, unsigned char **argv){
free(client_ca_dir);
client_ca_dir = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_client_ca_store(int argc, unsigned char **argv){
int h_client_ca_store(int argc, unsigned char **argv){
free(client_ca_store);
client_ca_store = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_client_sni(int argc, unsigned char **argv){
int h_client_sni(int argc, unsigned char **argv){
free(client_sni);
client_sni = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_client_alpn(int argc, unsigned char **argv){
int h_client_alpn(int argc, unsigned char **argv){
int len, i;
if(client_alpn_protos.protos_len){
@ -1050,13 +1050,13 @@ static int h_client_alpn(int argc, unsigned char **argv){
return 0;
}
static int h_server_ca_dir(int argc, unsigned char **argv){
int h_server_ca_dir(int argc, unsigned char **argv){
free(server_ca_dir);
server_ca_dir = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
}
static int h_server_ca_store(int argc, unsigned char **argv){
int h_server_ca_store(int argc, unsigned char **argv){
free(server_ca_store);
server_ca_store = argc > 1? strdup((char *)argv[1]) : NULL;
return 0;
@ -1097,41 +1097,41 @@ int string_to_version(unsigned char *ver){
return 0;
}
static int h_client_min_proto_version(int argc, unsigned char **argv){
int h_client_min_proto_version(int argc, unsigned char **argv){
client_min_proto_version = argc>1? string_to_version(argv[1]) : 0;
return 0;
}
static int h_client_max_proto_version(int argc, unsigned char **argv){
int h_client_max_proto_version(int argc, unsigned char **argv){
client_max_proto_version = argc>1? string_to_version(argv[1]) : 0;
return 0;
}
static int h_server_min_proto_version(int argc, unsigned char **argv){
int h_server_min_proto_version(int argc, unsigned char **argv){
server_min_proto_version = argc>1? string_to_version(argv[1]) : 0;
return 0;
}
static int h_server_max_proto_version(int argc, unsigned char **argv){
int h_server_max_proto_version(int argc, unsigned char **argv){
server_max_proto_version = argc>1? string_to_version(argv[1]) : 0;
return 0;
}
static int h_client_verify(int argc, unsigned char **argv){
int h_client_verify(int argc, unsigned char **argv){
client_verify = 1;
return 0;
}
static int h_no_client_verify(int argc, unsigned char **argv){
int h_no_client_verify(int argc, unsigned char **argv){
client_verify = 0;
return 0;
}
static int h_server_verify(int argc, unsigned char **argv){
int h_server_verify(int argc, unsigned char **argv){
server_verify = 1;
return 0;
}
static int h_client_mode(int argc, unsigned char **argv){
int h_client_mode(int argc, unsigned char **argv){
client_mode = 0;
if(argc <= 1) return 0;
client_mode = atoi((char *)argv[1]);
@ -1139,51 +1139,11 @@ static int h_client_mode(int argc, unsigned char **argv){
}
static int h_no_server_verify(int argc, unsigned char **argv){
int h_no_server_verify(int argc, unsigned char **argv){
server_verify = 0;
return 0;
}
static struct commands ssl_commandhandlers[] = {
{ssl_commandhandlers+1, "ssl_mitm", h_mitm, 1, 1},
{ssl_commandhandlers+2, "ssl_nomitm", h_nomitm, 1, 1},
{ssl_commandhandlers+3, "ssl_serv", h_serv, 1, 1},
{ssl_commandhandlers+4, "ssl_noserv", h_noserv, 1, 1},
{ssl_commandhandlers+5, "ssl_server_cert", h_srvcert, 1, 2},
{ssl_commandhandlers+6, "ssl_server_key", h_srvkey, 1, 2},
{ssl_commandhandlers+7, "ssl_server_ca_file", h_server_ca_file, 1, 2},
{ssl_commandhandlers+8, "ssl_server_ca_key", h_server_ca_key, 1, 2},
{ssl_commandhandlers+9, "ssl_client_ca_file", h_client_ca_file, 1, 2},
{ssl_commandhandlers+10, "ssl_client_ca_dir", h_client_ca_dir, 1, 2},
{ssl_commandhandlers+11, "ssl_client_ca_store", h_client_ca_store, 1, 2},
{ssl_commandhandlers+12, "ssl_client_ciphersuites", h_client_ciphersuites, 1, 2},
{ssl_commandhandlers+13, "ssl_server_ciphersuites", h_server_ciphersuites, 1, 2},
{ssl_commandhandlers+14, "ssl_client_cipher_list", h_client_cipher_list, 1, 2},
{ssl_commandhandlers+15, "ssl_server_cipher_list", h_server_cipher_list, 1, 2},
{ssl_commandhandlers+16, "ssl_client_min_proto_version", h_client_min_proto_version, 1, 2},
{ssl_commandhandlers+17, "ssl_server_min_proto_version", h_server_min_proto_version, 1, 2},
{ssl_commandhandlers+18, "ssl_client_max_proto_version", h_client_max_proto_version, 1, 2},
{ssl_commandhandlers+19, "ssl_server_max_proto_version", h_server_max_proto_version, 1, 2},
{ssl_commandhandlers+20, "ssl_client_verify", h_client_verify, 1, 1},
{ssl_commandhandlers+21, "ssl_client_no_verify", h_no_client_verify, 1, 1},
{ssl_commandhandlers+22, "ssl_cli", h_cli, 1, 1},
{ssl_commandhandlers+23, "ssl_nocli", h_nocli, 1, 1},
{ssl_commandhandlers+24, "ssl_client_cert", h_clicert, 1, 2},
{ssl_commandhandlers+25, "ssl_client_key", h_clikey, 1, 2},
{ssl_commandhandlers+26, "ssl_server", h_serv, 1, 1},
{ssl_commandhandlers+27, "ssl_noserver", h_noserv, 1, 1},
{ssl_commandhandlers+28, "ssl_client", h_cli, 1, 1},
{ssl_commandhandlers+29, "ssl_noclient", h_nocli, 1, 1},
{ssl_commandhandlers+30, "ssl_server_verify", h_server_verify, 1, 1},
{ssl_commandhandlers+31, "ssl_server_no_verify", h_no_server_verify, 1, 1},
{ssl_commandhandlers+32, "ssl_server_ca_dir", h_server_ca_dir, 1, 2},
{ssl_commandhandlers+33, "ssl_server_ca_store", h_server_ca_store, 1, 2},
{ssl_commandhandlers+34, "ssl_client_sni", h_client_sni, 1, 2},
{ssl_commandhandlers+35, "ssl_client_alpn", h_client_alpn, 1, 0},
{ssl_commandhandlers+36, "ssl_client_mode", h_client_mode, 1, 2},
{NULL, "ssl_certcache", h_certcache, 2, 2},
};
static struct symbol ssl_symbols[] = {
{NULL, "ssl_parent", (void *)&ssl_parent},
};
@ -1241,8 +1201,6 @@ void ssl_install(void){
if(!ssl_loaded){
ssl_loaded = 1;
ssl_init();
ssl_commandhandlers[(sizeof(ssl_commandhandlers)/sizeof(struct commands))-1].next = pl->commandhandlers->next;
pl->commandhandlers->next = ssl_commandhandlers;
ssl_symbols[0].next = pl->symbols.next;
pl->symbols.next = ssl_symbols;
}