Skip to content

Commit

Permalink
Fixed implicit resolver leak yaml#67
Browse files Browse the repository at this point in the history
  • Loading branch information
xiongqingliang authored and bridadan committed Aug 17, 2017
1 parent 7e026bf commit efddcac
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 4 deletions.
5 changes: 3 additions & 2 deletions lib/yaml/resolver.py
Expand Up @@ -4,6 +4,7 @@
from error import *
from nodes import *

import itertools
import re

class ResolverError(YAMLError):
Expand Down Expand Up @@ -146,8 +147,8 @@ def resolve(self, kind, value, implicit):
resolvers = self.yaml_implicit_resolvers.get(u'', [])
else:
resolvers = self.yaml_implicit_resolvers.get(value[0], [])
resolvers += self.yaml_implicit_resolvers.get(None, [])
for tag, regexp in resolvers:
none_resolvers = self.yaml_implicit_resolvers.get(None, [])
for tag, regexp in itertools.chain(resolvers, none_resolvers):
if regexp.match(value):
return tag
implicit = implicit[1]
Expand Down
5 changes: 3 additions & 2 deletions lib3/yaml/resolver.py
Expand Up @@ -4,6 +4,7 @@
from .error import *
from .nodes import *

import itertools
import re

class ResolverError(YAMLError):
Expand Down Expand Up @@ -146,8 +147,8 @@ def resolve(self, kind, value, implicit):
resolvers = self.yaml_implicit_resolvers.get('', [])
else:
resolvers = self.yaml_implicit_resolvers.get(value[0], [])
resolvers += self.yaml_implicit_resolvers.get(None, [])
for tag, regexp in resolvers:
none_resolvers = self.yaml_implicit_resolvers.get(None, [])
for tag, regexp in itertools.chain(resolvers, none_resolvers):
if regexp.match(value):
return tag
implicit = implicit[1]
Expand Down
20 changes: 20 additions & 0 deletions tests/lib/test_resolver.py
@@ -1,6 +1,7 @@

import yaml
import pprint
import re

def test_implicit_resolver(data_filename, detect_filename, verbose=False):
correct_tag = None
Expand All @@ -21,6 +22,25 @@ def test_implicit_resolver(data_filename, detect_filename, verbose=False):

test_implicit_resolver.unittest = ['.data', '.detect']

def test_implicit_resolver_leak(data_filename, detect_filename, verbose=False):
# Add any custom resolver
tag, regexp = '!any_resolver', re.compile('AnyResolver')
yaml.add_implicit_resolver(tag, regexp)

none_resolvers = yaml.Dumper.yaml_implicit_resolvers.get(None, [])
assert (tag, regexp) in none_resolvers

old_f_resolvers = yaml.Dumper.yaml_implicit_resolvers.get('f', [])
assert (tag, regexp) not in old_f_resolvers

# Dump at least one ScalarNode
yaml.dump(False)

new_f_resolvers = yaml.Dumper.yaml_implicit_resolvers.get('f', [])
assert (tag, regexp) not in new_f_resolvers

test_implicit_resolver_leak.unittest = ['.data', '.path']

def _make_path_loader_and_dumper():
global MyLoader, MyDumper

Expand Down
20 changes: 20 additions & 0 deletions tests/lib3/test_resolver.py
@@ -1,6 +1,7 @@

import yaml
import pprint
import re

def test_implicit_resolver(data_filename, detect_filename, verbose=False):
correct_tag = None
Expand All @@ -21,6 +22,25 @@ def test_implicit_resolver(data_filename, detect_filename, verbose=False):

test_implicit_resolver.unittest = ['.data', '.detect']

def test_implicit_resolver_leak(data_filename, detect_filename, verbose=False):
# Add any custom resolver
tag, regexp = '!any_resolver', re.compile('AnyResolver')
yaml.add_implicit_resolver(tag, regexp)

none_resolvers = yaml.Dumper.yaml_implicit_resolvers.get(None, [])
assert (tag, regexp) in none_resolvers

old_f_resolvers = yaml.Dumper.yaml_implicit_resolvers.get('f', [])
assert (tag, regexp) not in old_f_resolvers

# Dump at least one ScalarNode
yaml.dump(False)

new_f_resolvers = yaml.Dumper.yaml_implicit_resolvers.get('f', [])
assert (tag, regexp) not in new_f_resolvers

test_implicit_resolver_leak.unittest = ['.data', '.path']

def _make_path_loader_and_dumper():
global MyLoader, MyDumper

Expand Down

0 comments on commit efddcac

Please sign in to comment.