Commit 50b24d0d authored by Antoine Pitrou's avatar Antoine Pitrou

Fix a crash when setting a servername callback on a SSL server socket and the...

Fix a crash when setting a servername callback on a SSL server socket and the client doesn't send a server name.
Patch by Kazuhiro Yoshida.
(originally issue #8109)
parent 85b2afb1
...@@ -842,6 +842,7 @@ to speed up repeated connections from the same clients. ...@@ -842,6 +842,7 @@ to speed up repeated connections from the same clients.
The callback function, *server_name_callback*, will be called with three The callback function, *server_name_callback*, will be called with three
arguments; the first being the :class:`ssl.SSLSocket`, the second is a string arguments; the first being the :class:`ssl.SSLSocket`, the second is a string
that represents the server name that the client is intending to communicate that represents the server name that the client is intending to communicate
(or :const:`None` if the TLS Client Hello does not contain a server name)
and the third argument is the original :class:`SSLContext`. The server name and the third argument is the original :class:`SSLContext`. The server name
argument is the IDNA decoded server name. argument is the IDNA decoded server name.
......
...@@ -2096,7 +2096,8 @@ else: ...@@ -2096,7 +2096,8 @@ else:
def servername_cb(ssl_sock, server_name, initial_context): def servername_cb(ssl_sock, server_name, initial_context):
calls.append((server_name, initial_context)) calls.append((server_name, initial_context))
ssl_sock.context = other_context if server_name is not None:
ssl_sock.context = other_context
server_context.set_servername_callback(servername_cb) server_context.set_servername_callback(servername_cb)
stats = server_params_test(client_context, server_context, stats = server_params_test(client_context, server_context,
...@@ -2108,6 +2109,14 @@ else: ...@@ -2108,6 +2109,14 @@ else:
# CERTFILE4 was selected # CERTFILE4 was selected
self.check_common_name(stats, 'fakehostname') self.check_common_name(stats, 'fakehostname')
calls = []
# The callback is called with server_name=None
stats = server_params_test(client_context, server_context,
chatty=True,
sni_name=None)
self.assertEqual(calls, [(None, server_context)])
self.check_common_name(stats, 'localhost')
# Check disabling the callback # Check disabling the callback
calls = [] calls = []
server_context.set_servername_callback(None) server_context.set_servername_callback(None)
......
...@@ -1361,6 +1361,7 @@ Bob Yodlowski ...@@ -1361,6 +1361,7 @@ Bob Yodlowski
Danny Yoo Danny Yoo
Rory Yorke Rory Yorke
George Yoshida George Yoshida
Kazuhiro Yoshida
Masazumi Yoshikawa Masazumi Yoshikawa
Arnaud Ysmal Arnaud Ysmal
Bernard Yue Bernard Yue
......
...@@ -2448,22 +2448,28 @@ _servername_callback(SSL *s, int *al, void *args) ...@@ -2448,22 +2448,28 @@ _servername_callback(SSL *s, int *al, void *args)
goto error; goto error;
} }
servername_o = PyBytes_FromString(servername); if (servername == NULL) {
if (servername_o == NULL) { result = PyObject_CallFunctionObjArgs(ssl_ctx->set_hostname, ssl_socket,
PyErr_WriteUnraisable((PyObject *) ssl_ctx); Py_None, ssl_ctx, NULL);
goto error;
} }
servername_idna = PyUnicode_FromEncodedObject(servername_o, "idna", NULL); else {
if (servername_idna == NULL) { servername_o = PyBytes_FromString(servername);
PyErr_WriteUnraisable(servername_o); if (servername_o == NULL) {
PyErr_WriteUnraisable((PyObject *) ssl_ctx);
goto error;
}
servername_idna = PyUnicode_FromEncodedObject(servername_o, "idna", NULL);
if (servername_idna == NULL) {
PyErr_WriteUnraisable(servername_o);
Py_DECREF(servername_o);
goto error;
}
Py_DECREF(servername_o); Py_DECREF(servername_o);
goto error; result = PyObject_CallFunctionObjArgs(ssl_ctx->set_hostname, ssl_socket,
servername_idna, ssl_ctx, NULL);
Py_DECREF(servername_idna);
} }
Py_DECREF(servername_o);
result = PyObject_CallFunctionObjArgs(ssl_ctx->set_hostname, ssl_socket,
servername_idna, ssl_ctx, NULL);
Py_DECREF(ssl_socket); Py_DECREF(ssl_socket);
Py_DECREF(servername_idna);
if (result == NULL) { if (result == NULL) {
PyErr_WriteUnraisable(ssl_ctx->set_hostname); PyErr_WriteUnraisable(ssl_ctx->set_hostname);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment