diff options
| author | Tres Seaver <tseaver@palladion.com> | 2017-05-04 05:47:11 -0400 |
|---|---|---|
| committer | Tres Seaver <tseaver@palladion.com> | 2017-05-04 05:50:35 -0400 |
| commit | 81f50ca16007d0eb6beb7a51b5bf32b6f1cb410a (patch) | |
| tree | edc824727e48fe64a1122be579e637c8aa7280a5 /src/zope/interface/adapter.py | |
| parent | e42aa17c3d63360636b367ab2e6628d12a8ccd73 (diff) | |
| download | zope-interface-81f50ca16007d0eb6beb7a51b5bf32b6f1cb410a.tar.gz | |
Raise ValueError if non-text name passed to adapter registry methods.75-prevent-non-text-name-errors
Prevents corruption of lookup cache.
Alternative to fix proposed in #75.
Diffstat (limited to 'src/zope/interface/adapter.py')
| -rw-r--r-- | src/zope/interface/adapter.py | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/zope/interface/adapter.py b/src/zope/interface/adapter.py index f8fdb00..df37f42 100644 --- a/src/zope/interface/adapter.py +++ b/src/zope/interface/adapter.py @@ -22,6 +22,7 @@ from zope.interface import ro from zope.interface.interfaces import IAdapterRegistry from zope.interface._compat import _normalize_name +from zope.interface._compat import STRING_TYPES _BLANK = u'' @@ -102,6 +103,8 @@ class BaseAdapterRegistry(object): self._v_lookup.changed(originally_changed) def register(self, required, provided, name, value): + if not isinstance(name, STRING_TYPES): + raise ValueError('name is not a string') if value is None: self.unregister(required, provided, name, value) return @@ -321,6 +324,8 @@ class LookupBaseFallback(object): return cache def lookup(self, required, provided, name=_BLANK, default=None): + if not isinstance(name, STRING_TYPES): + raise ValueError('name is not a string') cache = self._getcache(provided, name) required = tuple(required) if len(required) == 1: @@ -341,6 +346,8 @@ class LookupBaseFallback(object): return result def lookup1(self, required, provided, name=_BLANK, default=None): + if not isinstance(name, STRING_TYPES): + raise ValueError('name is not a string') cache = self._getcache(provided, name) result = cache.get(required, _not_in_mapping) if result is _not_in_mapping: @@ -355,6 +362,8 @@ class LookupBaseFallback(object): return self.adapter_hook(provided, object, name, default) def adapter_hook(self, provided, object, name=_BLANK, default=None): + if not isinstance(name, STRING_TYPES): + raise ValueError('name is not a string') required = providedBy(object) cache = self._getcache(provided, name) factory = cache.get(required, _not_in_mapping) |
