From 47d329de64b53c80e00aa1ae9aff91df509af418 Mon Sep 17 00:00:00 2001 From: Pierre Fenoll Date: Mon, 13 Feb 2023 15:42:46 +0100 Subject: [PATCH] openapi3: fix an infinite loop that may have been introduced in #700 (#768) --- openapi3/issue542_test.go | 25 +++++++++++++++++++- openapi3/issue615_test.go | 11 +++++++-- openapi3/loader.go | 12 ---------- openapi3/testdata/issue542.yml | 43 ---------------------------------- 4 files changed, 33 insertions(+), 58 deletions(-) delete mode 100644 openapi3/testdata/issue542.yml diff --git a/openapi3/issue542_test.go b/openapi3/issue542_test.go index 4ba017aed..05f5db64d 100644 --- a/openapi3/issue542_test.go +++ b/openapi3/issue542_test.go @@ -7,8 +7,31 @@ import ( ) func TestIssue542(t *testing.T) { + spec := []byte(` +openapi: '3.0.0' +info: + version: '1.0.0' + title: Swagger Petstore + license: + name: MIT +servers: +- url: http://petstore.swagger.io/v1 +paths: {} +components: + schemas: + Cat: + anyOf: + - $ref: '#/components/schemas/Kitten' + - type: object + Kitten: + type: string +`[1:]) + sl := NewLoader() - _, err := sl.LoadFromFile("testdata/issue542.yml") + doc, err := sl.LoadFromData(spec) + require.NoError(t, err) + + doc.Validate(sl.Context) require.NoError(t, err) } diff --git a/openapi3/issue615_test.go b/openapi3/issue615_test.go index e7bd01e92..496a972bb 100644 --- a/openapi3/issue615_test.go +++ b/openapi3/issue615_test.go @@ -10,10 +10,14 @@ import ( func TestIssue615(t *testing.T) { { + var old int + old, openapi3.CircularReferenceCounter = openapi3.CircularReferenceCounter, 1 + defer func() { openapi3.CircularReferenceCounter = old }() + loader := openapi3.NewLoader() loader.IsExternalRefsAllowed = true _, err := loader.LoadFromFile("testdata/recursiveRef/issue615.yml") - require.NoError(t, err) + require.ErrorContains(t, err, openapi3.CircularReferenceError) } var old int @@ -22,6 +26,9 @@ func TestIssue615(t *testing.T) { loader := openapi3.NewLoader() loader.IsExternalRefsAllowed = true - _, err := loader.LoadFromFile("testdata/recursiveRef/issue615.yml") + doc, err := loader.LoadFromFile("testdata/recursiveRef/issue615.yml") + require.NoError(t, err) + + doc.Validate(loader.Context) require.NoError(t, err) } diff --git a/openapi3/loader.go b/openapi3/loader.go index 51020111e..4a14f67f0 100644 --- a/openapi3/loader.go +++ b/openapi3/loader.go @@ -504,7 +504,6 @@ func (loader *Loader) resolveHeaderRef(doc *T, component *HeaderRef, documentPat return err } component.Value = resolved.Value - return nil } } value := component.Value @@ -552,7 +551,6 @@ func (loader *Loader) resolveParameterRef(doc *T, component *ParameterRef, docum return err } component.Value = resolved.Value - return nil } } value := component.Value @@ -609,7 +607,6 @@ func (loader *Loader) resolveRequestBodyRef(doc *T, component *RequestBodyRef, d return err } component.Value = resolved.Value - return nil } } value := component.Value @@ -671,7 +668,6 @@ func (loader *Loader) resolveResponseRef(doc *T, component *ResponseRef, documen return err } component.Value = resolved.Value - return nil } } value := component.Value @@ -754,7 +750,6 @@ func (loader *Loader) resolveSchemaRef(doc *T, component *SchemaRef, documentPat return err } component.Value = resolved.Value - return nil } if loader.visitedSchema == nil { loader.visitedSchema = make(map[*Schema]struct{}) @@ -836,7 +831,6 @@ func (loader *Loader) resolveSecuritySchemeRef(doc *T, component *SecurityScheme return err } component.Value = resolved.Value - return nil } } return nil @@ -873,7 +867,6 @@ func (loader *Loader) resolveExampleRef(doc *T, component *ExampleRef, documentP return err } component.Value = resolved.Value - return nil } } return nil @@ -910,7 +903,6 @@ func (loader *Loader) resolveCallbackRef(doc *T, component *CallbackRef, documen return err } component.Value = resolved.Value - return nil } } value := component.Value @@ -957,7 +949,6 @@ func (loader *Loader) resolveLinkRef(doc *T, component *LinkRef, documentPath *u return err } component.Value = resolved.Value - return nil } } return nil @@ -999,10 +990,7 @@ func (loader *Loader) resolvePathItemRef(doc *T, pathItem *PathItem, documentPat } pathItem.Ref = ref } - return loader.resolvePathItemRefContinued(doc, pathItem, documentPath) -} -func (loader *Loader) resolvePathItemRefContinued(doc *T, pathItem *PathItem, documentPath *url.URL) (err error) { for _, parameter := range pathItem.Parameters { if err = loader.resolveParameterRef(doc, parameter, documentPath); err != nil { return diff --git a/openapi3/testdata/issue542.yml b/openapi3/testdata/issue542.yml deleted file mode 100644 index 887702557..000000000 --- a/openapi3/testdata/issue542.yml +++ /dev/null @@ -1,43 +0,0 @@ -openapi: "3.0.0" -info: - version: 1.0.0 - title: Swagger Petstore - license: - name: MIT -servers: - - url: http://petstore.swagger.io/v1 -paths: {} -#paths: -# /pets: -# patch: -# requestBody: -# content: -# application/json: -# schema: -# oneOf: -# - $ref: '#/components/schemas/Cat' -# - $ref: '#/components/schemas/Kitten' -# discriminator: -# propertyName: pet_type -# responses: -# '200': -# description: Updated -components: - schemas: - Cat: - anyOf: - - $ref: "#/components/schemas/Kitten" - - type: object - # properties: - # hunts: - # type: boolean - # age: - # type: integer - # offspring: - Kitten: - $ref: "#/components/schemas/Cat" #ko - -# type: string #ok - -# allOf: #ko -# - $ref: '#/components/schemas/Cat'