Skip to content

Commit ebe5d45

Browse files
committed
fix: reject str in update() and tp_init via y* format
Replace s* with y* in all PyArg_ParseTuple/PyArg_ParseTupleAndKeywords calls, matching hashlib behavior where strings are rejected at all entry points: one-shot, constructor, update, and tp_init.
1 parent db87d55 commit ebe5d45

5 files changed

Lines changed: 48 additions & 48 deletions

File tree

src/_xxhash.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,7 @@ static int PYXXH32_init(PYXXH32Object *self, PyObject *args, PyObject *kwargs)
554554

555555
buf.buf = buf.obj = NULL;
556556

557-
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s*I:__init__", keywords, &buf, &seed)) {
557+
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|y*I:__init__", keywords, &buf, &seed)) {
558558
return -1;
559559
}
560560

@@ -580,7 +580,7 @@ static PyObject *PYXXH32_update(PYXXH32Object *self, PyObject *args)
580580

581581
buf.buf = buf.obj = NULL;
582582

583-
if (!PyArg_ParseTuple(args, "s*:update", &buf)) {
583+
if (!PyArg_ParseTuple(args, "y*:update", &buf)) {
584584
return NULL;
585585
}
586586

@@ -910,7 +910,7 @@ static int PYXXH64_init(PYXXH64Object *self, PyObject *args, PyObject *kwargs)
910910

911911
buf.buf = buf.obj = NULL;
912912

913-
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s*K:__init__", keywords, &buf, &seed)) {
913+
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|y*K:__init__", keywords, &buf, &seed)) {
914914
return -1;
915915
}
916916

@@ -936,7 +936,7 @@ static PyObject *PYXXH64_update(PYXXH64Object *self, PyObject *args)
936936

937937
buf.buf = buf.obj = NULL;
938938

939-
if (!PyArg_ParseTuple(args, "s*:update", &buf)) {
939+
if (!PyArg_ParseTuple(args, "y*:update", &buf)) {
940940
return NULL;
941941
}
942942

@@ -1265,7 +1265,7 @@ static int PYXXH3_64_init(PYXXH3_64Object *self, PyObject *args, PyObject *kwarg
12651265

12661266
buf.buf = buf.obj = NULL;
12671267

1268-
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s*K:__init__", keywords, &buf, &seed)) {
1268+
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|y*K:__init__", keywords, &buf, &seed)) {
12691269
return -1;
12701270
}
12711271

@@ -1291,7 +1291,7 @@ static PyObject *PYXXH3_64_update(PYXXH3_64Object *self, PyObject *args)
12911291

12921292
buf.buf = buf.obj = NULL;
12931293

1294-
if (!PyArg_ParseTuple(args, "s*:update", &buf)) {
1294+
if (!PyArg_ParseTuple(args, "y*:update", &buf)) {
12951295
return NULL;
12961296
}
12971297

@@ -1629,7 +1629,7 @@ static int PYXXH3_128_init(PYXXH3_128Object *self, PyObject *args, PyObject *kwa
16291629

16301630
buf.buf = buf.obj = NULL;
16311631

1632-
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s*K:__init__", keywords, &buf, &seed)) {
1632+
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|y*K:__init__", keywords, &buf, &seed)) {
16331633
return -1;
16341634
}
16351635

@@ -1654,7 +1654,7 @@ static PyObject *PYXXH3_128_update(PYXXH3_128Object *self, PyObject *args)
16541654
Py_buffer buf;
16551655
buf.buf = buf.obj = NULL;
16561656

1657-
if (!PyArg_ParseTuple(args, "s*:update", &buf)) {
1657+
if (!PyArg_ParseTuple(args, "y*:update", &buf)) {
16581658
return NULL;
16591659
}
16601660

tests/test_xxh32.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,25 @@ def test_xxh32_intdigest(self):
1919

2020
def test_xxh32_update(self):
2121
x = xxhash.xxh32()
22-
x.update('a')
22+
x.update(b'a')
2323
self.assertEqual(xxhash.xxh32(b'a').digest(), x.digest())
2424
self.assertEqual(xxhash.xxh32_digest(b'a'), x.digest())
25-
x.update('b')
25+
x.update(b'b')
2626
self.assertEqual(xxhash.xxh32(b'ab').digest(), x.digest())
2727
self.assertEqual(xxhash.xxh32_digest(b'ab'), x.digest())
28-
x.update('c')
28+
x.update(b'c')
2929
self.assertEqual(xxhash.xxh32(b'abc').digest(), x.digest())
3030
self.assertEqual(xxhash.xxh32_digest(b'abc'), x.digest())
3131

3232
seed = random.randint(0, 2**32)
3333
x = xxhash.xxh32(seed=seed)
34-
x.update('a')
34+
x.update(b'a')
3535
self.assertEqual(xxhash.xxh32(b'a', seed).digest(), x.digest())
3636
self.assertEqual(xxhash.xxh32_digest(b'a', seed), x.digest())
37-
x.update('b')
37+
x.update(b'b')
3838
self.assertEqual(xxhash.xxh32(b'ab', seed).digest(), x.digest())
3939
self.assertEqual(xxhash.xxh32_digest(b'ab', seed), x.digest())
40-
x.update('c')
40+
x.update(b'c')
4141
self.assertEqual(xxhash.xxh32(b'abc', seed).digest(), x.digest())
4242
self.assertEqual(xxhash.xxh32_digest(b'abc', seed), x.digest())
4343

@@ -54,19 +54,19 @@ def test_xxh32_reset(self):
5454

5555
def test_xxh32_copy(self):
5656
a = xxhash.xxh32()
57-
a.update('xxhash')
57+
a.update(b'xxhash')
5858

5959
b = a.copy()
6060
self.assertEqual(a.digest(), b.digest())
6161
self.assertEqual(a.intdigest(), b.intdigest())
6262
self.assertEqual(a.hexdigest(), b.hexdigest())
6363

64-
b.update('xxhash')
64+
b.update(b'xxhash')
6565
self.assertNotEqual(a.digest(), b.digest())
6666
self.assertNotEqual(a.intdigest(), b.intdigest())
6767
self.assertNotEqual(a.hexdigest(), b.hexdigest())
6868

69-
a.update('xxhash')
69+
a.update(b'xxhash')
7070
self.assertEqual(a.digest(), b.digest())
7171
self.assertEqual(a.intdigest(), b.intdigest())
7272
self.assertEqual(a.hexdigest(), b.hexdigest())

tests/test_xxh3_128.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,40 +19,40 @@ def test_xxh3_128_intdigest(self):
1919

2020
def test_xxh3_128_update(self):
2121
x = xxhash.xxh3_128()
22-
x.update('a')
22+
x.update(b'a')
2323
self.assertEqual(xxhash.xxh3_128(b'a').digest(), x.digest())
2424
self.assertEqual(xxhash.xxh3_128_digest(b'a'), x.digest())
25-
x.update('b')
25+
x.update(b'b')
2626
self.assertEqual(xxhash.xxh3_128(b'ab').digest(), x.digest())
2727
self.assertEqual(xxhash.xxh3_128_digest(b'ab'), x.digest())
28-
x.update('c')
28+
x.update(b'c')
2929
self.assertEqual(xxhash.xxh3_128(b'abc').digest(), x.digest())
3030
self.assertEqual(xxhash.xxh3_128_digest(b'abc'), x.digest())
3131

3232
seed = random.randint(0, 2**64)
3333
x = xxhash.xxh3_128(seed=seed)
34-
x.update('a')
34+
x.update(b'a')
3535
self.assertEqual(xxhash.xxh3_128(b'a', seed).digest(), x.digest())
3636
self.assertEqual(xxhash.xxh3_128_digest(b'a', seed), x.digest())
37-
x.update('b')
37+
x.update(b'b')
3838
self.assertEqual(xxhash.xxh3_128(b'ab', seed).digest(), x.digest())
3939
self.assertEqual(xxhash.xxh3_128_digest(b'ab', seed), x.digest())
40-
x.update('c')
40+
x.update(b'c')
4141
self.assertEqual(xxhash.xxh3_128(b'abc', seed).digest(), x.digest())
4242
self.assertEqual(xxhash.xxh3_128_digest(b'abc', seed), x.digest())
4343

4444
def test_xxh3_128_reset(self):
4545
x = xxhash.xxh3_128()
4646
h = x.intdigest()
47-
x.update('x' * 10240)
47+
x.update(b'x' * 10240)
4848
x.reset()
4949
self.assertEqual(h, x.intdigest())
5050

5151
def test_xxh3_128_seed_reset(self):
5252
seed = random.randint(0, 2**64-1)
5353
x = xxhash.xxh3_128(seed=seed)
5454
h = x.intdigest()
55-
x.update('x' * 10240)
55+
x.update(b'x' * 10240)
5656
x.reset()
5757
self.assertEqual(h, x.intdigest())
5858

@@ -97,19 +97,19 @@ def test_xxh3_128_seed_reset_more(self):
9797

9898
def test_xxh3_128_copy(self):
9999
a = xxhash.xxh3_128()
100-
a.update('xxhash')
100+
a.update(b'xxhash')
101101

102102
b = a.copy()
103103
self.assertEqual(a.digest(), b.digest())
104104
self.assertEqual(a.intdigest(), b.intdigest())
105105
self.assertEqual(a.hexdigest(), b.hexdigest())
106106

107-
b.update('xxhash')
107+
b.update(b'xxhash')
108108
self.assertNotEqual(a.digest(), b.digest())
109109
self.assertNotEqual(a.intdigest(), b.intdigest())
110110
self.assertNotEqual(a.hexdigest(), b.hexdigest())
111111

112-
a.update('xxhash')
112+
a.update(b'xxhash')
113113
self.assertEqual(a.digest(), b.digest())
114114
self.assertEqual(a.intdigest(), b.intdigest())
115115
self.assertEqual(a.hexdigest(), b.hexdigest())

tests/test_xxh3_64.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,33 +21,33 @@ def test_xxh3_64_intdigest(self):
2121

2222
def test_xxh3_64_update(self):
2323
x = xxhash.xxh3_64()
24-
x.update('a')
24+
x.update(b'a')
2525
self.assertEqual(xxhash.xxh3_64(b'a').digest(), x.digest())
2626
self.assertEqual(xxhash.xxh3_64_digest(b'a'), x.digest())
27-
x.update('b')
27+
x.update(b'b')
2828
self.assertEqual(xxhash.xxh3_64(b'ab').digest(), x.digest())
2929
self.assertEqual(xxhash.xxh3_64_digest(b'ab'), x.digest())
30-
x.update('c')
30+
x.update(b'c')
3131
self.assertEqual(xxhash.xxh3_64(b'abc').digest(), x.digest())
3232
self.assertEqual(xxhash.xxh3_64_digest(b'abc'), x.digest())
3333

3434
seed = random.randint(0, 2**64)
3535
x = xxhash.xxh3_64(seed=seed)
36-
x.update('a')
36+
x.update(b'a')
3737
self.assertEqual(xxhash.xxh3_64(b'a', seed).digest(), x.digest())
3838
self.assertEqual(xxhash.xxh3_64_digest(b'a', seed), x.digest())
39-
x.update('b')
39+
x.update(b'b')
4040
self.assertEqual(xxhash.xxh3_64(b'ab', seed).digest(), x.digest())
4141
self.assertEqual(xxhash.xxh3_64_digest(b'ab', seed), x.digest())
42-
x.update('c')
42+
x.update(b'c')
4343
self.assertEqual(xxhash.xxh3_64(b'abc', seed).digest(), x.digest())
4444
self.assertEqual(xxhash.xxh3_64_digest(b'abc', seed), x.digest())
4545

4646
def test_xxh3_64_reset(self):
4747
x = xxhash.xxh3_64()
4848
h = x.intdigest()
4949

50-
x.update('x' * 10240)
50+
x.update(b'x' * 10240)
5151
x.reset()
5252

5353
self.assertEqual(h, x.intdigest())
@@ -56,7 +56,7 @@ def test_xxh3_64_seed_reset(self):
5656
seed = random.randint(0, 2**64-1)
5757
x = xxhash.xxh3_64(seed=seed)
5858
h = x.intdigest()
59-
x.update('x' * 10240)
59+
x.update(b'x' * 10240)
6060
x.reset()
6161
self.assertEqual(h, x.intdigest())
6262

@@ -105,19 +105,19 @@ def test_xxh3_64_seed_reset_more(self):
105105

106106
def test_xxh3_64_copy(self):
107107
a = xxhash.xxh3_64()
108-
a.update('xxhash')
108+
a.update(b'xxhash')
109109

110110
b = a.copy()
111111
self.assertEqual(a.digest(), b.digest())
112112
self.assertEqual(a.intdigest(), b.intdigest())
113113
self.assertEqual(a.hexdigest(), b.hexdigest())
114114

115-
b.update('xxhash')
115+
b.update(b'xxhash')
116116
self.assertNotEqual(a.digest(), b.digest())
117117
self.assertNotEqual(a.intdigest(), b.intdigest())
118118
self.assertNotEqual(a.hexdigest(), b.hexdigest())
119119

120-
a.update('xxhash')
120+
a.update(b'xxhash')
121121
self.assertEqual(a.digest(), b.digest())
122122
self.assertEqual(a.intdigest(), b.intdigest())
123123
self.assertEqual(a.hexdigest(), b.hexdigest())

tests/test_xxh64.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,25 @@ def test_xxh64_intdigest(self):
1818

1919
def test_xxh64_update(self):
2020
x = xxhash.xxh64()
21-
x.update('a')
21+
x.update(b'a')
2222
self.assertEqual(xxhash.xxh64(b'a').digest(), x.digest())
2323
self.assertEqual(xxhash.xxh64_digest(b'a'), x.digest())
24-
x.update('b')
24+
x.update(b'b')
2525
self.assertEqual(xxhash.xxh64(b'ab').digest(), x.digest())
2626
self.assertEqual(xxhash.xxh64_digest(b'ab'), x.digest())
27-
x.update('c')
27+
x.update(b'c')
2828
self.assertEqual(xxhash.xxh64(b'abc').digest(), x.digest())
2929
self.assertEqual(xxhash.xxh64_digest(b'abc'), x.digest())
3030

3131
seed = random.randint(0, 2**64)
3232
x = xxhash.xxh64(seed=seed)
33-
x.update('a')
33+
x.update(b'a')
3434
self.assertEqual(xxhash.xxh64(b'a', seed).digest(), x.digest())
3535
self.assertEqual(xxhash.xxh64_digest(b'a', seed), x.digest())
36-
x.update('b')
36+
x.update(b'b')
3737
self.assertEqual(xxhash.xxh64(b'ab', seed).digest(), x.digest())
3838
self.assertEqual(xxhash.xxh64_digest(b'ab', seed), x.digest())
39-
x.update('c')
39+
x.update(b'c')
4040
self.assertEqual(xxhash.xxh64(b'abc', seed).digest(), x.digest())
4141
self.assertEqual(xxhash.xxh64_digest(b'abc', seed), x.digest())
4242

@@ -53,19 +53,19 @@ def test_xxh64_reset(self):
5353

5454
def test_xxh64_copy(self):
5555
a = xxhash.xxh64()
56-
a.update('xxhash')
56+
a.update(b'xxhash')
5757

5858
b = a.copy()
5959
self.assertEqual(a.digest(), b.digest())
6060
self.assertEqual(a.intdigest(), b.intdigest())
6161
self.assertEqual(a.hexdigest(), b.hexdigest())
6262

63-
b.update('xxhash')
63+
b.update(b'xxhash')
6464
self.assertNotEqual(a.digest(), b.digest())
6565
self.assertNotEqual(a.intdigest(), b.intdigest())
6666
self.assertNotEqual(a.hexdigest(), b.hexdigest())
6767

68-
a.update('xxhash')
68+
a.update(b'xxhash')
6969
self.assertEqual(a.digest(), b.digest())
7070
self.assertEqual(a.intdigest(), b.intdigest())
7171
self.assertEqual(a.hexdigest(), b.hexdigest())

0 commit comments

Comments
 (0)