From 0e9c1e9c8deedffe9cac77925270cf9decdab7fc Mon Sep 17 00:00:00 2001 From: MartinAdams Date: Thu, 9 Jul 2015 20:45:03 +0100 Subject: [PATCH] Fix for stack overflow that can occcur because of recursion when processing queued messages --- NEXT_VERSION.md | 1 + QuickFIXn/Session.cs | 18 +++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/NEXT_VERSION.md b/NEXT_VERSION.md index 76431acff..1024baad1 100644 --- a/NEXT_VERSION.md +++ b/NEXT_VERSION.md @@ -32,4 +32,5 @@ Changes since the last version (oldest first): * (patch) #80 - fixes to tag-141-related sequence resets (TomasVetrovsky,akamyshanov,gbirchmeier) * (patch) #315 - make config file section headers be case-insensitive, for parity with QF/j (gbirchmeier) * (minor) #314 - New feature: add/remove sessions dynamically (martinadams) +* (patch) #280 - fix to prevent StackOverflowException due to recursion (martinadams) diff --git a/QuickFIXn/Session.cs b/QuickFIXn/Session.cs index cb5262f1e..3b3c9a418 100755 --- a/QuickFIXn/Session.cs +++ b/QuickFIXn/Session.cs @@ -501,6 +501,16 @@ public void Next() /// /// public void Next(string msgStr) + { + NextMessage(msgStr); + NextQueued(); + } + + /// + /// Process a message (in string form) from the counterparty + /// + /// + private void NextMessage(string msgStr) { try { @@ -654,7 +664,6 @@ public void Next(Message message) Disconnect(e.ToString()); } - NextQueued(); Next(); } @@ -710,7 +719,6 @@ protected void NextLogon(Message logon) else { state_.IncrNextTargetMsgSeqNum(); - NextQueued(); } if (this.IsLoggedOn) @@ -723,7 +731,6 @@ protected void NextTestRequest(Message testRequest) return; GenerateHeartbeat(testRequest); state_.IncrNextTargetMsgSeqNum(); - NextQueued(); } protected void NextResendRequest(Message resendReq) @@ -866,7 +873,6 @@ protected void NextHeartbeat(Message heartbeat) if (!Verify(heartbeat)) return; state_.IncrNextTargetMsgSeqNum(); - NextQueued(); } protected void NextSequenceReset(Message sequenceReset) @@ -1563,15 +1569,13 @@ protected bool NextQueued(int num) } else { - Next(msg.ToString()); + NextMessage(msg.ToString()); } return true; } return false; } - - private bool IsAdminMessage(Message msg) { var msgType = msg.Header.GetString(Fields.Tags.MsgType);