Skip to content

Stack Overflow with circular schema references #423

@Jesperpaulsen

Description

@Jesperpaulsen

Steps to reproduce

When parsing an OpenAPI 3.1.0 spec with mutually recursive (circular) schema references, swagger_parser enters infinite recursion and crashes with a Stack Overflow error.

Expected results

Shouldn't encounter stack overflow error. Either by tracking allready visited schemas or by having a max depth.

Actual results

Stack overflow error

Your OpenApi snippet

Can't share the whole snippet.

Minimal reproducer:

{
  "openapi": "3.1.0",
  "info": {"title": "Circular Ref Test", "version": "1.0.0"},
  "paths": {
    "/columns": {
      "get": {
        "operationId": "getColumns",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {"$ref": "#/components/schemas/ColumnHeader"}
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ColumnHeader": {
        "type": "object",
        "properties": {
          "id": {"type": "string"},
          "metadata": {
            "anyOf": [
              {"$ref": "#/components/schemas/LookupMetadata"},
              {"type": "null"}
            ]
          }
        }
      },
      "LookupMetadata": {
        "type": "object",
        "properties": {
          "target_header": {
            "anyOf": [
              {"$ref": "#/components/schemas/ColumnHeader"},
              {"type": "null"}
            ]
          }
        }
      }
    }
  }
}

Note: The minimal reproducer does not trigger the issue on its own - the stack overflow only manifests with larger specs (1000+ schemas in my case). The circular reference pattern is the root cause, but the issue may depend on spec size or specific combinations of schemas.

Code sample

Code sample
[Paste your code here]

Logs

Logs
Stack Overflow
#0      RangeError.checkValidRange (dart:core/errors.dart:375:3)
#1      _StringBase.split (dart:core-patch/string_patch.dart:991:23)
#2      NormalizedIdentifier._parseDelimitedText (package:swagger_parser/src/parser/model/normalized_identifier.dart:62:19)
#3      new NormalizedIdentifier.parse (package:swagger_parser/src/parser/model/normalized_identifier.dart:30:19)
#4      protectName (package:swagger_parser/src/parser/utils/type_utils.dart:230:47)
#5      OpenApiParser._findType (package:swagger_parser/src/parser/parser/open_api_parser.dart:2031:38)
#6      OpenApiParser._findType (package:swagger_parser/src/parser/parser/open_api_parser.dart:1771:38)
#7      OpenApiParser._findParametersAndImports (package:swagger_parser/src/parser/parser/open_api_parser.dart:808:32)
#8      OpenApiParser._getImportsAndProps (package:swagger_parser/src/parser/parser/open_api_parser.dart:2205:40)
#9      OpenApiParser._findType (package:swagger_parser/src/parser/parser/open_api_parser.dart:1885:54)
... (repeats thousands of times)

Dart version and used packages versions

Dart version
3.7
Packages version
swagger_parser: ^1.40.0
I encountered the stack overflow issue when testing the demo website as well.

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