fix: stabilization session — auth bypass, raft quorum, wire DoS, query operators
CI / test (push) Has been cancelled
CI / raft-e2e (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled

Security:
- MIGRATE handler now requires auth (unauthenticated arbitrary writes)
- parseHeader rejects oversized messages before allocation (pre-auth DoS)

Correctness:
- raft commit uses strict majority (N div 2 + 1), fixing even-N minority commit
- power (**) and concat (++) no longer lowered to equality
- != is now the exact complement of = for numerically-equal values
- legacy REP payload carries explicit put/delete tag (PK-only rows survive)
- REP receiver maintains secondary indexes via applyReplicatedPut/Delete
- snapshot send runs gzip off the event loop (heartbeat stall mitigation)

Docs: PLAN.md (session 13), BUG_AUDIT_2026-08.md (~28 findings, 23 tracked),
known-limitations.md, CHANGELOG.md.

Verified: baradadb build clean; test_all + bugfix_test pass.
This commit is contained in:
2026-08-02 22:49:30 +03:00
parent a843f0a1a3
commit ccc54e8f18
13 changed files with 458 additions and 40 deletions
+4 -3
View File
@@ -436,11 +436,12 @@ proc evalExprOld*(expr: IRExpr, row: Table[string, string], ctx: ExecutionContex
except CatchableError: discard
return "false"
of irNeq:
if left != right: return "true"
# Try numeric comparison
# Numeric-first so `!=` is the exact complement of `=` (irEq): string
# inequality alone would make `5 != 5.0` true while `5 = 5.0` is true.
try:
return if parseFloat(left) != parseFloat(right): "true" else: "false"
except CatchableError: return "false"
except CatchableError:
return if left != right: "true" else: "false"
of irLt:
try:
return if parseFloat(left) < parseFloat(right): "true" else: "false"
+2
View File
@@ -76,6 +76,8 @@ proc lowerExpr*(node: Node): IRExpr =
of bkJsonContainedBy: irOp = irJsonContainedBy
of bkJsonHasAny: irOp = irJsonHasAny
of bkJsonHasAll: irOp = irJsonHasAll
of bkPow: irOp = irPow
of bkConcat: irOp = irAdd # irAdd concatenates string operands
else: irOp = irEq
result.binOp = irOp
result.binLeft = lowerExpr(node.binLeft)