Guus Sliepen [Fri, 13 Aug 2021 19:13:09 +0000 (21:13 +0200)]
Avoid warnings from -fsanitize=integer in the hash functions.
Hash functions rely heavily on unsigned integer overflow behavior, but
the sanitizer complains about them. Instead of disabling the sanitizer
(which might prevent us from getting warnings from real errors), silence
it by explicitly upcasting values to 64-bit integers before applying
operations, then explicitly downcasting to 32-bit again. The compiler
will optimize this out.
Mathew Heard [Tue, 29 Jun 2021 01:27:24 +0000 (11:27 +1000)]
Subnet Cache hashtable improvements
- inline & staticly allocated hash table
- increased hashtable size (32bit: 1024, 64bit: 65536)
- re-arrange subnet members
- Add key type
- reduce clearing of hash table
- cleanup key pointer operations
- removed unused hash_search_or_insert
- add open addressing to hash table
- type specific hash functions & hash seeding
- no collisions for 32bit os
- implement cache flush by SUBNET_MAC
Kirill Isakov [Wed, 11 Aug 2021 14:56:21 +0000 (20:56 +0600)]
Use splay trees inside node_t directly.
Kirill Isakov [Wed, 11 Aug 2021 14:17:12 +0000 (20:17 +0600)]
Replace pointers to global splay trees with structs.
re #294
Kirill Isakov [Wed, 11 Aug 2021 04:31:11 +0000 (10:31 +0600)]
Make apt stop asking questions when building deb package.
Fufu Fang [Tue, 10 Aug 2021 00:53:00 +0000 (01:53 +0100)]
Reduce pointer indirection for global list_t variables
Converted cmdline_conf, connection_list, outgoing_list from
pointer-to-structs to structs.
Created list_empty_list for these structs. This is necessary,
because list_delete_list frees the supplied list_t pointer.
Part of https://github.com/gsliepen/tinc/issues/294
Fufu Fang [Mon, 9 Aug 2021 23:34:29 +0000 (00:34 +0100)]
Fix -Wsign-compare error in keys.c
Part of https://github.com/gsliepen/tinc/issues/288
Guus Sliepen [Tue, 10 Aug 2021 18:10:29 +0000 (20:10 +0200)]
Symlink README to README.md when running make dist.
Since Markdown is perfectly human readable, just create a symlink from
README to README.md when make dist wants it. Also add it to .gitignore.
Kirill Isakov [Tue, 10 Aug 2021 06:00:09 +0000 (12:00 +0600)]
Rename README to make software forges properly render Markdown.
Kirill Isakov [Sun, 8 Aug 2021 16:57:42 +0000 (22:57 +0600)]
CI: cross-compilation; build packages on every push.
Build tinc for two architectures frequently seen in cheap routers,
and run tests using qemu user virtualization.
Also build deb + rpm packages and a Windows installer on every push to
the main branch (currently it's 1.1), and publish them as a pre-release.
Fufu Fang [Sun, 8 Aug 2021 22:39:03 +0000 (23:39 +0100)]
Use libvdeplug.h instead of libvdeplug_dyn.h
Fix https://github.com/gsliepen/tinc/issues/300
The libvdeplug.h from Debian Unstable is almost identical to the
one from Debian Buster. My making this change, the task of linking
the libvdeplug library is passed to the system dynamic linker at
tincd start time, instead of doing it manually with
libvdeplug_dynopen when vde functionality is actually needed.
This fixes the compilation issue in Ubuntu 21.04 and Debian
Unstable.
Kirill Isakov [Sun, 1 Aug 2021 18:47:40 +0000 (00:47 +0600)]
Improve invite-join.test reliability on Alpine Linux.
Kirill Isakov [Mon, 2 Aug 2021 09:55:05 +0000 (15:55 +0600)]
Assign more suitable types and fix narrowing conversion warns.
Kirill Isakov [Mon, 2 Aug 2021 07:30:16 +0000 (13:30 +0600)]
GitHub CI: check project for warnings with clang/gcc.
Kirill Isakov [Sat, 31 Jul 2021 16:47:26 +0000 (22:47 +0600)]
CI (GitHub & sourcehut): add clang-tidy checks.
Kirill Isakov [Fri, 30 Jul 2021 18:41:47 +0000 (00:41 +0600)]
Un-ignore .clang-tidy and enable conversion warnings.
... except for cryptographic functions, best leave that to the experts
that have written them. They produce a lot of warnings, so place a
couple of dummy .clang-tidy files there to ignore everything.
Kirill Isakov [Fri, 30 Jul 2021 10:46:00 +0000 (16:46 +0600)]
Support running tests on NetBSD 8.2.
Kirill Isakov [Fri, 30 Jul 2021 05:53:37 +0000 (11:53 +0600)]
Remove unused argument from tunemu_write.
Kirill Isakov [Thu, 29 Jul 2021 17:36:43 +0000 (23:36 +0600)]
Remove unused function rsa_active.
Kirill Isakov [Thu, 29 Jul 2021 17:28:16 +0000 (23:28 +0600)]
Remove unused types.
Kirill Isakov [Thu, 29 Jul 2021 17:26:09 +0000 (23:26 +0600)]
Remove unused declarations.
Kirill Isakov [Thu, 29 Jul 2021 17:18:32 +0000 (23:18 +0600)]
Remove unused struct fields.
Kirill Isakov [Thu, 29 Jul 2021 17:14:12 +0000 (23:14 +0600)]
Remove unused global variables.
Kirill Isakov [Thu, 29 Jul 2021 17:02:09 +0000 (23:02 +0600)]
Remove unused '#include's.
Kirill Isakov [Thu, 29 Jul 2021 14:45:42 +0000 (20:45 +0600)]
Add tests for the fsck command.
Also, allow running tests as non-root and elevate as necessary. This
requires passwordless sudo and the CI envvar set to any non-empty value.
Kirill Isakov [Sun, 25 Jul 2021 07:23:27 +0000 (13:23 +0600)]
Cleanup and improve `tinc fsck`.
- implement TODOs
- fix an invalid warning:
WARNING: public and private RSA keys do not match
- use the same configuration reading & parsing logic as in tincd
- read keys from all supported variables
- auto fix a few more broken key configurations
- fix a couple of rare memory leaks
- add warnings for host variables in server config and vice versa
- check duplicates for all configuration variables (not the first 50)
- check_conffile had a stack-buffer-underflow with going before the start of the line
Kirill Isakov [Tue, 27 Jul 2021 16:01:25 +0000 (22:01 +0600)]
Allow using key & configuration parser from tincd in tinc.
Kirill Isakov [Mon, 26 Jul 2021 08:52:42 +0000 (14:52 +0600)]
GitHub CI: run most tests as a non-privileged user.
We don't really care about the throwaway container running in a throwaway
VM, but it's still better to run tests that do not require elevated
privileges as a normal user, at least to be sure that the ability to do
this is working.
Also, some tests (like the new command-fsck.test) can perform more checks
with a restricted user account.
Guus Sliepen [Wed, 28 Jul 2021 10:09:37 +0000 (12:09 +0200)]
Add timeouts to CI jobs.
Guus Sliepen [Tue, 27 Jul 2021 12:57:18 +0000 (14:57 +0200)]
Really avoid trying to send an ANS_KEY request to unreachable nodes.
Commit
ed070d754d1b5500b0ec3615ae342178cfd42efb only printed a warning,
but was missing a return statement.
Guus Sliepen [Tue, 27 Jul 2021 10:21:07 +0000 (12:21 +0200)]
Use inet_pton() to parse Subnets.
Nowadays all operating systems tinc runs on should support IPv6, so we
can rely on inet_pton() and inet_ntop() to convert IPv4 and IPv6
addresses. Use this instead of our own parsing code.
Guus Sliepen [Mon, 26 Jul 2021 14:03:44 +0000 (16:03 +0200)]
Fix ASAN warning.
The commit fixing the stack overflow for malformed Subnets could compare
against a NULL pointer, which works fine in practice but is undefined
behavior.
Guus Sliepen [Mon, 26 Jul 2021 13:46:48 +0000 (15:46 +0200)]
Fix `tinc get Subnet` failing.
Guus Sliepen [Mon, 26 Jul 2021 13:06:06 +0000 (15:06 +0200)]
Let the CLI prevent adding incorrect Subnets.
We did a sanitiy check when trying to add a Subnet, but we only printed
an error message, we still added the incorrect Subnet. This change
ensures we abort with a non-zero exit code.
Guus Sliepen [Mon, 26 Jul 2021 13:01:12 +0000 (15:01 +0200)]
Avoid a stack overflow when presented with a malformed IPv6 Subnet.
Found by Kirill Isakov using AFL and AddressSanitizer.
Guus Sliepen [Sun, 25 Jul 2021 17:09:47 +0000 (19:09 +0200)]
Ensure we delete removed BroadcastSubnets when reloading configuration.
Kirill Isakov [Sun, 25 Jul 2021 14:55:00 +0000 (20:55 +0600)]
GitHub CI: fail sanitizer job if any logs were created.
Kirill Isakov [Sun, 25 Jul 2021 11:15:24 +0000 (17:15 +0600)]
Fix more memory leaks found by ASAN.
Kirill Isakov [Sat, 24 Jul 2021 06:15:59 +0000 (12:15 +0600)]
Fix use-after-free in final log message on tincd exit.
Steps to reproduce:
0. build tincd with -fsanitize=address
1. start tincd:
./src/tincd -c . -D
2. capture log output in one tinc client
./src/tinc -c . log
3. this is optional, but seems to flush the bug more often: open another
tinc client and issue the purge/retry commands:
./src/tinc -c .
tinc> purge
tinc> retry
4. stop tincd (using Ctrl+C or the stop command)
Repeat until it fails with a bunch of error messages as below.
------------
==
1715850==ERROR: AddressSanitizer: heap-use-after-free on address 0x60300001d950 at pc 0x55a3fdba1fa5 bp 0x7fffbd250470 sp 0x7fffbd250468
READ of size 8 at 0x60300001d950 thread T0
0 0x55a3fdba1fa4 in real_logger tinc/src/logger.c:101:7
1 0x55a3fdba188b in logger tinc/src/logger.c:140:2
2 0x55a3fdc90c22 in main tinc/src/tincd.c:625:2
3 0x7f826a3eab24 in __libc_start_main (/usr/lib/libc.so.6+0x27b24)
4 0x55a3fda9087d in _start (tinc/src/tincd+0xd487d)
0x60300001d950 is located 0 bytes inside of 32-byte region [0x60300001d950,0x60300001d970)
freed by thread T0 here:
0 0x55a3fdb377c9 in free (tinc/src/tincd+0x17b7c9)
1 0x55a3fdb9e1b4 in list_free tinc/src/list.c:36:2
2 0x55a3fdba0ed3 in list_delete_list tinc/src/list.c:192:2
3 0x55a3fdb8385f in exit_connections tinc/src/connection.c:47:2
4 0x55a3fdbf0427 in close_network_connections tinc/src/net_setup.c:1386:2
5 0x55a3fdc90c0d in main tinc/src/tincd.c:623:2
6 0x7f826a3eab24 in __libc_start_main (/usr/lib/libc.so.6+0x27b24)
previously allocated by thread T0 here:
0 0x55a3fdb37c91 in calloc (tinc/src/tincd+0x17bc91)
1 0x55a3fdb9e157 in xzalloc tinc/src/./xalloc.h:37:12
2 0x55a3fdb9e065 in list_alloc tinc/src/list.c:29:17
3 0x55a3fdb82a43 in init_connections tinc/src/connection.c:40:20
4 0x55a3fdbea58c in setup_network tinc/src/net_setup.c:1304:2
5 0x55a3fdc90535 in main tinc/src/tincd.c:573:6
6 0x7f826a3eab24 in __libc_start_main (/usr/lib/libc.so.6+0x27b24)
Kirill Isakov [Fri, 23 Jul 2021 17:14:18 +0000 (23:14 +0600)]
More strict failure code checks in integration tests.
Kirill Isakov [Fri, 23 Jul 2021 16:37:49 +0000 (22:37 +0600)]
Fix all UBSAN warnings triggered by tests.
Kirill Isakov [Fri, 23 Jul 2021 12:46:24 +0000 (18:46 +0600)]
GitHub CI: enable AddressSanitizer.
Kirill Isakov [Fri, 23 Jul 2021 12:41:51 +0000 (18:41 +0600)]
Add tests to cover some of the fixed leaks.
Kirill Isakov [Fri, 23 Jul 2021 12:11:27 +0000 (18:11 +0600)]
Fix memory leaks triggered by integration tests.
Found by AddressSanitizer and Valgrind.
Guus Sliepen [Wed, 21 Jul 2021 10:35:09 +0000 (12:35 +0200)]
Fix a few memory leaks at exit time.
Found by Valgrind.
Guus Sliepen [Wed, 21 Jul 2021 10:15:59 +0000 (12:15 +0200)]
Avoid unhelpful warnings about UDP buffer sizes.
Don't log a warning if we never explicitly configured the
SO_RCVBUF/SO_SNDBUF sizes, and don't warn if the system allocates a
larger buffer than the one requested, as at least on Linux, it will
always double the requested size unless you hit the maximum. With this
change, we only warn when we explicitly request a buffer size and the
system allocated a smaller one.
Guus Sliepen [Wed, 21 Jul 2021 09:54:34 +0000 (11:54 +0200)]
Don't call OPENSSL_cleanup().
Some versions of LibreSSL don't have this function, even if they support
the rest of the OpenSSL 1.1 API. It also doesn't seem to affect the
output of Valgrind, so it looks like it's not necessary at all.
Guus Sliepen [Tue, 20 Jul 2021 22:04:08 +0000 (00:04 +0200)]
Call ENGINE_load_builtin_engines().
As suggested by Rosen Penev, use ENGINE_load_builtin_engines() to ensure
the AFALG engines get loaded as well. We apparently also don't need to
call OPENSSL_init_crypto() ourself.
Guus Sliepen [Tue, 20 Jul 2021 22:01:06 +0000 (00:01 +0200)]
CI: Fix installation of OpenSSL on CentOS and AlmaLinux.
Guus Sliepen [Tue, 20 Jul 2021 21:55:35 +0000 (23:55 +0200)]
CI: Install and use OpenSSL 1.1 on CentOS 7.
Guus Sliepen [Tue, 20 Jul 2021 20:55:56 +0000 (22:55 +0200)]
Install OpenSSL 1.1 in the CentOS 7 test environment.
Guus Sliepen [Tue, 20 Jul 2021 20:23:52 +0000 (22:23 +0200)]
Make tinc --batch --force join enable the tinc-up script.
The expected behavior of --batch --force is that all parameters in the
invitation are accepted, whether unsafe or not. Unsafe variables were
already accepted with --force in commit
061362d2f, this commit ensures
the generated tinc-up script is enabled as well.
Fixes #196 on GitHub.
Guus Sliepen [Tue, 20 Jul 2021 20:10:56 +0000 (22:10 +0200)]
Require OpenSSL 1.1.0 or later.
This gets rid of some backwards compatibility code, and avoids calling
deprecated OpenSSL functions.
Fixes #244 on GitHub.
Guus Sliepen [Tue, 20 Jul 2021 19:14:23 +0000 (21:14 +0200)]
Avoid trying to send an ANS_KEY request to unreachable nodes.
We could have a REQ_KEY coming from a node that is not reachable; either
because DEL_EDGEs have overtaken the REQ_KEY, or perhaps if TunnelServer
is used and some nodes have a different view of reachability.
This might fix GitHub issue #247.
Guus Sliepen [Tue, 20 Jul 2021 18:31:49 +0000 (20:31 +0200)]
Slightly better RNG seed for tincctl.
This prevents the Port from being the same when initializing multiple
instances of tinc in a short timespan.
Kirill Isakov [Tue, 20 Jul 2021 12:00:49 +0000 (18:00 +0600)]
Add compression.test
Kirill Isakov [Tue, 20 Jul 2021 12:00:05 +0000 (18:00 +0600)]
Add cleanup hook for integration tests
Kirill Isakov [Tue, 20 Jul 2021 08:49:46 +0000 (14:49 +0600)]
List supported features in tinc/tincd --version
Kirill Isakov [Tue, 20 Jul 2021 07:29:31 +0000 (13:29 +0600)]
LZ4: try system library first, fallback to builtin
Darik Horn [Tue, 20 Jul 2021 04:29:39 +0000 (10:29 +0600)]
Add LZ4 compression support
Kirill Isakov [Sat, 17 Jul 2021 16:50:10 +0000 (22:50 +0600)]
Vendor LZ4 source
Kirill Isakov [Tue, 20 Jul 2021 07:23:54 +0000 (13:23 +0600)]
.gitignore temporary files (configure~, etc)
Kirill Isakov [Tue, 20 Jul 2021 15:21:13 +0000 (21:21 +0600)]
sr.ht CI: add liblz4
Needed for testing LZ4 compression support when using the system
library.
Kirill Isakov [Mon, 19 Jul 2021 19:03:06 +0000 (01:03 +0600)]
Some cleanups in GitHub Actions CI
- run tests on more Linux distributions
- add test runs with clang sanitizers (TSAN / UBSAN for now)
- check code formatting only once
- check test scripts formatting (shfmt)
- static analysis for test scripts (shellcheck)
- save more test logs and other debug info
- add missing pieces to Ubuntu packages
- test .debs on clean machine before publishing
- git clone full history for changelog generation
- support old versions of git on Linux
- rename some steps
Kirill Isakov [Sat, 3 Jul 2021 15:22:39 +0000 (21:22 +0600)]
test/splice.c: reformat with astyle
Guus Sliepen [Tue, 20 Jul 2021 13:57:37 +0000 (15:57 +0200)]
Check that UNIX socket filenames are not too long.
UNIX socket filenames must fit in a struct sockaddr_un, and typically this
only has about 100 bytes of storage. This is perfectly fine for normal use
of tinc, but this caused failures when running make distcheck, which ends
up creating a rather deep directory structure. With this commit, at least
a proper error message is printed instead of silently truncating the
filename.
Guus Sliepen [Tue, 20 Jul 2021 12:15:41 +0000 (14:15 +0200)]
Fix running the test suite in out-of-tree builds.
Kirill Isakov [Mon, 19 Jul 2021 08:32:13 +0000 (14:32 +0600)]
Rewrite the test suite for better compat and stability
Keeps all of the previous checks, but uses tinc scripts
instead of sleep(1) delays.
Improves and/or adds compatibility with:
- Windows (Msys2);
- FreeBSD;
- NetBSD;
- OpenBSD.
Kirill Isakov [Sat, 17 Jul 2021 12:17:11 +0000 (18:17 +0600)]
Allow running sptps_test on Windows
On Windows, you're not supposed to call select() on anything except
proper BSD sockets, so we can't reuse the same select() loop that's been
working fine on every other operating system.
This is a hack which reads stdin in a separate thread and pushes data to
the main through a TCP socket, which can then be used with select() instead
of reading stdin directly.
Mathew Heard [Tue, 29 Jun 2021 00:24:00 +0000 (10:24 +1000)]
Bail out of logging early.
Low hanging fruit, 2% of perf trace.
Mathew Heard [Mon, 12 Jul 2021 01:39:31 +0000 (11:39 +1000)]
ci: run for all branches
(cherry picked from commit
5666f0d99e3698bf4b50d243151cb1a445bb81ea)
Kirill Isakov [Mon, 12 Jul 2021 10:48:58 +0000 (16:48 +0600)]
src/getopt.h: add missing header guard
(cherry picked from commit
c97370e5714389ef44cd5682c0916fcc8daddeff)
Mathew Heard [Mon, 12 Jul 2021 02:53:45 +0000 (12:53 +1000)]
Fix overrun in prf() if hmac size not divisible into key size
Not seen only due to chacha having a 64byte key and a 64byte HMAC (SHA512) being used
Kirill Isakov [Sat, 10 Jul 2021 15:11:27 +0000 (21:11 +0600)]
CI: add support for FreeBSD/NetBSD/OpenBSD through sourcehut
Kirill Isakov [Sat, 10 Jul 2021 11:13:34 +0000 (17:13 +0600)]
src/tincctl.c: inverse exit code for 'tinc stop' on Windows
On Windows, the `tinc stop` command returned 1 on success and 0 on
failure, which is the opposite of what happens everywhere else.
Kirill Isakov [Mon, 5 Jul 2021 04:37:04 +0000 (10:37 +0600)]
invitation.c: fix socket error checking on Windows
Guus Sliepen [Fri, 2 Jul 2021 14:55:52 +0000 (16:55 +0200)]
Update THANKS.
Guus Sliepen [Fri, 2 Jul 2021 14:55:43 +0000 (16:55 +0200)]
Add a SECURITY.md file describing our security policy.
Kirill Isakov [Fri, 2 Jul 2021 13:38:07 +0000 (19:38 +0600)]
Run tests on pushes and pull requests
Kirill Isakov [Thu, 1 Jul 2021 18:10:02 +0000 (00:10 +0600)]
test/legacy-protocol.test: fix intermittent "Cannot read greeting from control socket"
Kirill Isakov [Thu, 1 Jul 2021 13:35:08 +0000 (19:35 +0600)]
Allow running tests on macOS
Niklas Hambüchen [Sun, 12 Apr 2020 18:21:02 +0000 (20:21 +0200)]
Warn if system capped requested socket buffer sizes.
Mathew Heard [Tue, 29 Jun 2021 05:03:50 +0000 (15:03 +1000)]
Fail early in send_udp_probe_packet().
Mathew Heard [Tue, 29 Jun 2021 04:55:14 +0000 (14:55 +1000)]
Check interval bounds for UDP probe size.
Mathew Heard [Tue, 29 Jun 2021 04:48:04 +0000 (14:48 +1000)]
Ensure send_udp_probe_packet len is valid for the buffer size.
Mathew Heard [Tue, 29 Jun 2021 00:49:01 +0000 (10:49 +1000)]
perform cheap checks first
minor optimization
Guus Sliepen [Sun, 27 Jun 2021 17:29:16 +0000 (19:29 +0200)]
Releasing 1.1pre18.
Guus Sliepen [Sun, 27 Jun 2021 17:16:53 +0000 (19:16 +0200)]
Update THANKS.
Guus Sliepen [Sun, 27 Jun 2021 15:23:30 +0000 (17:23 +0200)]
Update copyright notices.
Guus Sliepen [Sun, 27 Jun 2021 15:12:06 +0000 (17:12 +0200)]
Fix usage of @code and @samp commands.
Guus Sliepen [Sun, 27 Jun 2021 14:52:03 +0000 (16:52 +0200)]
Fix spelling errors.
Found by codespell.
pacien [Tue, 8 Sep 2020 23:24:28 +0000 (01:24 +0200)]
tincctl: restrict umask argument for FORTIFY
`umask(mode)` calls that do not verify `(mode & 0777) == mode` are
rejected when the libc FORTIFY checks are enabled [1].
The unrestricted `~perms` was indeed making this assertion fail.
[1]: https://android.googlesource.com/platform/bionic/+/refs/tags/android-11.0.0_r3/libc/bionic/fortify.cpp#404
Guus Sliepen [Sun, 27 Jun 2021 14:19:37 +0000 (16:19 +0200)]
Don't try to forward packets to a node we don't have a key for.
If we got a packet that's meant to be relayed, don't call
sptps_send_data() if we don't have a valid key yet for the desination
node, but do keep trying to get a working connection to that node. Based
on a patch from thorkill.
Guus Sliepen [Sun, 27 Jun 2021 14:06:58 +0000 (16:06 +0200)]
Fix for the event loop on Windows.
The code did not take into account that the return value of
WSAWaitForMultipleEvents() is the offset into the event array plus
WSA_WAIT_EVENT_0.
Based on a patch from arsh0r.
Guus Sliepen [Sun, 27 Jun 2021 14:01:52 +0000 (16:01 +0200)]
Log errors when add_edge() fails to insert into the edge trees.
This should never happen, but if it does we want to have it at least
logged instead of causing issues later on.
Based on a patch from arsh0r.
Guus Sliepen [Sun, 27 Jun 2021 13:36:44 +0000 (15:36 +0200)]
Fix the check for sys/un.h.
Guus Sliepen [Sun, 27 Jun 2021 13:31:49 +0000 (15:31 +0200)]
Don't compile support for Device=fd on platforms that do not support UNIX sockets.
Guus Sliepen [Sun, 27 Jun 2021 13:02:13 +0000 (15:02 +0200)]
Fix compiler warnings.
Guus Sliepen [Sun, 27 Jun 2021 12:55:23 +0000 (14:55 +0200)]
Fix warnings from autoconf.
Bump the minimum required version of autoconf to 2.69, and avoid using
macros it warns are obsolete.
Guus Sliepen [Tue, 22 Jun 2021 20:36:13 +0000 (22:36 +0200)]
Fix warnings from GCC about VLAs.