TapTap
bd43448af2
fix(daemon): bound per-source table lifetime and recompute occupancy
...
The per-source host table only grew: once its fixed open-addressed table
filled, host_intern returned -1 and the per-host cap plus the shared auth
lockout silently failed open forever. Add a bounded-lifetime eviction
policy: track a per-bucket last-use time and, when no empty bucket exists,
atomically repurpose the first bucket that has no active connection and
either has an expired lockout or has been idle, resetting its counters.
Warn (rate-limited) on the genuine fail-open path.
A child SIGKILLed mid-registration could also leak a module/host count
because the parent only decremented on a REGISTERED slot. Make the slot
table the source of truth: after the SIGCHLD reap the parent recomputes
module_active[]/host_active[] from the surviving REGISTERED slots (atomics
only, async-signal-safe) so any leaked increment is erased.
Also clamp module_count to DAEMON_LIMITS_MAX_MODULES and use one helper
for the sizing/register host-tracking condition (a lockout threshold with
duration 0 is a no-op and must not intern hosts).
2026-09-13 10:50:53 +02:00
TapTap
e1f8f75e7c
docs: document daemon per-module/per-host caps and shared auth lockout
2026-09-13 10:24:09 +02:00
TapTap
4c17122b00
feat(daemon): enforce per-module/per-host caps and shared auth lockout
...
Wire the shared registry into the accept loop (parent claims a slot before
fork, blocks SIGCHLD across fork+pid publication, and reclaims the dead
child's slot from the SIGCHLD handler so per-module/per-source counts are
released even on SIGKILL). The connection child records the selected module
and normalized peer IP once the config frame names them: an over-cap module
or source is refused at the config gate with an audit log, and a source
that exceeded the auth-failure threshold is refused before a SCRAM
challenge (the counter is shared across children and cleared on success).
The existing global cap and host ACLs are untouched.
2026-09-13 10:24:05 +02:00
TapTap
0abaa62193
feat(daemon): parse per-host cap and auth lockout config keys
...
Add global keys `max connections per host` (default 0 = unlimited),
`auth lockout threshold` (default 10, 0 disables) and
`auth lockout duration` (default 300 s, 0 disables). Module
`max connections` now accepts 0 as unlimited. Bound the number of
[module] sections (DAEMON_CONF_MAX_MODULES) so the shared registry's
per-module counter array stays fixed-size; absent keys keep their
defaults so old configs still load.
2026-09-13 10:24:01 +02:00
TapTap
5334397b81
feat(daemon): add shared cross-process connection registry
...
The daemon forks one child per accepted connection, so per-module and
per-source accounting must live in state shared across the children. Add a
fixed-size registry carved from an anonymous shared mapping
(mmap(MAP_SHARED|MAP_ANONYMOUS)) created before the accept loop: a slot
lifecycle (FREE/CLAIMED/REGISTERED) with parent claim/reclaim and a
lock-free, open-addressed per-source table for the per-host occupancy and
the shared auth-failure counter. C11 atomics only; no pthread locks across
fork.
Unit tests cover slot exhaustion, the module/host caps, pid reclaim and
fork-shared visibility.
2026-09-13 10:23:58 +02:00
TapTap
9242e86772
Merge Wave 7: fix shared/server layering and explicit CMake targets
CI / lint (push) Successful in 1m30s
CI / sanitizers (undefined) (push) Successful in 56s
CI / sanitizers (address) (push) Successful in 1m3s
CI / fuzz-build (push) Successful in 34s
CI / coverage (push) Successful in 52s
CI / valgrind (push) Successful in 3m14s
CI / build-and-test (push) Successful in 5m33s
2026-09-13 07:30:33 +02:00
TapTap
0155902d95
docs: update stale PipelineContextReceiver reference
2026-09-13 07:30:28 +02:00
TapTap
3499baf80b
build: explicit CMake targets; move receiver pipeline out of shared
2026-09-13 07:20:28 +02:00
TapTap
83eacf3151
Merge Wave 6: client features (--port, --threads=N, abort, keepalive) and test coverage
CI / lint (push) Successful in 1m30s
CI / sanitizers (undefined) (push) Successful in 1m4s
CI / sanitizers (address) (push) Successful in 1m9s
CI / fuzz-build (push) Successful in 36s
CI / coverage (push) Successful in 51s
CI / valgrind (push) Successful in 3m14s
CI / build-and-test (push) Successful in 5m37s
2026-09-13 06:59:08 +02:00
TapTap
c2df0347ef
fix(client,protocol): EINTR-safe sends, armed abort, keepalive drain grace, TLS WANT_WRITE
2026-09-13 06:59:02 +02:00
TapTap
dd44537b44
Merge branch 'fix/w6-tests' into fix/w6-integration
2026-09-13 06:25:05 +02:00
TapTap
2854a9d149
test: fuzz manifest/protocol/xattr, hardlink unit, fault injection
2026-09-13 06:24:46 +02:00
TapTap
1fa2fbd266
feat(client): --port alias, --threads=N, graceful abort, keepalive
2026-09-13 06:22:28 +02:00
TapTap
10b18ab2d2
Merge Wave 5a: dead-code removal, scanner options embed, shared config invariants, bounded metadata API
CI / lint (push) Successful in 1m31s
CI / sanitizers (undefined) (push) Successful in 1m0s
CI / sanitizers (address) (push) Successful in 1m7s
CI / fuzz-build (push) Successful in 30s
CI / coverage (push) Successful in 51s
CI / valgrind (push) Successful in 3m12s
CI / build-and-test (push) Successful in 5m32s
2026-09-13 05:48:32 +02:00
TapTap
dcc78c14c5
docs,fuzz: fix ownership/alloc comments; fuzz chunk metadata path
2026-09-13 05:48:27 +02:00
TapTap
5a829adb85
Merge branch 'fix/w5-scanner' into fix/w5-integration
2026-09-13 05:28:50 +02:00
TapTap
42c72030fb
Merge branch 'fix/w5-config' into fix/w5-integration
2026-09-13 05:28:50 +02:00
TapTap
99f8045105
refactor(scanner,send): embed scanner options; unify stats and config ownership
2026-09-13 05:28:32 +02:00
TapTap
eea66a7848
refactor(config,metadata): shared invariants; length-bounded metadata parser
2026-09-13 05:24:23 +02:00
TapTap
c944787e03
refactor: remove dead file_store subsystem and unused wrappers
2026-09-13 05:19:18 +02:00
TapTap
57ce6d04f0
Merge Wave 4: performance (packed metadata 2.20.0, indexed lookups, zstd reuse, byte-bounded queues)
CI / lint (push) Successful in 1m30s
CI / sanitizers (undefined) (push) Successful in 1m1s
CI / sanitizers (address) (push) Successful in 1m7s
CI / fuzz-build (push) Successful in 29s
CI / coverage (push) Successful in 50s
CI / valgrind (push) Successful in 3m12s
CI / build-and-test (push) Successful in 5m22s
2026-09-13 05:01:21 +02:00
TapTap
3cf2e2c91f
docs(version): align 2.20.0 artifacts; fix protocol-bump rationale
2026-09-13 05:01:15 +02:00
TapTap
301cb0dbaf
fix(utils,file-list): bound keep/files-from indexes to O(M) memory
2026-09-13 04:52:10 +02:00
TapTap
a4f4110397
Merge branch 'fix/w4-queue' into fix/w4-integration
2026-09-13 04:19:12 +02:00
TapTap
24fe8c5583
Merge branch 'fix/w4-compress' into fix/w4-integration
2026-09-13 04:19:12 +02:00
TapTap
d274bdff4e
Merge branch 'fix/w4-hash' into fix/w4-integration
2026-09-13 04:19:12 +02:00
TapTap
6c636a19e6
perf(compression,tcp): reuse zstd contexts; enable TCP_NODELAY
2026-09-13 04:18:55 +02:00
TapTap
1a83e284c4
perf(utils,file-list): index delete keep-set and --files-from lookups
2026-09-13 04:16:28 +02:00
TapTap
317d5d081a
perf(protocol): pack metadata into one frame (PROTOCOL 2.20.0)
2026-09-13 04:08:36 +02:00
TapTap
69fe7f3c9f
perf(send,scanner): byte-bound sender queues; drop redundant stat
2026-09-13 04:06:30 +02:00
TapTap
ddc71a7df5
Merge Wave 3b: configurable protocol timeout and idle/session bounds
CI / lint (push) Successful in 1m31s
CI / sanitizers (undefined) (push) Successful in 1m1s
CI / sanitizers (address) (push) Successful in 1m8s
CI / fuzz-build (push) Successful in 30s
CI / coverage (push) Successful in 50s
CI / build-and-test (push) Successful in 4m37s
CI / valgrind (push) Successful in 3m12s
2026-09-13 03:46:25 +02:00
TapTap
ffa1d24625
fix(receiver): harden idle-progress definition, single error frame, sendfile timeout
2026-09-13 03:46:20 +02:00
TapTap
b16349b81e
fix(protocol): honor --timeout for protocol I/O; bound idle/session time
2026-09-13 03:29:01 +02:00
TapTap
4bc84fe954
Merge Wave 3a: daemon host ACL, configurable max connections, peer audit, auth-failure delay
CI / lint (push) Successful in 1m31s
CI / sanitizers (undefined) (push) Successful in 57s
CI / sanitizers (address) (push) Successful in 1m5s
CI / fuzz-build (push) Successful in 29s
CI / coverage (push) Successful in 49s
CI / build-and-test (push) Successful in 4m35s
CI / valgrind (push) Successful in 3m10s
2026-09-13 02:51:11 +02:00
TapTap
fc560246c1
fix(daemon): close ACL fail-opens (v4-mapped peers, invalid patterns) and cap auth delay
2026-09-13 02:51:07 +02:00
TapTap
dff6609976
feat(daemon): host ACL, configurable max connections, peer audit, auth-failure delay
2026-09-13 02:36:15 +02:00
TapTap
1acb66628d
Merge Wave 2: thread-safety fixes (signals, fd ownership, handler epilogue, logging, scanner leak)
CI / lint (push) Successful in 1m30s
CI / sanitizers (undefined) (push) Successful in 59s
CI / sanitizers (address) (push) Successful in 1m6s
CI / fuzz-build (push) Successful in 28s
CI / coverage (push) Successful in 49s
CI / build-and-test (push) Successful in 4m31s
CI / valgrind (push) Successful in 3m10s
2026-09-13 02:13:27 +02:00
TapTap
ba1c7a369f
fix(server,log): non-socket shutdown fallback, drop redundant delay cleanup, unlock logging I/O
2026-09-13 02:13:22 +02:00
TapTap
d28489d83c
Merge branch 'fix/w2-scan' into fix/w2-integration
2026-09-13 01:49:44 +02:00
TapTap
312ed05170
Merge branch 'fix/w2-log' into fix/w2-integration
2026-09-13 01:49:44 +02:00
TapTap
fecbe2c90c
fix(server): child-safe signals, single fd owner, handler cleanup epilogue
2026-09-13 01:49:27 +02:00
TapTap
c8f5d80fcb
fix(log): serialize message emission; clear log_fp before close; use logger
2026-09-13 01:44:59 +02:00
TapTap
8147ff7b50
fix(scanner): free chunk_data on chunk-create failure
2026-09-13 01:36:51 +02:00
TapTap
b7fbb56289
test(file): silence cppcheck constVariablePointer in empty-path test
CI / lint (push) Successful in 1m32s
CI / sanitizers (undefined) (push) Successful in 57s
CI / sanitizers (address) (push) Successful in 1m4s
CI / fuzz-build (push) Successful in 30s
CI / coverage (push) Successful in 49s
CI / build-and-test (push) Successful in 4m28s
CI / valgrind (push) Successful in 3m10s
2026-09-13 01:25:29 +02:00
TapTap
08063b6d73
Merge Wave 1: critical/High fixes (UAF, DoS caps, leaks, hardening)
CI / lint (push) Failing after 1m32s
CI / build-and-test (push) Skipped
CI / sanitizers (address) (push) Skipped
CI / sanitizers (undefined) (push) Skipped
CI / fuzz-build (push) Skipped
CI / coverage (push) Skipped
CI / valgrind (push) Skipped
2026-09-13 01:18:58 +02:00
TapTap
ea2f76cd7a
fix(receiver): charge per-entry DirTimeList cost; cap client --skip-compress
2026-09-13 01:18:54 +02:00
TapTap
76eeba1773
Merge branch 'fix/w1d-hardening' into fix/w1-integration
2026-09-13 00:59:35 +02:00
TapTap
b72ab298ab
Merge branch 'fix/w1c-wire' into fix/w1-integration
2026-09-13 00:59:35 +02:00
TapTap
446a714ef8
Merge branch 'fix/w1b-receiver' into fix/w1-integration
2026-09-13 00:59:35 +02:00
TapTap
a90e234eb3
harden: overflow guards, auth-user validation, TLS1.3 policy, build hardening
2026-09-13 00:59:21 +02:00