Skip to content

Commit 9136246

Browse files
committed
Immutability for blake2 + test_freeze module
Signed-off-by: Matthew A Johnson <matjoh@microsoft.com>
1 parent 4024677 commit 9136246

8 files changed

Lines changed: 189 additions & 144 deletions

File tree

Lib/test/test_freeze/__init__.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import os
2+
from test.support import load_package_tests
3+
import unittest
4+
5+
6+
def load_tests(*args):
7+
return load_package_tests(os.path.dirname(__file__), *args)
8+
9+
10+
class BaseObjectTest(unittest.TestCase):
11+
def __init__(self, *args, obj=None, **kwargs):
12+
unittest.TestCase.__init__(self, *args, **kwargs)
13+
self.obj = obj
14+
15+
def setUp(self):
16+
freeze(self.obj)
17+
18+
def test_immutable(self):
19+
self.assertTrue(isimmutable(self.obj))
20+
21+
def test_add_attribute(self):
22+
freeze(self.obj)
23+
with self.assertRaises(NotWriteableError):
24+
self.obj.new_attribute = 'value'
25+
26+
def test_type_immutable(self):
27+
self.assertTrue(isimmutable(type(self.obj)))

Lib/test/test_freeze/__main__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from . import load_tests
2+
import unittest
3+
4+
unittest.main()

Lib/test/test_freeze/test_array.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from array import array
2+
from . import BaseObjectTest
3+
4+
5+
class TestArray(BaseObjectTest):
6+
def __init__(self, *args, **kwargs):
7+
obj = array('i', [1, 2, 3, 4])
8+
BaseObjectTest.__init__(self, *args, obj=obj, **kwargs)
9+
10+
def test_set_item(self):
11+
with self.assertRaises(NotWriteableError):
12+
self.obj[0] = 5
13+
14+
def test_set_slice(self):
15+
with self.assertRaises(NotWriteableError):
16+
self.obj[1:3] = [6, 7]
17+
18+
def test_append(self):
19+
with self.assertRaises(NotWriteableError):
20+
self.obj.append(8)
21+
22+
def test_extend(self):
23+
with self.assertRaises(NotWriteableError):
24+
self.obj.extend(array('i', [9]))
25+
26+
def test_insert(self):
27+
with self.assertRaises(NotWriteableError):
28+
self.obj.insert(0, 10)
29+
30+
def test_pop(self):
31+
with self.assertRaises(NotWriteableError):
32+
self.obj.pop()
33+
34+
def test_remove(self):
35+
with self.assertRaises(NotWriteableError):
36+
self.obj.remove(1)
37+
38+
def test_delete(self):
39+
with self.assertRaises(NotWriteableError):
40+
del self.obj[0]
41+
42+
def test_reverse(self):
43+
with self.assertRaises(NotWriteableError):
44+
self.obj.reverse()
45+
46+
def test_inplace_repeat(self):
47+
with self.assertRaises(NotWriteableError):
48+
self.obj *= 2
49+
50+
def test_inplace_concat(self):
51+
with self.assertRaises(NotWriteableError):
52+
self.obj += array('i', [11])
53+
54+
def test_byteswap(self):
55+
with self.assertRaises(NotWriteableError):
56+
self.obj.byteswap()
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
from collections import deque
2+
3+
from . import BaseObjectTest
4+
5+
class TestDeque(BaseObjectTest):
6+
class C:
7+
pass
8+
9+
def __init__(self, *args, **kwargs):
10+
obj = deque([self.C(), self.C(), 1, "two", None])
11+
BaseObjectTest.__init__(self, *args, obj=obj, **kwargs)
12+
13+
def test_set_item(self):
14+
with self.assertRaises(NotWriteableError):
15+
self.obj[0] = None
16+
17+
def test_append(self):
18+
with self.assertRaises(NotWriteableError):
19+
self.obj.append(TestDeque.C())
20+
21+
def test_appendleft(self):
22+
with self.assertRaises(NotWriteableError):
23+
self.obj.appendleft(TestDeque.C())
24+
25+
def test_extend(self):
26+
with self.assertRaises(NotWriteableError):
27+
self.obj.extend([TestDeque.C()])
28+
29+
def test_extendleft(self):
30+
with self.assertRaises(NotWriteableError):
31+
self.obj.extendleft([TestDeque.C()])
32+
33+
def test_insert(self):
34+
with self.assertRaises(NotWriteableError):
35+
self.obj.insert(0, TestDeque.C())
36+
37+
def test_pop(self):
38+
with self.assertRaises(NotWriteableError):
39+
self.obj.pop()
40+
41+
def test_popleft(self):
42+
with self.assertRaises(NotWriteableError):
43+
self.obj.popleft()
44+
45+
def test_remove(self):
46+
with self.assertRaises(NotWriteableError):
47+
self.obj.remove(1)
48+
49+
def test_delete(self):
50+
with self.assertRaises(NotWriteableError):
51+
del self.obj[0]
52+
53+
def test_inplace_repeat(self):
54+
with self.assertRaises(NotWriteableError):
55+
self.obj *= 2
56+
57+
def test_inplace_concat(self):
58+
with self.assertRaises(NotWriteableError):
59+
self.obj += [TestDeque.C()]
60+
61+
def test_reverse(self):
62+
with self.assertRaises(NotWriteableError):
63+
self.obj.reverse()
64+
65+
def test_rotate(self):
66+
with self.assertRaises(NotWriteableError):
67+
self.obj.rotate(1)
68+
69+
def test_clear(self):
70+
with self.assertRaises(NotWriteableError):
71+
self.obj.clear()
Lines changed: 3 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import unittest
2-
from collections import deque
3-
from array import array
2+
3+
from . import BaseObjectTest
4+
45

56
# This is a canary to check that global variables are not made immutable
67
# when others are made immutable
@@ -19,25 +20,6 @@ class MutableGlobalTest(unittest.TestCase):
1920
def test_global_mutable(self):
2021
self.assertTrue(not isimmutable(global_canary))
2122

22-
class BaseObjectTest(unittest.TestCase):
23-
def __init__(self, *args, obj=None, **kwargs):
24-
unittest.TestCase.__init__(self, *args, **kwargs)
25-
self.obj = obj
26-
27-
def setUp(self):
28-
freeze(self.obj)
29-
30-
def test_immutable(self):
31-
self.assertTrue(isimmutable(self.obj))
32-
33-
def test_add_attribute(self):
34-
freeze(self.obj)
35-
with self.assertRaises(NotWriteableError):
36-
self.obj.new_attribute = 'value'
37-
38-
def test_type_immutable(self):
39-
self.assertTrue(isimmutable(type(self.obj)))
40-
4123

4224
class TestBasicObject(BaseObjectTest):
4325
class C:
@@ -120,129 +102,6 @@ def test_sort(self):
120102
self.obj.sort()
121103

122104

123-
class TestDeque(BaseObjectTest):
124-
class C:
125-
pass
126-
127-
def __init__(self, *args, **kwargs):
128-
obj = deque([self.C(), self.C(), 1, "two", None])
129-
BaseObjectTest.__init__(self, *args, obj=obj, **kwargs)
130-
131-
def test_set_item(self):
132-
with self.assertRaises(NotWriteableError):
133-
self.obj[0] = None
134-
135-
def test_append(self):
136-
with self.assertRaises(NotWriteableError):
137-
self.obj.append(TestList.C())
138-
139-
def test_appendleft(self):
140-
with self.assertRaises(NotWriteableError):
141-
self.obj.appendleft(TestList.C())
142-
143-
def test_extend(self):
144-
with self.assertRaises(NotWriteableError):
145-
self.obj.extend([TestList.C()])
146-
147-
def test_extendleft(self):
148-
with self.assertRaises(NotWriteableError):
149-
self.obj.extendleft([TestList.C()])
150-
151-
def test_insert(self):
152-
with self.assertRaises(NotWriteableError):
153-
self.obj.insert(0, TestList.C())
154-
155-
def test_pop(self):
156-
with self.assertRaises(NotWriteableError):
157-
self.obj.pop()
158-
159-
def test_popleft(self):
160-
with self.assertRaises(NotWriteableError):
161-
self.obj.popleft()
162-
163-
def test_remove(self):
164-
with self.assertRaises(NotWriteableError):
165-
self.obj.remove(1)
166-
167-
def test_delete(self):
168-
with self.assertRaises(NotWriteableError):
169-
del self.obj[0]
170-
171-
def test_inplace_repeat(self):
172-
with self.assertRaises(NotWriteableError):
173-
self.obj *= 2
174-
175-
def test_inplace_concat(self):
176-
with self.assertRaises(NotWriteableError):
177-
self.obj += [TestList.C()]
178-
179-
def test_reverse(self):
180-
with self.assertRaises(NotWriteableError):
181-
self.obj.reverse()
182-
183-
def test_rotate(self):
184-
with self.assertRaises(NotWriteableError):
185-
self.obj.rotate(1)
186-
187-
def test_clear(self):
188-
with self.assertRaises(NotWriteableError):
189-
self.obj.clear()
190-
191-
192-
class TestArray(BaseObjectTest):
193-
def __init__(self, *args, **kwargs):
194-
obj = array('i', [1, 2, 3, 4])
195-
BaseObjectTest.__init__(self, *args, obj=obj, **kwargs)
196-
197-
def test_set_item(self):
198-
with self.assertRaises(NotWriteableError):
199-
self.obj[0] = 5
200-
201-
def test_set_slice(self):
202-
with self.assertRaises(NotWriteableError):
203-
self.obj[1:3] = [6, 7]
204-
205-
def test_append(self):
206-
with self.assertRaises(NotWriteableError):
207-
self.obj.append(8)
208-
209-
def test_extend(self):
210-
with self.assertRaises(NotWriteableError):
211-
self.obj.extend(array('i', [9]))
212-
213-
def test_insert(self):
214-
with self.assertRaises(NotWriteableError):
215-
self.obj.insert(0, 10)
216-
217-
def test_pop(self):
218-
with self.assertRaises(NotWriteableError):
219-
self.obj.pop()
220-
221-
def test_remove(self):
222-
with self.assertRaises(NotWriteableError):
223-
self.obj.remove(1)
224-
225-
def test_delete(self):
226-
with self.assertRaises(NotWriteableError):
227-
del self.obj[0]
228-
229-
def test_reverse(self):
230-
with self.assertRaises(NotWriteableError):
231-
self.obj.reverse()
232-
233-
def test_inplace_repeat(self):
234-
with self.assertRaises(NotWriteableError):
235-
self.obj *= 2
236-
237-
def test_inplace_concat(self):
238-
with self.assertRaises(NotWriteableError):
239-
self.obj += array('i', [11])
240-
241-
def test_byteswap(self):
242-
with self.assertRaises(NotWriteableError):
243-
self.obj.byteswap()
244-
245-
246105
class TestDict(BaseObjectTest):
247106
class C:
248107
pass
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from hashlib import blake2b, blake2s
2+
import unittest
3+
4+
5+
class TestHashlib(unittest.TestCase):
6+
def test_blake2b(self):
7+
h = blake2b(digest_size=32)
8+
h.update(b'Hello world')
9+
freeze(h)
10+
with self.assertRaises(NotWriteableError):
11+
h.update(b'!')
12+
13+
def test_blake2s(self):
14+
h = blake2s(digest_size=32)
15+
h.update(b'Hello world')
16+
freeze(h)
17+
with self.assertRaises(NotWriteableError):
18+
h.update(b'!')

Modules/_blake2/blake2b_impl.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include "Python.h"
2121
#include "pycore_strhex.h" // _Py_strhex()
22+
#include "pycore_object.h" // Py_CHECKWRITE
2223

2324
#include "../hashlib.h"
2425
#include "blake2module.h"
@@ -276,6 +277,10 @@ _blake2_blake2b_update(BLAKE2bObject *self, PyObject *data)
276277
{
277278
Py_buffer buf;
278279

280+
if(!Py_CHECKWRITE(self)){
281+
return PyErr_WriteToImmutable(self);
282+
}
283+
279284
GET_BUFFER_VIEW_OR_ERROUT(data, &buf);
280285

281286
if (self->lock == NULL && buf.len >= HASHLIB_GIL_MINSIZE)

Modules/_blake2/blake2s_impl.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include "Python.h"
2121
#include "pycore_strhex.h" // _Py_strhex()
22+
#include "pycore_object.h" // Py_CHECKWRITE
2223

2324
#include "../hashlib.h"
2425
#include "blake2module.h"
@@ -276,6 +277,10 @@ _blake2_blake2s_update(BLAKE2sObject *self, PyObject *data)
276277
{
277278
Py_buffer buf;
278279

280+
if(!Py_CHECKWRITE(self)){
281+
return PyErr_WriteToImmutable(self);
282+
}
283+
279284
GET_BUFFER_VIEW_OR_ERROUT(data, &buf);
280285

281286
if (self->lock == NULL && buf.len >= HASHLIB_GIL_MINSIZE)

0 commit comments

Comments
 (0)