Skip to content

Commit 47d329d

Browse files
authored
openapi3: fix an infinite loop that may have been introduced in #700 (#768)
1 parent 28d8a4e commit 47d329d

File tree

4 files changed

+33
-58
lines changed

4 files changed

+33
-58
lines changed

openapi3/issue542_test.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,31 @@ import (
77
)
88

99
func TestIssue542(t *testing.T) {
10+
spec := []byte(`
11+
openapi: '3.0.0'
12+
info:
13+
version: '1.0.0'
14+
title: Swagger Petstore
15+
license:
16+
name: MIT
17+
servers:
18+
- url: http://petstore.swagger.io/v1
19+
paths: {}
20+
components:
21+
schemas:
22+
Cat:
23+
anyOf:
24+
- $ref: '#/components/schemas/Kitten'
25+
- type: object
26+
Kitten:
27+
type: string
28+
`[1:])
29+
1030
sl := NewLoader()
1131

12-
_, err := sl.LoadFromFile("testdata/issue542.yml")
32+
doc, err := sl.LoadFromData(spec)
33+
require.NoError(t, err)
34+
35+
doc.Validate(sl.Context)
1336
require.NoError(t, err)
1437
}

openapi3/issue615_test.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@ import (
1010

1111
func TestIssue615(t *testing.T) {
1212
{
13+
var old int
14+
old, openapi3.CircularReferenceCounter = openapi3.CircularReferenceCounter, 1
15+
defer func() { openapi3.CircularReferenceCounter = old }()
16+
1317
loader := openapi3.NewLoader()
1418
loader.IsExternalRefsAllowed = true
1519
_, err := loader.LoadFromFile("testdata/recursiveRef/issue615.yml")
16-
require.NoError(t, err)
20+
require.ErrorContains(t, err, openapi3.CircularReferenceError)
1721
}
1822

1923
var old int
@@ -22,6 +26,9 @@ func TestIssue615(t *testing.T) {
2226

2327
loader := openapi3.NewLoader()
2428
loader.IsExternalRefsAllowed = true
25-
_, err := loader.LoadFromFile("testdata/recursiveRef/issue615.yml")
29+
doc, err := loader.LoadFromFile("testdata/recursiveRef/issue615.yml")
30+
require.NoError(t, err)
31+
32+
doc.Validate(loader.Context)
2633
require.NoError(t, err)
2734
}

openapi3/loader.go

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,6 @@ func (loader *Loader) resolveHeaderRef(doc *T, component *HeaderRef, documentPat
504504
return err
505505
}
506506
component.Value = resolved.Value
507-
return nil
508507
}
509508
}
510509
value := component.Value
@@ -552,7 +551,6 @@ func (loader *Loader) resolveParameterRef(doc *T, component *ParameterRef, docum
552551
return err
553552
}
554553
component.Value = resolved.Value
555-
return nil
556554
}
557555
}
558556
value := component.Value
@@ -609,7 +607,6 @@ func (loader *Loader) resolveRequestBodyRef(doc *T, component *RequestBodyRef, d
609607
return err
610608
}
611609
component.Value = resolved.Value
612-
return nil
613610
}
614611
}
615612
value := component.Value
@@ -671,7 +668,6 @@ func (loader *Loader) resolveResponseRef(doc *T, component *ResponseRef, documen
671668
return err
672669
}
673670
component.Value = resolved.Value
674-
return nil
675671
}
676672
}
677673
value := component.Value
@@ -754,7 +750,6 @@ func (loader *Loader) resolveSchemaRef(doc *T, component *SchemaRef, documentPat
754750
return err
755751
}
756752
component.Value = resolved.Value
757-
return nil
758753
}
759754
if loader.visitedSchema == nil {
760755
loader.visitedSchema = make(map[*Schema]struct{})
@@ -836,7 +831,6 @@ func (loader *Loader) resolveSecuritySchemeRef(doc *T, component *SecurityScheme
836831
return err
837832
}
838833
component.Value = resolved.Value
839-
return nil
840834
}
841835
}
842836
return nil
@@ -873,7 +867,6 @@ func (loader *Loader) resolveExampleRef(doc *T, component *ExampleRef, documentP
873867
return err
874868
}
875869
component.Value = resolved.Value
876-
return nil
877870
}
878871
}
879872
return nil
@@ -910,7 +903,6 @@ func (loader *Loader) resolveCallbackRef(doc *T, component *CallbackRef, documen
910903
return err
911904
}
912905
component.Value = resolved.Value
913-
return nil
914906
}
915907
}
916908
value := component.Value
@@ -957,7 +949,6 @@ func (loader *Loader) resolveLinkRef(doc *T, component *LinkRef, documentPath *u
957949
return err
958950
}
959951
component.Value = resolved.Value
960-
return nil
961952
}
962953
}
963954
return nil
@@ -999,10 +990,7 @@ func (loader *Loader) resolvePathItemRef(doc *T, pathItem *PathItem, documentPat
999990
}
1000991
pathItem.Ref = ref
1001992
}
1002-
return loader.resolvePathItemRefContinued(doc, pathItem, documentPath)
1003-
}
1004993

1005-
func (loader *Loader) resolvePathItemRefContinued(doc *T, pathItem *PathItem, documentPath *url.URL) (err error) {
1006994
for _, parameter := range pathItem.Parameters {
1007995
if err = loader.resolveParameterRef(doc, parameter, documentPath); err != nil {
1008996
return

openapi3/testdata/issue542.yml

Lines changed: 0 additions & 43 deletions
This file was deleted.

0 commit comments

Comments
 (0)