summaryrefslogtreecommitdiff
path: root/src/zope/interface/adapter.py
diff options
context:
space:
mode:
authorTres Seaver <tseaver@palladion.com>2017-05-04 05:47:11 -0400
committerTres Seaver <tseaver@palladion.com>2017-05-04 05:50:35 -0400
commit81f50ca16007d0eb6beb7a51b5bf32b6f1cb410a (patch)
treeedc824727e48fe64a1122be579e637c8aa7280a5 /src/zope/interface/adapter.py
parente42aa17c3d63360636b367ab2e6628d12a8ccd73 (diff)
downloadzope-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.py9
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)