Skip to content

Commit f630494

Browse files
authored
gh-111230: Fix errors checking in _ssl module init (#111232)
Introduce ADD_INT_CONST macro wrapper for PyModule_AddIntConstant()
1 parent 9da98c0 commit f630494

File tree

2 files changed

+72
-82
lines changed

2 files changed

+72
-82
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix :mod:`ssl` not checking for errors when initializing.

Modules/_ssl.c

+71-82
Original file line numberDiff line numberDiff line change
@@ -5787,60 +5787,52 @@ sslmodule_add_option(PyObject *m, const char *name, uint64_t value)
57875787
static int
57885788
sslmodule_init_constants(PyObject *m)
57895789
{
5790-
PyModule_AddStringConstant(m, "_DEFAULT_CIPHERS",
5791-
PY_SSL_DEFAULT_CIPHER_STRING);
5792-
5793-
PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
5794-
PY_SSL_ERROR_ZERO_RETURN);
5795-
PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
5796-
PY_SSL_ERROR_WANT_READ);
5797-
PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
5798-
PY_SSL_ERROR_WANT_WRITE);
5799-
PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
5800-
PY_SSL_ERROR_WANT_X509_LOOKUP);
5801-
PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
5802-
PY_SSL_ERROR_SYSCALL);
5803-
PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
5804-
PY_SSL_ERROR_SSL);
5805-
PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
5806-
PY_SSL_ERROR_WANT_CONNECT);
5790+
if (PyModule_AddStringConstant(m, "_DEFAULT_CIPHERS",
5791+
PY_SSL_DEFAULT_CIPHER_STRING) < 0)
5792+
{
5793+
return -1;
5794+
}
5795+
5796+
#define ADD_INT_CONST(NAME, VALUE) do { \
5797+
if (PyModule_AddIntConstant(m, NAME, VALUE) < 0) { \
5798+
return -1; \
5799+
} \
5800+
} while (0)
5801+
5802+
ADD_INT_CONST("SSL_ERROR_ZERO_RETURN", PY_SSL_ERROR_ZERO_RETURN);
5803+
ADD_INT_CONST("SSL_ERROR_WANT_READ", PY_SSL_ERROR_WANT_READ);
5804+
ADD_INT_CONST("SSL_ERROR_WANT_WRITE", PY_SSL_ERROR_WANT_WRITE);
5805+
ADD_INT_CONST("SSL_ERROR_WANT_X509_LOOKUP", PY_SSL_ERROR_WANT_X509_LOOKUP);
5806+
ADD_INT_CONST("SSL_ERROR_SYSCALL", PY_SSL_ERROR_SYSCALL);
5807+
ADD_INT_CONST("SSL_ERROR_SSL", PY_SSL_ERROR_SSL);
5808+
ADD_INT_CONST("SSL_ERROR_WANT_CONNECT", PY_SSL_ERROR_WANT_CONNECT);
58075809
/* non ssl.h errorcodes */
5808-
PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
5809-
PY_SSL_ERROR_EOF);
5810-
PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
5811-
PY_SSL_ERROR_INVALID_ERROR_CODE);
5810+
ADD_INT_CONST("SSL_ERROR_EOF", PY_SSL_ERROR_EOF);
5811+
ADD_INT_CONST("SSL_ERROR_INVALID_ERROR_CODE",
5812+
PY_SSL_ERROR_INVALID_ERROR_CODE);
58125813
/* cert requirements */
5813-
PyModule_AddIntConstant(m, "CERT_NONE",
5814-
PY_SSL_CERT_NONE);
5815-
PyModule_AddIntConstant(m, "CERT_OPTIONAL",
5816-
PY_SSL_CERT_OPTIONAL);
5817-
PyModule_AddIntConstant(m, "CERT_REQUIRED",
5818-
PY_SSL_CERT_REQUIRED);
5814+
ADD_INT_CONST("CERT_NONE", PY_SSL_CERT_NONE);
5815+
ADD_INT_CONST("CERT_OPTIONAL", PY_SSL_CERT_OPTIONAL);
5816+
ADD_INT_CONST("CERT_REQUIRED", PY_SSL_CERT_REQUIRED);
58195817
/* CRL verification for verification_flags */
5820-
PyModule_AddIntConstant(m, "VERIFY_DEFAULT",
5821-
0);
5822-
PyModule_AddIntConstant(m, "VERIFY_CRL_CHECK_LEAF",
5823-
X509_V_FLAG_CRL_CHECK);
5824-
PyModule_AddIntConstant(m, "VERIFY_CRL_CHECK_CHAIN",
5825-
X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
5826-
PyModule_AddIntConstant(m, "VERIFY_X509_STRICT",
5827-
X509_V_FLAG_X509_STRICT);
5828-
PyModule_AddIntConstant(m, "VERIFY_ALLOW_PROXY_CERTS",
5829-
X509_V_FLAG_ALLOW_PROXY_CERTS);
5830-
PyModule_AddIntConstant(m, "VERIFY_X509_TRUSTED_FIRST",
5831-
X509_V_FLAG_TRUSTED_FIRST);
5818+
ADD_INT_CONST("VERIFY_DEFAULT", 0);
5819+
ADD_INT_CONST("VERIFY_CRL_CHECK_LEAF", X509_V_FLAG_CRL_CHECK);
5820+
ADD_INT_CONST("VERIFY_CRL_CHECK_CHAIN",
5821+
X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
5822+
ADD_INT_CONST("VERIFY_X509_STRICT", X509_V_FLAG_X509_STRICT);
5823+
ADD_INT_CONST("VERIFY_ALLOW_PROXY_CERTS", X509_V_FLAG_ALLOW_PROXY_CERTS);
5824+
ADD_INT_CONST("VERIFY_X509_TRUSTED_FIRST", X509_V_FLAG_TRUSTED_FIRST);
58325825

58335826
#ifdef X509_V_FLAG_PARTIAL_CHAIN
5834-
PyModule_AddIntConstant(m, "VERIFY_X509_PARTIAL_CHAIN",
5835-
X509_V_FLAG_PARTIAL_CHAIN);
5827+
ADD_INT_CONST("VERIFY_X509_PARTIAL_CHAIN", X509_V_FLAG_PARTIAL_CHAIN);
58365828
#endif
58375829

58385830
/* Alert Descriptions from ssl.h */
58395831
/* note RESERVED constants no longer intended for use have been removed */
58405832
/* http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6 */
58415833

58425834
#define ADD_AD_CONSTANT(s) \
5843-
PyModule_AddIntConstant(m, "ALERT_DESCRIPTION_"#s, \
5835+
ADD_INT_CONST("ALERT_DESCRIPTION_"#s, \
58445836
SSL_AD_##s)
58455837

58465838
ADD_AD_CONSTANT(CLOSE_NOTIFY);
@@ -5888,23 +5880,15 @@ sslmodule_init_constants(PyObject *m)
58885880

58895881
/* protocol versions */
58905882
#ifndef OPENSSL_NO_SSL3
5891-
PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
5892-
PY_SSL_VERSION_SSL3);
5883+
ADD_INT_CONST("PROTOCOL_SSLv3", PY_SSL_VERSION_SSL3);
58935884
#endif
5894-
PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
5895-
PY_SSL_VERSION_TLS);
5896-
PyModule_AddIntConstant(m, "PROTOCOL_TLS",
5897-
PY_SSL_VERSION_TLS);
5898-
PyModule_AddIntConstant(m, "PROTOCOL_TLS_CLIENT",
5899-
PY_SSL_VERSION_TLS_CLIENT);
5900-
PyModule_AddIntConstant(m, "PROTOCOL_TLS_SERVER",
5901-
PY_SSL_VERSION_TLS_SERVER);
5902-
PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
5903-
PY_SSL_VERSION_TLS1);
5904-
PyModule_AddIntConstant(m, "PROTOCOL_TLSv1_1",
5905-
PY_SSL_VERSION_TLS1_1);
5906-
PyModule_AddIntConstant(m, "PROTOCOL_TLSv1_2",
5907-
PY_SSL_VERSION_TLS1_2);
5885+
ADD_INT_CONST("PROTOCOL_SSLv23", PY_SSL_VERSION_TLS);
5886+
ADD_INT_CONST("PROTOCOL_TLS", PY_SSL_VERSION_TLS);
5887+
ADD_INT_CONST("PROTOCOL_TLS_CLIENT", PY_SSL_VERSION_TLS_CLIENT);
5888+
ADD_INT_CONST("PROTOCOL_TLS_SERVER", PY_SSL_VERSION_TLS_SERVER);
5889+
ADD_INT_CONST("PROTOCOL_TLSv1", PY_SSL_VERSION_TLS1);
5890+
ADD_INT_CONST("PROTOCOL_TLSv1_1", PY_SSL_VERSION_TLS1_1);
5891+
ADD_INT_CONST("PROTOCOL_TLSv1_2", PY_SSL_VERSION_TLS1_2);
59085892

59095893
#define ADD_OPTION(NAME, VALUE) if (sslmodule_add_option(m, NAME, (VALUE)) < 0) return -1
59105894

@@ -5949,50 +5933,52 @@ sslmodule_init_constants(PyObject *m)
59495933
ADD_OPTION("OP_ENABLE_KTLS", SSL_OP_ENABLE_KTLS);
59505934
#endif
59515935

5936+
#undef ADD_OPTION
5937+
59525938
#ifdef X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT
5953-
PyModule_AddIntConstant(m, "HOSTFLAG_ALWAYS_CHECK_SUBJECT",
5954-
X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT);
5939+
ADD_INT_CONST("HOSTFLAG_ALWAYS_CHECK_SUBJECT",
5940+
X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT);
59555941
#endif
59565942
#ifdef X509_CHECK_FLAG_NEVER_CHECK_SUBJECT
5957-
PyModule_AddIntConstant(m, "HOSTFLAG_NEVER_CHECK_SUBJECT",
5958-
X509_CHECK_FLAG_NEVER_CHECK_SUBJECT);
5943+
ADD_INT_CONST("HOSTFLAG_NEVER_CHECK_SUBJECT",
5944+
X509_CHECK_FLAG_NEVER_CHECK_SUBJECT);
59595945
#endif
59605946
#ifdef X509_CHECK_FLAG_NO_WILDCARDS
5961-
PyModule_AddIntConstant(m, "HOSTFLAG_NO_WILDCARDS",
5962-
X509_CHECK_FLAG_NO_WILDCARDS);
5947+
ADD_INT_CONST("HOSTFLAG_NO_WILDCARDS",
5948+
X509_CHECK_FLAG_NO_WILDCARDS);
59635949
#endif
59645950
#ifdef X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
5965-
PyModule_AddIntConstant(m, "HOSTFLAG_NO_PARTIAL_WILDCARDS",
5966-
X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
5951+
ADD_INT_CONST("HOSTFLAG_NO_PARTIAL_WILDCARDS",
5952+
X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
59675953
#endif
59685954
#ifdef X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS
5969-
PyModule_AddIntConstant(m, "HOSTFLAG_MULTI_LABEL_WILDCARDS",
5970-
X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS);
5955+
ADD_INT_CONST("HOSTFLAG_MULTI_LABEL_WILDCARDS",
5956+
X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS);
59715957
#endif
59725958
#ifdef X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS
5973-
PyModule_AddIntConstant(m, "HOSTFLAG_SINGLE_LABEL_SUBDOMAINS",
5974-
X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS);
5959+
ADD_INT_CONST("HOSTFLAG_SINGLE_LABEL_SUBDOMAINS",
5960+
X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS);
59755961
#endif
59765962

59775963
/* file types */
5978-
PyModule_AddIntConstant(m, "ENCODING_PEM", PY_SSL_ENCODING_PEM);
5979-
PyModule_AddIntConstant(m, "ENCODING_DER", PY_SSL_ENCODING_DER);
5964+
ADD_INT_CONST("ENCODING_PEM", PY_SSL_ENCODING_PEM);
5965+
ADD_INT_CONST("ENCODING_DER", PY_SSL_ENCODING_DER);
59805966

59815967
/* protocol versions */
5982-
PyModule_AddIntConstant(m, "PROTO_MINIMUM_SUPPORTED",
5983-
PY_PROTO_MINIMUM_SUPPORTED);
5984-
PyModule_AddIntConstant(m, "PROTO_MAXIMUM_SUPPORTED",
5985-
PY_PROTO_MAXIMUM_SUPPORTED);
5986-
PyModule_AddIntConstant(m, "PROTO_SSLv3", PY_PROTO_SSLv3);
5987-
PyModule_AddIntConstant(m, "PROTO_TLSv1", PY_PROTO_TLSv1);
5988-
PyModule_AddIntConstant(m, "PROTO_TLSv1_1", PY_PROTO_TLSv1_1);
5989-
PyModule_AddIntConstant(m, "PROTO_TLSv1_2", PY_PROTO_TLSv1_2);
5990-
PyModule_AddIntConstant(m, "PROTO_TLSv1_3", PY_PROTO_TLSv1_3);
5968+
ADD_INT_CONST("PROTO_MINIMUM_SUPPORTED", PY_PROTO_MINIMUM_SUPPORTED);
5969+
ADD_INT_CONST("PROTO_MAXIMUM_SUPPORTED", PY_PROTO_MAXIMUM_SUPPORTED);
5970+
ADD_INT_CONST("PROTO_SSLv3", PY_PROTO_SSLv3);
5971+
ADD_INT_CONST("PROTO_TLSv1", PY_PROTO_TLSv1);
5972+
ADD_INT_CONST("PROTO_TLSv1_1", PY_PROTO_TLSv1_1);
5973+
ADD_INT_CONST("PROTO_TLSv1_2", PY_PROTO_TLSv1_2);
5974+
ADD_INT_CONST("PROTO_TLSv1_3", PY_PROTO_TLSv1_3);
59915975

59925976
#define addbool(m, key, value) \
59935977
do { \
59945978
PyObject *bool_obj = (value) ? Py_True : Py_False; \
5995-
PyModule_AddObjectRef((m), (key), bool_obj); \
5979+
if (PyModule_AddObjectRef((m), (key), bool_obj) < 0) { \
5980+
return -1; \
5981+
} \
59965982
} while (0)
59975983

59985984
addbool(m, "HAS_SNI", 1);
@@ -6033,6 +6019,9 @@ sslmodule_init_constants(PyObject *m)
60336019
addbool(m, "HAS_TLSv1_3", 0);
60346020
#endif
60356021

6022+
#undef addbool
6023+
#undef ADD_INT_CONST
6024+
60366025
return 0;
60376026
}
60386027

0 commit comments

Comments
 (0)