@@ -36,6 +36,10 @@ var ErrNotList = errors.New("not a list")
36
36
// The default value 65536 = 1024 * 64
37
37
var MaxIndex = 65536
38
38
39
+ // MaxNestedNameLevel is the maximum level of nesting for a value name that
40
+ // will be allowed.
41
+ var MaxNestedNameLevel = 30
42
+
39
43
// ToYAML takes a string of arguments and converts to a YAML document.
40
44
func ToYAML (s string ) (string , error ) {
41
45
m , err := Parse (s )
@@ -155,7 +159,7 @@ func newFileParser(sc *bytes.Buffer, data map[string]interface{}, reader RunesVa
155
159
156
160
func (t * parser ) parse () error {
157
161
for {
158
- err := t .key (t .data )
162
+ err := t .key (t .data , 0 )
159
163
if err == nil {
160
164
continue
161
165
}
@@ -174,7 +178,7 @@ func runeSet(r []rune) map[rune]bool {
174
178
return s
175
179
}
176
180
177
- func (t * parser ) key (data map [string ]interface {}) (reterr error ) {
181
+ func (t * parser ) key (data map [string ]interface {}, nestedNameLevel int ) (reterr error ) {
178
182
defer func () {
179
183
if r := recover (); r != nil {
180
184
reterr = fmt .Errorf ("unable to parse key: %s" , r )
@@ -204,7 +208,7 @@ func (t *parser) key(data map[string]interface{}) (reterr error) {
204
208
}
205
209
206
210
// Now we need to get the value after the ].
207
- list , err = t .listItem (list , i )
211
+ list , err = t .listItem (list , i , nestedNameLevel )
208
212
set (data , kk , list )
209
213
return err
210
214
case last == '=' :
@@ -261,18 +265,26 @@ func (t *parser) key(data map[string]interface{}) (reterr error) {
261
265
set (data , string (k ), "" )
262
266
return errors .Errorf ("key %q has no value (cannot end with ,)" , string (k ))
263
267
case last == '.' :
268
+ // Check value name is within the maximum nested name level
269
+ nestedNameLevel ++
270
+ if nestedNameLevel > MaxNestedNameLevel {
271
+ return fmt .Errorf ("value name nested level is greater than maximum supported nested level of %d" , MaxNestedNameLevel )
272
+ }
273
+
264
274
// First, create or find the target map.
265
275
inner := map [string ]interface {}{}
266
276
if _ , ok := data [string (k )]; ok {
267
277
inner = data [string (k )].(map [string ]interface {})
268
278
}
269
279
270
280
// Recurse
271
- e := t .key (inner )
272
- if len (inner ) == 0 {
281
+ e := t .key (inner , nestedNameLevel )
282
+ if e == nil && len (inner ) == 0 {
273
283
return errors .Errorf ("key map %q has no value" , string (k ))
274
284
}
275
- set (data , string (k ), inner )
285
+ if len (inner ) != 0 {
286
+ set (data , string (k ), inner )
287
+ }
276
288
return e
277
289
}
278
290
}
@@ -322,7 +334,7 @@ func (t *parser) keyIndex() (int, error) {
322
334
return strconv .Atoi (string (v ))
323
335
324
336
}
325
- func (t * parser ) listItem (list []interface {}, i int ) ([]interface {}, error ) {
337
+ func (t * parser ) listItem (list []interface {}, i , nestedNameLevel int ) ([]interface {}, error ) {
326
338
if i < 0 {
327
339
return list , fmt .Errorf ("negative %d index not allowed" , i )
328
340
}
@@ -395,7 +407,7 @@ func (t *parser) listItem(list []interface{}, i int) ([]interface{}, error) {
395
407
}
396
408
}
397
409
// Now we need to get the value after the ].
398
- list2 , err := t .listItem (crtList , nextI )
410
+ list2 , err := t .listItem (crtList , nextI , nestedNameLevel )
399
411
if err != nil {
400
412
return list , err
401
413
}
@@ -414,7 +426,7 @@ func (t *parser) listItem(list []interface{}, i int) ([]interface{}, error) {
414
426
}
415
427
416
428
// Recurse
417
- e := t .key (inner )
429
+ e := t .key (inner , nestedNameLevel )
418
430
if e != nil {
419
431
return list , e
420
432
}
0 commit comments