def test_bad_stack(self):
badpickles = [
'.', # STOP
'0', # POP
'1', # POP_MARK
'2', # DUP
# '(2', # PyUnpickler doesn't raise
'R', # REDUCE
')R',
'a', # APPEND
'Na',
'b', # BUILD
'Nb',
'd', # DICT
'e', # APPENDS
# '(e', # PyUnpickler raises AttributeError
'i__builtin__\nlist\n', # INST
'l', # LIST
'o', # OBJ
'(o',
'p1\n', # PUT
'q\x00', # BINPUT
'r\x00\x00\x00\x00', # LONG_BINPUT
's', # SETITEM
'Ns',
'NNs',
't', # TUPLE
'u', # SETITEMS
# '(u', # PyUnpickler doesn't raise
'}(Nu',
'\x81', # NEWOBJ
')\x81',
'\x85', # TUPLE1
'\x86', # TUPLE2
'N\x86',
'\x87', # TUPLE3
'N\x87',
'NN\x87',
]
for p in badpickles:
self.check_unpickling_error(self.bad_stack_errors, p)
python类SETITEM的实例源码
def test_bad_mark(self):
badpickles = [
# 'N(.', # STOP
'N(2', # DUP
'c__builtin__\nlist\n)(R', # REDUCE
'c__builtin__\nlist\n()R',
']N(a', # APPEND
# BUILD
'c__builtin__\nValueError\n)R}(b',
'c__builtin__\nValueError\n)R(}b',
'(Nd', # DICT
'N(p1\n', # PUT
'N(q\x00', # BINPUT
'N(r\x00\x00\x00\x00', # LONG_BINPUT
'}NN(s', # SETITEM
'}N(Ns',
'}(NNs',
'}((u', # SETITEMS
# NEWOBJ
'c__builtin__\nlist\n)(\x81',
'c__builtin__\nlist\n()\x81',
'N(\x85', # TUPLE1
'NN(\x86', # TUPLE2
'N(N\x86',
'NNN(\x87', # TUPLE3
'NN(N\x87',
'N(NN\x87',
]
for p in badpickles:
self.check_unpickling_error(self.bad_mark_errors, p)
def test_setitems_on_non_dicts(self):
obj = REX_seven({1: -1, 2: -2, 3: -3})
for proto in protocols:
if proto == 0:
self._check_pickling_with_opcode(obj, pickle.SETITEM, proto)
else:
self._check_pickling_with_opcode(obj, pickle.SETITEMS, proto)
# Test classes for reduce_ex
def test_bad_stack(self):
badpickles = [
'.', # STOP
'0', # POP
'1', # POP_MARK
'2', # DUP
# '(2', # PyUnpickler doesn't raise
'R', # REDUCE
')R',
'a', # APPEND
'Na',
'b', # BUILD
'Nb',
'd', # DICT
'e', # APPENDS
# '(e', # PyUnpickler raises AttributeError
'i__builtin__\nlist\n', # INST
'l', # LIST
'o', # OBJ
'(o',
'p1\n', # PUT
'q\x00', # BINPUT
'r\x00\x00\x00\x00', # LONG_BINPUT
's', # SETITEM
'Ns',
'NNs',
't', # TUPLE
'u', # SETITEMS
# '(u', # PyUnpickler doesn't raise
'}(Nu',
'\x81', # NEWOBJ
')\x81',
'\x85', # TUPLE1
'\x86', # TUPLE2
'N\x86',
'\x87', # TUPLE3
'N\x87',
'NN\x87',
]
for p in badpickles:
self.check_unpickling_error(self.bad_stack_errors, p)
def test_bad_mark(self):
badpickles = [
# 'N(.', # STOP
'N(2', # DUP
'c__builtin__\nlist\n)(R', # REDUCE
'c__builtin__\nlist\n()R',
']N(a', # APPEND
# BUILD
'c__builtin__\nValueError\n)R}(b',
'c__builtin__\nValueError\n)R(}b',
'(Nd', # DICT
'N(p1\n', # PUT
'N(q\x00', # BINPUT
'N(r\x00\x00\x00\x00', # LONG_BINPUT
'}NN(s', # SETITEM
'}N(Ns',
'}(NNs',
'}((u', # SETITEMS
# NEWOBJ
'c__builtin__\nlist\n)(\x81',
'c__builtin__\nlist\n()\x81',
'N(\x85', # TUPLE1
'NN(\x86', # TUPLE2
'N(N\x86',
'NNN(\x87', # TUPLE3
'NN(N\x87',
'N(NN\x87',
]
for p in badpickles:
self.check_unpickling_error(self.bad_mark_errors, p)
def test_setitems_on_non_dicts(self):
obj = REX_seven({1: -1, 2: -2, 3: -3})
for proto in protocols:
if proto == 0:
self._check_pickling_with_opcode(obj, pickle.SETITEM, proto)
else:
self._check_pickling_with_opcode(obj, pickle.SETITEMS, proto)
# Test classes for reduce_ex
def test_setitems_on_non_dicts(self):
obj = REX_seven({1: -1, 2: -2, 3: -3})
for proto in protocols:
if proto == 0:
self._check_pickling_with_opcode(obj, pickle.SETITEM, proto)
else:
self._check_pickling_with_opcode(obj, pickle.SETITEMS, proto)
def test_bad_mark(self):
badpickles = [
# b'N(.', # STOP
b'N(2', # DUP
b'cbuiltins\nlist\n)(R', # REDUCE
b'cbuiltins\nlist\n()R',
b']N(a', # APPEND
# BUILD
b'cbuiltins\nValueError\n)R}(b',
b'cbuiltins\nValueError\n)R(}b',
b'(Nd', # DICT
b'N(p1\n', # PUT
b'N(q\x00', # BINPUT
b'N(r\x00\x00\x00\x00', # LONG_BINPUT
b'}NN(s', # SETITEM
b'}N(Ns',
b'}(NNs',
b'}((u', # SETITEMS
b'cbuiltins\nlist\n)(\x81', # NEWOBJ
b'cbuiltins\nlist\n()\x81',
b'N(\x85', # TUPLE1
b'NN(\x86', # TUPLE2
b'N(N\x86',
b'NNN(\x87', # TUPLE3
b'NN(N\x87',
b'N(NN\x87',
b']((\x90', # ADDITEMS
# NEWOBJ_EX
b'cbuiltins\nlist\n)}(\x92',
b'cbuiltins\nlist\n)(}\x92',
b'cbuiltins\nlist\n()}\x92',
# STACK_GLOBAL
b'Vbuiltins\n(Vlist\n\x93',
b'Vbuiltins\nVlist\n(\x93',
b'N(\x94', # MEMOIZE
]
for p in badpickles:
self.check_unpickling_error(self.bad_mark_errors, p)
def test_setitems_on_non_dicts(self):
obj = REX_seven({1: -1, 2: -2, 3: -3})
for proto in protocols:
if proto == 0:
self._check_pickling_with_opcode(obj, pickle.SETITEM, proto)
else:
self._check_pickling_with_opcode(obj, pickle.SETITEMS, proto)
# Exercise framing (proto >= 4) for significant workloads
def test_setitems_on_non_dicts(self):
obj = REX_seven({1: -1, 2: -2, 3: -3})
for proto in protocols:
if proto == 0:
self._check_pickling_with_opcode(obj, pickle.SETITEM, proto)
else:
self._check_pickling_with_opcode(obj, pickle.SETITEMS, proto)
# Exercise framing (proto >= 4) for significant workloads
def test_bad_stack(self):
badpickles = [
b'.', # STOP
b'0', # POP
b'1', # POP_MARK
b'2', # DUP
# b'(2', # PyUnpickler doesn't raise
b'R', # REDUCE
b')R',
b'a', # APPEND
b'Na',
b'b', # BUILD
b'Nb',
b'd', # DICT
b'e', # APPENDS
# b'(e', # PyUnpickler raises AttributeError
b'ibuiltins\nlist\n', # INST
b'l', # LIST
b'o', # OBJ
b'(o',
b'p1\n', # PUT
b'q\x00', # BINPUT
b'r\x00\x00\x00\x00', # LONG_BINPUT
b's', # SETITEM
b'Ns',
b'NNs',
b't', # TUPLE
b'u', # SETITEMS
# b'(u', # PyUnpickler doesn't raise
b'}(Nu',
b'\x81', # NEWOBJ
b')\x81',
b'\x85', # TUPLE1
b'\x86', # TUPLE2
b'N\x86',
b'\x87', # TUPLE3
b'N\x87',
b'NN\x87',
b'\x90', # ADDITEMS
# b'(\x90', # PyUnpickler raises AttributeError
b'\x91', # FROZENSET
b'\x92', # NEWOBJ_EX
b')}\x92',
b'\x93', # STACK_GLOBAL
b'Vlist\n\x93',
b'\x94', # MEMOIZE
]
for p in badpickles:
self.check_unpickling_error(self.bad_stack_errors, p)