Compare commits

..
9 Commits
Author SHA1 Message Date
yrutschle 3315a727dc update required conf2struct version 2020-07-19 21:05:36 +02:00
yrutschle 8638199f13 test for command line parameters 2020-07-19 18:32:57 +02:00
yrutschle d7cf82424b add --anyprot command line option (fix #272) 2020-07-18 17:27:32 +02:00
yrutschle ac8563525e fix Changelog for -v 2020-07-18 17:25:39 +02:00
yrutschle 2f983625d0 documentation update 2020-07-18 16:54:23 +02:00
yrutschle f6b11a424b reset config file option to --config 2020-07-17 21:58:23 +02:00
yrutschle cf46cd5bb4 Merge pull request #271 from bket/config_init
Always initialize config_t structure, fixes #270
2020-07-15 21:15:49 +02:00
Björn Ketelaars b473622698 Always initialize config_t structure, fixes #270
Without this change the config_t structure is ONLY initialized when it
meets a specific criterion. If this criterion is not met the config_t
structure is still used, which can cause a segmentation fault.

Fixes #270.
2020-07-14 06:57:43 +02:00
Yves Rutschle de8e5725c2 automatically sign release 2020-07-11 21:39:37 +02:00
9 changed files with 127 additions and 27 deletions

No files matched your search

+7 -2
View File
@@ -9,8 +9,10 @@ v1.21: 11JUL2020
regex)
Moved configuration and command-line management to
use conf2struct. Hopefully this should be transparent
to users.
use conf2struct. Changes are:
* command line option <-F|--config> no longer defaults to /etc/sslh.cfg, so you have to
specify it explicitly.
* command line option <-v|--verbose> takes a mandatory integer parameter
Update Let's Encrypt entry in example.cfg for tls-alpn-01
challenges; tls-sni-* challenges are now deprecated.
@@ -21,6 +23,9 @@ v1.21: 11JUL2020
Use syslog_facility: "none" to disable syslog
output.
Changed exit code for illegal command line parameter
from 1 to 6 (for testing purposes)
v1.20: 20NOV2018
Added support for socks5 protocol (Eugene Protozanov)
+1
View File
@@ -102,6 +102,7 @@ $(MAN): sslh.pod Makefile
# configuration
release:
git archive master --prefix="sslh-$(VERSION)/" | gzip > /tmp/sslh-$(VERSION).tar.gz
gpg --detach-sign --armor /tmp/sslh-$(VERSION).tar.gz
# generic install: install binary and man page
install: sslh $(MAN)
+1 -1
View File
@@ -42,7 +42,7 @@ For Fedora, you'll need packages `libconfig` and
If you want to rebuild `sslh-conf.c` (after a `make
distclean` for example), you will also need to add
[conf2struct](https://www.rutschle.net/tech/conf2struct/README.html)
(v1.1) to your path.
(v1.3) to your path.
Compilation
-----------
+53 -17
View File
@@ -1,5 +1,5 @@
/* Generated by conf2struct (https://www.rutschle.net/tech/conf2struct/README)
* on Fri Jun 19 23:36:04 2020.
* on Sun Jul 19 16:59:51 2020.
# conf2struct: generate libconf parsers that read to structs
# Copyright (C) 2018-2019 Yves Rutschle
@@ -91,7 +91,9 @@ typedef union {
} any_val;
/* Copy an any_val to arbitrary memory location */
static void any_valcpy(config_type type, void* target, any_val val)
/* 0: success
* <0: error */
static int any_valcpy(config_type type, void* target, any_val val)
{
switch(type) {
case CFG_BOOL:
@@ -116,14 +118,17 @@ static void any_valcpy(config_type type, void* target, any_val val)
default:
fprintf(stderr, "Unknown type specification %d\n", type);
exit(1);
return -1;
}
return 1;
}
/* Copy the value of a setting to an arbitrary memory that
* must be large enough */
static void settingcpy(config_type type, void* target, const config_setting_t* setting)
/* 0: success
* <0: error */
static int settingcpy(config_type type, void* target, const config_setting_t* setting)
{
any_val val;
char* str;
@@ -157,13 +162,16 @@ static void settingcpy(config_type type, void* target, const config_setting_t* s
default:
fprintf(stderr, "Unknown type specification %d\n", type);
exit(1);
return -1;
}
return 0;
}
/* Copy the value of a command line arg to arbitrary memory
* that must be large enough for the type */
static void clcpy(config_type type, void* target, const void* cl_arg)
/* 0: success
* <0: error */
static int clcpy(config_type type, void* target, const void* cl_arg)
{
any_val val;
char* str;
@@ -197,14 +205,17 @@ static void clcpy(config_type type, void* target, const void* cl_arg)
default:
fprintf(stderr, "Unknown type specification %d\n", type);
exit(1);
return -1;
}
return 0;
}
/* Copy the value of a string argument to arbitary memory
* location that must be large enough, converting on the way
* (i.e. CFG_INT gets atoi() and so on) */
static void stringcpy(config_type type, void* target, char* from)
/* 0: success
* <0: error */
static int stringcpy(config_type type, void* target, char* from)
{
any_val val;
@@ -236,8 +247,9 @@ static void stringcpy(config_type type, void* target, char* from)
default:
fprintf(stderr, "Unknown type specification %d\n", type);
exit(1);
return -1;
}
return 0;
}
@@ -312,6 +324,7 @@ struct arg_file* sslhcfg_conffile;
struct arg_str* sslhcfg_http;
struct arg_str* sslhcfg_adb;
struct arg_str* sslhcfg_socks5;
struct arg_str* sslhcfg_anyprot;
struct arg_end* sslhcfg_end;
@@ -777,6 +790,14 @@ static struct config_desc table_sslhcfg[] = {
},
{ 0 }
};
static struct compound_cl_target sslhcfg_anyprot_targets [] = {
{ & table_sslhcfg_protocols[0], 0, .value.def_string = "anyprot" },
{ & table_sslhcfg_protocols[1], 1, .value.def_string = "0" },
{ & table_sslhcfg_protocols[2], 2, .value.def_string = "0" },
{ & table_sslhcfg_protocols[6], 0, .value.def_int = 1 },
{ 0 }
};
static struct compound_cl_target sslhcfg_socks5_targets [] = {
{ & table_sslhcfg_protocols[0], 0, .value.def_string = "socks5" },
{ & table_sslhcfg_protocols[1], 1, .value.def_string = "0" },
@@ -961,6 +982,18 @@ static struct compound_cl_arg compound_cl_args[] = {
.override_const = "socks5",
},
{ /* arg: anyprot */
.regex = "(.+):(\\w+)",
.arg_cl = & sslhcfg_anyprot,
.base_entry = & table_sslhcfg [12],
.targets = sslhcfg_anyprot_targets,
.override_desc = & table_sslhcfg_protocols [0],
.override_matchindex = 0,
.override_const = "anyprot",
},
{ 0 }
};
@@ -1432,7 +1465,6 @@ static int read_compounds(config_setting_t* cfg,
static int c2s_parse_file(const char* filename, config_t* c, char**errmsg)
{
/* Read config file */
config_init(c);
if (config_read_file(c, filename) == CONFIG_FALSE) {
if (config_error_line(c) != 0) {
asprintf(errmsg, "%s:%d:%s",
@@ -1447,6 +1479,8 @@ static int c2s_parse_file(const char* filename, config_t* c, char**errmsg)
return 1;
}
/* 0: success
<0: error */
int sslhcfg_cl_parse(int argc, char* argv[], struct sslhcfg_item* cfg)
{
int nerrors, res;
@@ -1454,7 +1488,7 @@ int sslhcfg_cl_parse(int argc, char* argv[], struct sslhcfg_item* cfg)
char* errmsg;
config_setting_t* s;
void* argtable[] = {
sslhcfg_conffile = arg_filen("F", "conffile", "<file>", 0, 1, "Specify configuration file"),
sslhcfg_conffile = arg_filen("F", "config", "<file>", 0, 1, "Specify configuration file"),
sslhcfg_verbose = arg_intn("v", "verbose", "<n>", 0, 1, ""),
sslhcfg_foreground = arg_litn("f", "foreground", 0, 1, "Run in foreground instead of as a daemon"),
sslhcfg_inetd = arg_litn("i", "inetd", 0, 1, "Run in inetd mode: use stdin/stdout instead of network listen"),
@@ -1475,6 +1509,7 @@ int sslhcfg_cl_parse(int argc, char* argv[], struct sslhcfg_item* cfg)
sslhcfg_http = arg_strn(NULL, "http", "<host:port>", 0, 10, "Set up HTTP (plain) target"),
sslhcfg_adb = arg_strn(NULL, "adb", "<host:port>", 0, 10, "Set up ADB (Android Debug) target"),
sslhcfg_socks5 = arg_strn(NULL, "socks5", "<host:port>", 0, 10, "Set up socks5 target"),
sslhcfg_anyprot = arg_strn(NULL, "anyprot", "<host:port>", 0, 10, "Set up default target"),
sslhcfg_end = arg_end(10)
};
@@ -1483,16 +1518,17 @@ int sslhcfg_cl_parse(int argc, char* argv[], struct sslhcfg_item* cfg)
nerrors = arg_parse(argc, argv, argtable);
if (nerrors) {
arg_print_errors(stdout, sslhcfg_end, "sslhcfg");
arg_print_syntax(stdout, argtable, "\\n");
arg_print_syntax(stdout, argtable, "\n");
arg_print_glossary(stdout, argtable, " %-25s\t%s\n");
return 0;
return -1;
}
config_init(&c);
if (sslhcfg_conffile->count) {
if (!c2s_parse_file(sslhcfg_conffile->filename[0], &c, &errmsg)) {
fprintf(stderr, "%s\n", errmsg);
exit(1);
return -1;
}
}
@@ -1501,16 +1537,16 @@ int sslhcfg_cl_parse(int argc, char* argv[], struct sslhcfg_item* cfg)
res = read_block(s, cfg, table_sslhcfg, &errmsg);
if (!res) {
fprintf(stderr, "%s\n", errmsg);
return res;
return -1;
}
res = read_compounds(s, cfg, compound_cl_args, &errmsg);
if (!res) {
fprintf(stderr, "%s\n", errmsg);
return res;
return -1;
}
return res;
return 0;
}
+1 -1
View File
@@ -1,5 +1,5 @@
/* Generated by conf2struct (https://www.rutschle.net/tech/conf2struct/README)
* on Fri Jun 19 23:36:04 2020.
* on Sun Jul 19 16:59:51 2020.
# conf2struct: generate libconf parsers that read to structs
# Copyright (C) 2018-2019 Yves Rutschle
+1 -1
View File
@@ -266,7 +266,7 @@ int main(int argc, char *argv[], char* envp[])
memset(&cfg, 0, sizeof(cfg));
res = sslhcfg_cl_parse(argc, argv, &cfg);
if (!res) exit(1);
if (res) exit(6);
if (cfg.verbose > 3)
sslhcfg_fprint(stderr, &cfg, 0);
res = config_resolve_listen(&addr_listen);
-3
View File
@@ -84,9 +84,6 @@ Uses I<filename> as configuration file. If other
command-line options are specified, they will override the
configuration file's settings.
When using the shorthand version, make sure there should be
no space between B<-F> and the I<filename>.
=item B<-t> I<num>, B<--timeout> I<num>
Timeout before forwarding the connection to the timeout
+12 -1
View File
@@ -9,7 +9,7 @@ parser: "sslh-conf.c";
printer: true;
conffile_option: ("F", "conffile");
conffile_option: ("F", "config");
# List of includes to define runtime types
# (bug in libconfig? if swallows the brackets if they start
@@ -212,5 +212,16 @@ cl_groups: (
{ path: "port"; value: "$2" },
{ path: "log_level"; value: 1 }
);
},
{ name: "anyprot"; pattern: "(.+):(\w+)"; description: "Set up default target";
list: "protocols";
override: "name";
argdesc: "<host:port>";
targets: (
{ path: "name"; value: "anyprot" },
{ path: "host"; value: "$1" },
{ path: "port"; value: "$2" },
{ path: "log_level"; value: 1 }
);
}
)
+51 -1
View File
@@ -36,6 +36,7 @@ my $RB_PARAM_NOHOST = 1;
my $RB_WRONG_USERNAME = 1;
my $RB_OPEN_PID_FILE = 1;
my $RB_RESOLVE_ADDRESS = 1;
my $RB_CL_PARAMS = 1;
`lcov --directory . --zerocounters`;
@@ -343,7 +344,7 @@ if ($RB_PARAM_NOHOST) {
waitpid $sslh_pid, 0;
my $code = $? >> 8;
warn "exited with $code\n";
my_is($code, 1, "Exit status on illegal option");
my_is($code, 6, "Exit status on illegal option");
}
# Robustness: User does not exist
@@ -390,6 +391,55 @@ if ($RB_RESOLVE_ADDRESS) {
my_is($code, 4, "Exit status if can't resolve address");
}
# Robustness: verify all command line options work
if ($RB_CL_PARAMS) {
print "***Test: Command line parameters\n";
my $sslh_pid;
if (!($sslh_pid = fork)) {
my $user = (getpwuid $<)[0]; # Run under current username
# This doesn't test --inetd
exec "./sslh-select -v 3 -f -u $user -P $pidfile".
" -n --transparent --timeout 10 -C /tmp".
" --syslog-facility auth --on-timeout ssh".
" --listen localhost:$no_listen --ssh $ssh_address --tls $ssl_address".
" --openvpn localhost:$no_listen".
" --tinc localhost:$no_listen".
" --xmpp localhost:$no_listen".
" --http localhost:$no_listen".
" --adb localhost:$no_listen".
" --socks5 localhost:$no_listen".
" --anyprot localhost:$no_listen";
exit 0;
}
warn "spawned $sslh_pid\n";
# It will die soon because $user cannot chroot (you
# don't test as root, do you?)
waitpid $sslh_pid, 0;
my $code = $? >> 8;
warn "exited with $code\n";
my_is($code, 1, "Command line arguments");
print "***Test: Bad command line parameters\n";
my $sslh_pid;
if (!($sslh_pid = fork)) {
my $user = (getpwuid $<)[0]; # Run under current username
# This doesn't test --inetd
exec "./sslh-select -v 3 -f -u $user -P $pidfile".
" -n --transparent --timeout 10 -C /tmp".
" --fakeoption".
" --anyprot localhost:$no_listen";
exit 0;
}
warn "spawned $sslh_pid\n";
waitpid $sslh_pid, 0;
my $code = $? >> 8;
warn "exited with $code\n";
my_is($code, 6, "Bad command line parameters");
}
`lcov --directory . --capture --output-file sslh_cov.info`;
`genhtml sslh_cov.info`;