Skip to content

IncorrectTagValue thrown during dictionary validation is not converted into a FIX session reject #732

Description

@victor1109luo-hub

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:

  • 35=3
  • 371=167
  • 372=D
  • 373=5

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:

  1. Create a FIX 4.2 session with dictionary validation enabled.
  2. Log on successfully.
  3. Send a NewOrderSingle with SecurityType(167)=ES1 where ES1 is not a valid enum value in the dictionary.
  4. 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions