fix: initialize Message sections in ParseMessageWithDataDictionary#759
Open
SAY-5 wants to merge 1 commit into
Open
fix: initialize Message sections in ParseMessageWithDataDictionary#759SAY-5 wants to merge 1 commit into
SAY-5 wants to merge 1 commit into
Conversation
A zero-value Message has nil rwLock pointers in its Header, Body, and Trailer FieldMap fields because those pointers are only set by Init(). Calling ParseMessage with a stack-allocated Message panics immediately when doParsing tries to lock those nil mutexes. Guard each section in ParseMessageWithDataDictionary: if rwLock is nil call the section's Init() before entering doParsing. This matches the pattern already used by NewMessage() and keeps re-initialisation cheap for callers that reuse an already-initialised Message. Closes quickfixgo#390 Signed-off-by: Sai Asish Y <say.apm35@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #390.
Bug
ParseMessageandParseMessageWithDataDictionaryaccept a*Messagepointer but do not call
Init()on the provided message.FieldMapstores its mutex as
*sync.RWMutex(a pointer), which isnilfor azero-value struct. When
doParsingimmediately tries to lock thatmutex it panics:
This affects any caller that takes the natural approach of declaring a
local variable and passing its address:
Fix
In
ParseMessageWithDataDictionary, check each section'srwLockbefore entering
doParsing. If it isnil, call the section'sInit(). This matches whatNewMessage()already does and isidempotent for callers that pass an already-initialised message.
Verification
TestParseMessageZeroValue(added inparse_nil_test.go) panicswithout the fix and passes with it. All existing tests continue to pass
with
-race: