summaryrefslogtreecommitdiff
path: root/eventlet/support/dns/wiredata.py
diff options
context:
space:
mode:
Diffstat (limited to 'eventlet/support/dns/wiredata.py')
-rw-r--r--eventlet/support/dns/wiredata.py59
1 files changed, 39 insertions, 20 deletions
diff --git a/eventlet/support/dns/wiredata.py b/eventlet/support/dns/wiredata.py
index b381f7b..ccef595 100644
--- a/eventlet/support/dns/wiredata.py
+++ b/eventlet/support/dns/wiredata.py
@@ -15,6 +15,7 @@
"""DNS Wire Data Helper"""
+import sys
import dns.exception
from ._compat import binary_type, string_types
@@ -26,12 +27,16 @@ from ._compat import binary_type, string_types
# out what constant Python will use.
-class _SliceUnspecifiedBound(str):
+class _SliceUnspecifiedBound(binary_type):
- def __getslice__(self, i, j):
- return j
+ def __getitem__(self, key):
+ return key.stop
+
+ if sys.version_info < (3,):
+ def __getslice__(self, i, j): # pylint: disable=getslice-method
+ return self.__getitem__(slice(i, j))
-_unspecified_bound = _SliceUnspecifiedBound('')[1:]
+_unspecified_bound = _SliceUnspecifiedBound()[1:]
class WireData(binary_type):
@@ -40,26 +45,40 @@ class WireData(binary_type):
def __getitem__(self, key):
try:
if isinstance(key, slice):
- return WireData(super(WireData, self).__getitem__(key))
+ # make sure we are not going outside of valid ranges,
+ # do stricter control of boundaries than python does
+ # by default
+ start = key.start
+ stop = key.stop
+
+ if sys.version_info < (3,):
+ if stop == _unspecified_bound:
+ # handle the case where the right bound is unspecified
+ stop = len(self)
+
+ if start < 0 or stop < 0:
+ raise dns.exception.FormError
+ # If it's not an empty slice, access left and right bounds
+ # to make sure they're valid
+ if start != stop:
+ super(WireData, self).__getitem__(start)
+ super(WireData, self).__getitem__(stop - 1)
+ else:
+ for index in (start, stop):
+ if index is None:
+ continue
+ elif abs(index) > len(self):
+ raise dns.exception.FormError
+
+ return WireData(super(WireData, self).__getitem__(
+ slice(start, stop)))
return bytearray(self.unwrap())[key]
except IndexError:
raise dns.exception.FormError
- def __getslice__(self, i, j):
- try:
- if j == _unspecified_bound:
- # handle the case where the right bound is unspecified
- j = len(self)
- if i < 0 or j < 0:
- raise dns.exception.FormError
- # If it's not an empty slice, access left and right bounds
- # to make sure they're valid
- if i != j:
- super(WireData, self).__getitem__(i)
- super(WireData, self).__getitem__(j - 1)
- return WireData(super(WireData, self).__getslice__(i, j))
- except IndexError:
- raise dns.exception.FormError
+ if sys.version_info < (3,):
+ def __getslice__(self, i, j): # pylint: disable=getslice-method
+ return self.__getitem__(slice(i, j))
def __iter__(self):
i = 0