swagger-api / swagger-codegen

swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition.
http://swagger.io
Apache License 2.0
16.98k stars 6.03k forks source link

swagger-codegen generate should detect an infinitely recursive type definition and error out with informative message #5165

Open jan-matejka opened 7 years ago

jan-matejka commented 7 years ago
Description

swagger-codegen generate should detect an infinitely recursive type definition and error out with informative message

Swagger-codegen version

current master; HEAD = 1c160df33897898da1c39f230c737eb6a313e6ba

Swagger declaration file content or url
swagger: '2.0'

info:
  title: "sscce"
  version: '1.0'
  description: sscce

definitions:

  Animal:
    type: object
    properties:
      no_legs:
        type: integer

  Pet:
    allOf:
      - $ref: "#/definitions/Pet"
      - type: object
        properties:
          name:
            type: string

  Cat:
    allOf:
    - $ref: "#/definitions/Pet"
    - type: object
      properties:
        likes_water:
          type: boolean

paths:
  /foo:
    post:
      parameters:
        - name: cat
          in: body
          schema: {$ref: "#/definitions/Cat"}
      responses:
        "200":
          description: foo
          type: string
Command line used for generation

JAR=".../swagger-codegen.git/modules/swagger-codegen-cli/target/swagger-codegen-cli.jar" java -jar "${JAR}" generate -i ~/sscce.yaml -l html2 -o foo

outputs:

[main] INFO io.swagger.parser.Swagger20Parser - reading from sscce.yaml
Exception in thread "main" java.lang.StackOverflowError
        at java.util.HashMap.getNode(HashMap.java:571)
        at java.util.LinkedHashMap.get(LinkedHashMap.java:440)
        at io.swagger.codegen.DefaultCodegen.isDiscriminatorInInterfaceTree(DefaultCodegen.java:1410)
        at io.swagger.codegen.DefaultCodegen.isDiscriminatorInInterfaceTree(DefaultCodegen.java:1416)
        at io.swagger.codegen.DefaultCodegen.isDiscriminatorInInterfaceTree(DefaultCodegen.java:1416)
[snip] repeats about 1000 times. ... default java recursion limit I suppose.

If I accidantely hit this in real spec as opposed to when writing sscce for something else I'd be pretty lost. I'd have to apply the technique of halving the interval, which indeed I had to do several times (for different issues) when I was starting out.

jan-matejka commented 7 years ago

Um, okay. This one might not be even theoretically possible.