Environment
QuickFIX version: 1.15.x
Language binding: C++
Protocol: FIX 4.2
Validation mode: DataDictionary enabled
Problem
When an inbound message contains an invalid enum value for a known FIX field, QuickFIX throws IncorrectTagValue during message parsing/validation before the message reaches application callbacks.
In this case, the invalid message is not consistently converted into a standard FIX session reject message. Instead, the exception escapes the normal session processing path.
This makes invalid inbound FIX messages harder to handle in a protocol-compliant way.
Expected Behavior
For an inbound message with an invalid enum value on a known field, QuickFIX should generate a standard FIX session reject rather than allowing IncorrectTagValue to escape session processing.
For example, for an invalid enum value on SecurityType(167), the engine should return a reject such as:
Actual Behavior
QuickFIX throws IncorrectTagValue while validating the message against the data dictionary, before the message reaches fromApp.
As a result:
- application callbacks cannot catch this case reliably
- no standard FIX reject is generated through the normal session path
- the exception may escape to the caller
Reproduction
A minimal reproduction is:
- Create a FIX 4.2 session with dictionary validation enabled.
- Log on successfully.
- Send a NewOrderSingle with SecurityType(167)=ES1 where ES1 is not a valid enum value in the dictionary.
- Observe that IncorrectTagValue is thrown during parsing/validation instead of being converted into a FIX session reject.
Example invalid message shape
35=D 49=CLIENT 56=SERVER 34=2 11=CL_INVALID_SECURITY_TYPE 21=1 55=600000 54=1 38=100 40=2 44=8.86 59=0 60=<timestamp> 167=ES1 207=SS
Notes
This is different from unknown user-defined fields or unknown tags. The issue is specifically about known FIX fields with invalid enum values defined by the data dictionary.
In our testing, this happens before application-layer callbacks such as fromApp, so the application cannot turn the failure into a session reject itself.
Suggested Fix
Catch IncorrectTagValue in the session-level inbound message handling path and convert it into a standard FIX session reject, similar to how other protocol-level validation failures are handled.
Impact
This affects protocol compliance and operational behavior:
- malformed messages do not always receive a proper FIX reject
- applications cannot uniformly handle invalid enum values at the callback layer
- behavior differs from what users typically expect from a FIX engine with dictionary validation enabled
Environment
QuickFIX version: 1.15.x
Language binding: C++
Protocol: FIX 4.2
Validation mode: DataDictionary enabled
Problem
When an inbound message contains an invalid enum value for a known FIX field, QuickFIX throws IncorrectTagValue during message parsing/validation before the message reaches application callbacks.
In this case, the invalid message is not consistently converted into a standard FIX session reject message. Instead, the exception escapes the normal session processing path.
This makes invalid inbound FIX messages harder to handle in a protocol-compliant way.
Expected Behavior
For an inbound message with an invalid enum value on a known field, QuickFIX should generate a standard FIX session reject rather than allowing IncorrectTagValue to escape session processing.
For example, for an invalid enum value on SecurityType(167), the engine should return a reject such as:
Actual Behavior
QuickFIX throws IncorrectTagValue while validating the message against the data dictionary, before the message reaches fromApp.
As a result:
Reproduction
A minimal reproduction is:
Example invalid message shape
35=D 49=CLIENT 56=SERVER 34=2 11=CL_INVALID_SECURITY_TYPE 21=1 55=600000 54=1 38=100 40=2 44=8.86 59=0 60=<timestamp> 167=ES1 207=SSNotes
This is different from unknown user-defined fields or unknown tags. The issue is specifically about known FIX fields with invalid enum values defined by the data dictionary.
In our testing, this happens before application-layer callbacks such as fromApp, so the application cannot turn the failure into a session reject itself.
Suggested Fix
Catch IncorrectTagValue in the session-level inbound message handling path and convert it into a standard FIX session reject, similar to how other protocol-level validation failures are handled.
Impact
This affects protocol compliance and operational behavior: