Skip to content

Commit 922cfec

Browse files
authored
gh-111178: fix UBSan failures in Modules/{blake2,md5,sha1,sha2,sha3}module.c (GH-128248)
- fix UBSan failures in `blake2module.c` - fix UBSan failures in `md5module.c` - fix UBSan failures in `sha1module.c` - fix UBSan failures in `sha2module.c` - fix UBSan failures in `sha3module.c` Cosmetics: - suppress unused return values - remove redundant casts in constructors - suppress unused parameters in `{md5,sha*,blake2}module.c`
1 parent 735f25c commit 922cfec

File tree

5 files changed

+98
-112
lines changed

5 files changed

+98
-112
lines changed

Modules/blake2module.c

+13-10
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,8 @@ typedef struct {
366366
PyMutex mutex;
367367
} Blake2Object;
368368

369+
#define _Blake2Object_CAST(op) ((Blake2Object *)(op))
370+
369371
#include "clinic/blake2module.c.h"
370372

371373
/*[clinic input]
@@ -849,24 +851,27 @@ static PyMethodDef py_blake2b_methods[] = {
849851

850852

851853
static PyObject *
852-
py_blake2b_get_name(Blake2Object *self, void *closure)
854+
py_blake2b_get_name(PyObject *op, void *Py_UNUSED(closure))
853855
{
856+
Blake2Object *self = _Blake2Object_CAST(op);
854857
return PyUnicode_FromString(is_blake2b(self->impl) ? "blake2b" : "blake2s");
855858
}
856859

857860

858861

859862
static PyObject *
860-
py_blake2b_get_block_size(Blake2Object *self, void *closure)
863+
py_blake2b_get_block_size(PyObject *op, void *Py_UNUSED(closure))
861864
{
865+
Blake2Object *self = _Blake2Object_CAST(op);
862866
return PyLong_FromLong(is_blake2b(self->impl) ? HACL_HASH_BLAKE2B_BLOCK_BYTES : HACL_HASH_BLAKE2S_BLOCK_BYTES);
863867
}
864868

865869

866870

867871
static PyObject *
868-
py_blake2b_get_digest_size(Blake2Object *self, void *closure)
872+
py_blake2b_get_digest_size(PyObject *op, void *Py_UNUSED(closure))
869873
{
874+
Blake2Object *self = _Blake2Object_CAST(op);
870875
switch (self->impl) {
871876
#if HACL_CAN_COMPILE_SIMD256
872877
case Blake2b_256:
@@ -887,15 +892,13 @@ py_blake2b_get_digest_size(Blake2Object *self, void *closure)
887892

888893

889894
static PyGetSetDef py_blake2b_getsetters[] = {
890-
{"name", (getter)py_blake2b_get_name,
891-
NULL, NULL, NULL},
892-
{"block_size", (getter)py_blake2b_get_block_size,
893-
NULL, NULL, NULL},
894-
{"digest_size", (getter)py_blake2b_get_digest_size,
895-
NULL, NULL, NULL},
896-
{NULL}
895+
{"name", py_blake2b_get_name, NULL, NULL, NULL},
896+
{"block_size", py_blake2b_get_block_size, NULL, NULL, NULL},
897+
{"digest_size", py_blake2b_get_digest_size, NULL, NULL, NULL},
898+
{NULL} /* Sentinel */
897899
};
898900

901+
899902
static int
900903
py_blake2_clear(PyObject *op)
901904
{

Modules/md5module.c

+12-18
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ typedef struct {
5454
Hacl_Hash_MD5_state_t *hash_state;
5555
} MD5object;
5656

57+
#define _MD5object_CAST(op) ((MD5object *)(op))
58+
5759
#include "clinic/md5module.c.h"
5860

5961

@@ -72,7 +74,7 @@ md5_get_state(PyObject *module)
7274
static MD5object *
7375
newMD5object(MD5State * st)
7476
{
75-
MD5object *md5 = (MD5object *)PyObject_GC_New(MD5object, st->md5_type);
77+
MD5object *md5 = PyObject_GC_New(MD5object, st->md5_type);
7678
if (!md5) {
7779
return NULL;
7880
}
@@ -91,10 +93,11 @@ MD5_traverse(PyObject *ptr, visitproc visit, void *arg)
9193
}
9294

9395
static void
94-
MD5_dealloc(MD5object *ptr)
96+
MD5_dealloc(PyObject *op)
9597
{
98+
MD5object *ptr = _MD5object_CAST(op);
9699
Hacl_Hash_MD5_free(ptr->hash_state);
97-
PyTypeObject *tp = Py_TYPE((PyObject*)ptr);
100+
PyTypeObject *tp = Py_TYPE(op);
98101
PyObject_GC_UnTrack(ptr);
99102
PyObject_GC_Del(ptr);
100103
Py_DECREF(tp);
@@ -224,36 +227,27 @@ static PyMethodDef MD5_methods[] = {
224227
};
225228

226229
static PyObject *
227-
MD5_get_block_size(PyObject *self, void *closure)
230+
MD5_get_block_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
228231
{
229232
return PyLong_FromLong(MD5_BLOCKSIZE);
230233
}
231234

232235
static PyObject *
233-
MD5_get_name(PyObject *self, void *closure)
236+
MD5_get_name(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
234237
{
235238
return PyUnicode_FromStringAndSize("md5", 3);
236239
}
237240

238241
static PyObject *
239-
md5_get_digest_size(PyObject *self, void *closure)
242+
md5_get_digest_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
240243
{
241244
return PyLong_FromLong(MD5_DIGESTSIZE);
242245
}
243246

244247
static PyGetSetDef MD5_getseters[] = {
245-
{"block_size",
246-
(getter)MD5_get_block_size, NULL,
247-
NULL,
248-
NULL},
249-
{"name",
250-
(getter)MD5_get_name, NULL,
251-
NULL,
252-
NULL},
253-
{"digest_size",
254-
(getter)md5_get_digest_size, NULL,
255-
NULL,
256-
NULL},
248+
{"block_size", MD5_get_block_size, NULL, NULL, NULL},
249+
{"name", MD5_get_name, NULL, NULL, NULL},
250+
{"digest_size", md5_get_digest_size, NULL, NULL, NULL},
257251
{NULL} /* Sentinel */
258252
};
259253

Modules/sha1module.c

+12-18
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ typedef struct {
5555
Hacl_Hash_SHA1_state_t *hash_state;
5656
} SHA1object;
5757

58+
#define _SHA1object_CAST(op) ((SHA1object *)(op))
59+
5860
#include "clinic/sha1module.c.h"
5961

6062

@@ -73,7 +75,7 @@ sha1_get_state(PyObject *module)
7375
static SHA1object *
7476
newSHA1object(SHA1State *st)
7577
{
76-
SHA1object *sha = (SHA1object *)PyObject_GC_New(SHA1object, st->sha1_type);
78+
SHA1object *sha = PyObject_GC_New(SHA1object, st->sha1_type);
7779
if (sha == NULL) {
7880
return NULL;
7981
}
@@ -93,8 +95,9 @@ SHA1_traverse(PyObject *ptr, visitproc visit, void *arg)
9395
}
9496

9597
static void
96-
SHA1_dealloc(SHA1object *ptr)
98+
SHA1_dealloc(PyObject *op)
9799
{
100+
SHA1object *ptr = _SHA1object_CAST(op);
98101
Hacl_Hash_SHA1_free(ptr->hash_state);
99102
PyTypeObject *tp = Py_TYPE(ptr);
100103
PyObject_GC_UnTrack(ptr);
@@ -217,36 +220,27 @@ static PyMethodDef SHA1_methods[] = {
217220
};
218221

219222
static PyObject *
220-
SHA1_get_block_size(PyObject *self, void *closure)
223+
SHA1_get_block_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
221224
{
222225
return PyLong_FromLong(SHA1_BLOCKSIZE);
223226
}
224227

225228
static PyObject *
226-
SHA1_get_name(PyObject *self, void *closure)
229+
SHA1_get_name(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
227230
{
228231
return PyUnicode_FromStringAndSize("sha1", 4);
229232
}
230233

231234
static PyObject *
232-
sha1_get_digest_size(PyObject *self, void *closure)
235+
sha1_get_digest_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
233236
{
234237
return PyLong_FromLong(SHA1_DIGESTSIZE);
235238
}
236239

237240
static PyGetSetDef SHA1_getseters[] = {
238-
{"block_size",
239-
(getter)SHA1_get_block_size, NULL,
240-
NULL,
241-
NULL},
242-
{"name",
243-
(getter)SHA1_get_name, NULL,
244-
NULL,
245-
NULL},
246-
{"digest_size",
247-
(getter)sha1_get_digest_size, NULL,
248-
NULL,
249-
NULL},
241+
{"block_size", SHA1_get_block_size, NULL, NULL, NULL},
242+
{"name", SHA1_get_name, NULL, NULL, NULL},
243+
{"digest_size", sha1_get_digest_size, NULL, NULL, NULL},
250244
{NULL} /* Sentinel */
251245
};
252246

@@ -346,7 +340,7 @@ _sha1_clear(PyObject *module)
346340
static void
347341
_sha1_free(void *module)
348342
{
349-
_sha1_clear((PyObject *)module);
343+
(void)_sha1_clear((PyObject *)module);
350344
}
351345

352346
static int

Modules/sha2module.c

+28-41
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ typedef struct {
6767
Hacl_Hash_SHA2_state_t_512 *state;
6868
} SHA512object;
6969

70+
#define _SHA256object_CAST(op) ((SHA256object *)(op))
71+
#define _SHA512object_CAST(op) ((SHA512object *)(op))
72+
7073
#include "clinic/sha2module.c.h"
7174

7275
/* We shall use run-time type information in the remainder of this module to
@@ -101,8 +104,7 @@ static void SHA512copy(SHA512object *src, SHA512object *dest)
101104
static SHA256object *
102105
newSHA224object(sha2_state *state)
103106
{
104-
SHA256object *sha = (SHA256object *)PyObject_GC_New(
105-
SHA256object, state->sha224_type);
107+
SHA256object *sha = PyObject_GC_New(SHA256object, state->sha224_type);
106108
if (!sha) {
107109
return NULL;
108110
}
@@ -115,8 +117,7 @@ newSHA224object(sha2_state *state)
115117
static SHA256object *
116118
newSHA256object(sha2_state *state)
117119
{
118-
SHA256object *sha = (SHA256object *)PyObject_GC_New(
119-
SHA256object, state->sha256_type);
120+
SHA256object *sha = PyObject_GC_New(SHA256object, state->sha256_type);
120121
if (!sha) {
121122
return NULL;
122123
}
@@ -129,8 +130,7 @@ newSHA256object(sha2_state *state)
129130
static SHA512object *
130131
newSHA384object(sha2_state *state)
131132
{
132-
SHA512object *sha = (SHA512object *)PyObject_GC_New(
133-
SHA512object, state->sha384_type);
133+
SHA512object *sha = PyObject_GC_New(SHA512object, state->sha384_type);
134134
if (!sha) {
135135
return NULL;
136136
}
@@ -143,8 +143,7 @@ newSHA384object(sha2_state *state)
143143
static SHA512object *
144144
newSHA512object(sha2_state *state)
145145
{
146-
SHA512object *sha = (SHA512object *)PyObject_GC_New(
147-
SHA512object, state->sha512_type);
146+
SHA512object *sha = PyObject_GC_New(SHA512object, state->sha512_type);
148147
if (!sha) {
149148
return NULL;
150149
}
@@ -164,8 +163,9 @@ SHA2_traverse(PyObject *ptr, visitproc visit, void *arg)
164163
}
165164

166165
static void
167-
SHA256_dealloc(SHA256object *ptr)
166+
SHA256_dealloc(PyObject *op)
168167
{
168+
SHA256object *ptr = _SHA256object_CAST(op);
169169
Hacl_Hash_SHA2_free_256(ptr->state);
170170
PyTypeObject *tp = Py_TYPE(ptr);
171171
PyObject_GC_UnTrack(ptr);
@@ -174,8 +174,9 @@ SHA256_dealloc(SHA256object *ptr)
174174
}
175175

176176
static void
177-
SHA512_dealloc(SHA512object *ptr)
177+
SHA512_dealloc(PyObject *op)
178178
{
179+
SHA512object *ptr = _SHA512object_CAST(op);
179180
Hacl_Hash_SHA2_free_512(ptr->state);
180181
PyTypeObject *tp = Py_TYPE(ptr);
181182
PyObject_GC_UnTrack(ptr);
@@ -442,76 +443,62 @@ static PyMethodDef SHA512_methods[] = {
442443
};
443444

444445
static PyObject *
445-
SHA256_get_block_size(PyObject *self, void *closure)
446+
SHA256_get_block_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
446447
{
447448
return PyLong_FromLong(SHA256_BLOCKSIZE);
448449
}
449450

450451
static PyObject *
451-
SHA512_get_block_size(PyObject *self, void *closure)
452+
SHA512_get_block_size(PyObject *Py_UNUSED(self), void *Py_UNUSED(closure))
452453
{
453454
return PyLong_FromLong(SHA512_BLOCKSIZE);
454455
}
455456

456457
static PyObject *
457-
SHA256_get_digest_size(SHA256object *self, void *closure)
458+
SHA256_get_digest_size(PyObject *op, void *Py_UNUSED(closure))
458459
{
460+
SHA256object *self = _SHA256object_CAST(op);
459461
return PyLong_FromLong(self->digestsize);
460462
}
461463

462464
static PyObject *
463-
SHA512_get_digest_size(SHA512object *self, void *closure)
465+
SHA512_get_digest_size(PyObject *op, void *Py_UNUSED(closure))
464466
{
467+
SHA512object *self = _SHA512object_CAST(op);
465468
return PyLong_FromLong(self->digestsize);
466469
}
467470

468471
static PyObject *
469-
SHA256_get_name(SHA256object *self, void *closure)
472+
SHA256_get_name(PyObject *op, void *Py_UNUSED(closure))
470473
{
474+
SHA256object *self = _SHA256object_CAST(op);
471475
if (self->digestsize == 28) {
472476
return PyUnicode_FromStringAndSize("sha224", 6);
473477
}
474478
return PyUnicode_FromStringAndSize("sha256", 6);
475479
}
476480

477481
static PyObject *
478-
SHA512_get_name(SHA512object *self, void *closure)
482+
SHA512_get_name(PyObject *op, void *Py_UNUSED(closure))
479483
{
484+
SHA512object *self = _SHA512object_CAST(op);
480485
if (self->digestsize == 64) {
481486
return PyUnicode_FromStringAndSize("sha512", 6);
482487
}
483488
return PyUnicode_FromStringAndSize("sha384", 6);
484489
}
485490

486491
static PyGetSetDef SHA256_getseters[] = {
487-
{"block_size",
488-
(getter)SHA256_get_block_size, NULL,
489-
NULL,
490-
NULL},
491-
{"name",
492-
(getter)SHA256_get_name, NULL,
493-
NULL,
494-
NULL},
495-
{"digest_size",
496-
(getter)SHA256_get_digest_size, NULL,
497-
NULL,
498-
NULL},
492+
{"block_size", SHA256_get_block_size, NULL, NULL, NULL},
493+
{"name", SHA256_get_name, NULL, NULL, NULL},
494+
{"digest_size", SHA256_get_digest_size, NULL, NULL, NULL},
499495
{NULL} /* Sentinel */
500496
};
501497

502498
static PyGetSetDef SHA512_getseters[] = {
503-
{"block_size",
504-
(getter)SHA512_get_block_size, NULL,
505-
NULL,
506-
NULL},
507-
{"name",
508-
(getter)SHA512_get_name, NULL,
509-
NULL,
510-
NULL},
511-
{"digest_size",
512-
(getter)SHA512_get_digest_size, NULL,
513-
NULL,
514-
NULL},
499+
{"block_size", SHA512_get_block_size, NULL, NULL, NULL},
500+
{"name", SHA512_get_name, NULL, NULL, NULL},
501+
{"digest_size", SHA512_get_digest_size, NULL, NULL, NULL},
515502
{NULL} /* Sentinel */
516503
};
517504

@@ -818,7 +805,7 @@ _sha2_clear(PyObject *module)
818805
static void
819806
_sha2_free(void *module)
820807
{
821-
_sha2_clear((PyObject *)module);
808+
(void)_sha2_clear((PyObject *)module);
822809
}
823810

824811
/* Initialize this module. */

0 commit comments

Comments
 (0)