Files
triangles_v5/src
Sami Ahmed ff0eeaac89 net: harden v5.9.22 networking changes — strict parser, tests, debug logs
Three pure helper functions extracted from ThreadHTTPSeedFetch2 into
netbase.{h,cpp} so the HTTPS seed-list code path can be unit-tested
without the SSL/Tor network stack:

  int DechunkTransferEncoding(const std::string& body, std::string& out)
  std::vector<std::string> ParseSeedListBody(const std::string& body)
  bool IsValidSocksNegotiationTimeout(int nMs)

DechunkTransferEncoding is now strict (was lenient):

  - Hex validation: every byte of the chunk-size line is checked with
    isxdigit() before strtoull. Old code passed a raw strtoul() result
    which silently accepted leading '+', '-', and whitespace.
  - strtoull + errno + size_t bounds check replaces the silent
    'if (pos+chunkSize > body.size()) chunkSize = body.size()-pos'
    clamp. The old behavior would mask truncated network reads.
  - Empty size lines, '+5' / '-5' / ' 5', and unsigned overflow all
    return DECHUNK_INVALID_HEX (or DECHUNK_OVERSIZE_CHUNK for the
    bounds case) instead of being treated as 0/last-chunk.
  - Missing CRLF after chunk data returns DECHUNK_MISSING_DATA_CRLF
    rather than being read as the next chunk-size line.
  - Body without a '0\r\n' last-chunk terminator returns
    DECHUNK_NO_CHUNK_TERMINATOR instead of silently being accepted.
  - Chunk extensions ('5;foo=bar') are still preserved — the ';'
    delimiter is stripped from the size line, not from the framing.

ParseSeedListBody is a 1:1 extraction of the old loop. Same behavior
on every input. Trims inline '#' comments, splits on whitespace /
comma / semicolon, normalizes CR-only line endings.

IsValidSocksNegotiationTimeout is the central policy: 5000..180000 ms
inclusive. Replaces the inline 'nTorTimeout >= 5000 && nTorTimeout <=
180000' check in init.cpp's AppInit2. Out-of-range values now emit an
InitWarning so the operator sees why their setting was ignored.

Six distinct failure-mode log messages in ThreadHTTPSeedFetch2:

  1. 'cannot connect to %s through Tor proxy'        — connect failure
  2. 'malformed response (no header terminator)'      — no \r\n\r\n
  3. 'malformed chunked transfer encoding (%s)'       — DechunkResult enum
                                                        reason string
  4. 'empty response from %s'                         — 0 bytes read
  5. 'parsed response contained zero valid addresses' — body parsed
                                                        but CService
                                                        validation
                                                        dropped all
  6. '%d addresses found from HTTPS seed list'        — success path

Help text for -torconnecttimeout now precisely describes what the
value bounds (the SOCKS5 handshake — send/recv of init/auth/connect),
not 'time to reach the onion' which was misleading. The onion-resolution
time is bounded by Tor's own SocksTimeout (~120s) and is not directly
controllable from the daemon.

src/test/http_seed_tests.cpp adds 43 new Boost.Test cases covering
every scenario in the hardening brief:

  DechunkTransferEncoding: 16 cases
    - single chunk, multiple chunks, chunk extensions (one and
      multiple), uppercase hex, payload containing CRLF, awkward
      boundary that looks like a chunk-size line, last-chunk with
      extension
    - empty body, no CRLF after size, invalid hex, empty size line,
      oversize chunk, truncated last-chunk marker, missing data CRLF,
      strtoul overflow, sign in size, whitespace in size, no last
      chunk

  ParseSeedListBody: 14 cases
    - empty, single-per-line, CRLF endings, multiple-per-line
      (space, comma, semicolon, mixed), inline comments, blank lines,
      all-comments, portless onion, invalid entry preserved, trailing
      whitespace, mixed CRLF/LF

  IsValidSocksNegotiationTimeout: 9 cases
    - 4999 (out), 5000 (in, exact lower), 60000 (in, default), 180000
      (in, exact upper), 180001 (out), 0 (out), -1 (out), INT_MAX
      (out, guard against wraparound), 3 midrange values

  Integration: 1 round-trip case
    - Encode a seed body as chunked, dechunk it, then parse the
      result. Verifies the two helpers compose correctly.

Test results: 183 test cases total, *** No errors detected. Existing
onion_v3_tests (8) and netbase_tests (10) still pass.
2026-06-22 00:55:51 -07:00
..
2014-10-05 23:37:30 +02:00
2014-10-05 23:37:30 +02:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-10-05 23:37:30 +02:00
2014-07-16 16:05:09 -07:00
2014-10-05 23:37:30 +02:00
2014-10-05 23:37:30 +02:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-10-05 23:37:30 +02:00
2026-05-10 02:33:40 -07:00
2014-07-21 20:07:07 -07:00
2015-07-28 15:59:06 +02:00
2014-10-05 23:37:30 +02:00
2014-07-16 16:05:09 -07:00
2014-10-05 23:37:30 +02:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-10-05 23:37:30 +02:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-07-16 16:05:09 -07:00
2014-10-05 23:37:30 +02:00
2026-05-10 18:20:35 -07:00
2026-05-10 18:02:40 -07:00