Skip to content

Sync upstream v0.9.12 and harden parser boundaries - #3

Merged
SilkageNet merged 18 commits into
mainfrom
fix/upstream-sync-review
Oct 22, 2026
Merged

SilkageNet merged 18 commits into
mainfrom
fix/upstream-sync-review

Conversation

@SilkageNet

Copy link
Copy Markdown
Member

Synchronize the fork with upstream v0.9.12 (eff945d). This brings in the GetTime recursive-read-lock fix, RepeatingGroup.Reset, composite log argument forwarding, the business-reject reason correction, and dictionary diagnostics.

The nested-group defect originated upstream in 6889cf1; upstream PR quickfixgo#756 addresses the same body-field bug. Retain the fork's ancestor-before-classification and root-path reset because v0.9.12 still misclassifies nested sibling-group members. Add direct comparative regressions. Fuzzing also exposed inherited panics for short messages and empty integer fields; reject these and out-of-bounds XML payloads explicitly. Normal session sequencing, transport writes, FileStore persistence and resend scheduling are unchanged.

Validation: full Go tests and vet; Race on engine, FileStore, settings and composite log; 59/59 local FIX44 TCP/FileStore acceptance cases; 30-second dictionary-parser fuzz run with 2,036,420 executions. Existing upstream parser fails the sibling and truncated-input regressions; the merged fork passes. MongoDB integration requires an external instance and remains skipped in the local full suite.

agmt and others added 18 commits August 6, 2026 00:22
Implement RepeatingGroup.Reset() to clear all groups without
reallocating the template or struct. This addresses issue quickfixgo#758,
where repeated message parsing required new RepeatingGroup instances
for each parse, causing unnecessary allocations in high-throughput
FIX message processing scenarios.

Changes:
- Add RepeatingGroup.Reset() that clears groups slice (keeps capacity)
- Add test_repeating_group_reset.go covering Reset() behavior and
  multi-cycle reuse without reallocation
In FieldMap.GetTime the code took an RLock(), then called GetBytes()
which attempted to RLock the mutex again. This could lead to potential
deadlock so here we swap out that call for the existing getBytesNoLock
method which appears to be exactly for this purpose.
Remove a call to Reset a bytes.Buffer immediately after it is initialised.
…lock

Fix potential deadlock in FieldMap.GetTime
…reset

fix(repeating_group): add Reset() method (closes quickfixgo#758)
…itionally-required-field-missing-reject-reason

Revert "Fix duplicate reject reason value for ConditionallyRequiredFieldMissing"
compositeLog.OnEventf passed the variadic arguments as a single
[]interface{} argument, so every wrapped log rendered the format verbs
against one slice value, producing output such as
"session [FIX.4.4 %!s(int=7)] seq %!d(MISSING)" instead of
"session FIX.4.4 seq 7".
…epeating-group

ParseGroup: Body field after nested repeating group
…ror-message

correction to error message in SessionFactory
…neventf-variadic-forward

Fix OnEventf argument forwarding in the composite log
@SilkageNet
SilkageNet merged commit 38b696a into main Oct 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants