enum py_ssl_server_or_client socket_type;
PyObject *owner; /* Python level "owner" passed to servername callback */
PyObject *server_hostname;
- _PySSLError err; /* last seen error from various sources */
/* Some SSL callbacks don't have error reporting. Callback wrappers
* store exception information on the socket. The handshake, read, write,
* and shutdown methods check for chained exceptions.
}
static PyObject *
-PySSL_SetError(PySSLSocket *sslsock, const char *filename, int lineno)
+PySSL_SetError(PySSLSocket *sslsock, _PySSLError err, const char *filename, int lineno)
{
PyObject *type;
char *errstr = NULL;
- _PySSLError err;
enum py_ssl_error p = PY_SSL_ERROR_NONE;
unsigned long e = 0;
e = ERR_peek_last_error();
if (sslsock->ssl != NULL) {
- err = sslsock->err;
-
switch (err.ssl) {
case SSL_ERROR_ZERO_RETURN:
errstr = "TLS/SSL connection has been closed (EOF)";
{
PySSLSocket *self;
SSL_CTX *ctx = sslctx->ctx;
- _PySSLError err = { 0 };
if ((socket_type == PY_SSL_SERVER) &&
(sslctx->protocol == PY_SSL_VERSION_TLS_CLIENT)) {
self->shutdown_seen_zero = 0;
self->owner = NULL;
self->server_hostname = NULL;
- self->err = err;
self->exc = NULL;
/* Make sure the SSL error state is initialized */
err = _PySSL_errno(ret < 1, self->ssl, ret);
Py_END_ALLOW_THREADS;
_PySSL_FIX_ERRNO;
- self->err = err;
if (PyErr_CheckSignals())
goto error;
Py_XDECREF(sock);
if (ret < 1)
- return PySSL_SetError(self, __FILE__, __LINE__);
+ return PySSL_SetError(self, err, __FILE__, __LINE__);
if (PySSL_ChainExceptions(self) < 0)
return NULL;
Py_RETURN_NONE;
err = _PySSL_errno(retval < 0, self->ssl, (int)retval);
Py_END_ALLOW_THREADS;
_PySSL_FIX_ERRNO;
- self->err = err;
if (PyErr_CheckSignals()) {
goto error;
}
Py_XDECREF(sock);
if (retval < 0) {
- return PySSL_SetError(self, __FILE__, __LINE__);
+ return PySSL_SetError(self, err, __FILE__, __LINE__);
}
if (PySSL_ChainExceptions(self) < 0) {
return NULL;
err = _PySSL_errno(retval == 0, self->ssl, retval);
Py_END_ALLOW_THREADS;
_PySSL_FIX_ERRNO;
- self->err = err;
if (PyErr_CheckSignals())
goto error;
Py_XDECREF(sock);
if (retval == 0)
- return PySSL_SetError(self, __FILE__, __LINE__);
+ return PySSL_SetError(self, err, __FILE__, __LINE__);
if (PySSL_ChainExceptions(self) < 0)
return NULL;
return PyLong_FromSize_t(count);
err = _PySSL_errno(count < 0, self->ssl, count);
Py_END_ALLOW_THREADS;
_PySSL_FIX_ERRNO;
- self->err = err;
if (count < 0)
- return PySSL_SetError(self, __FILE__, __LINE__);
+ return PySSL_SetError(self, err, __FILE__, __LINE__);
else
return PyLong_FromLong(count);
}
err = _PySSL_errno(retval == 0, self->ssl, retval);
Py_END_ALLOW_THREADS;
_PySSL_FIX_ERRNO;
- self->err = err;
if (PyErr_CheckSignals())
goto error;
err.ssl == SSL_ERROR_WANT_WRITE);
if (retval == 0) {
- PySSL_SetError(self, __FILE__, __LINE__);
+ PySSL_SetError(self, err, __FILE__, __LINE__);
goto error;
}
if (self->exc != NULL)
err = _PySSL_errno(ret < 0, self->ssl, ret);
Py_END_ALLOW_THREADS;
_PySSL_FIX_ERRNO;
- self->err = err;
/* If err == 1, a secure shutdown with SSL_shutdown() is complete */
if (ret > 0)
}
if (ret < 0) {
Py_XDECREF(sock);
- PySSL_SetError(self, __FILE__, __LINE__);
+ PySSL_SetError(self, err, __FILE__, __LINE__);
return NULL;
}
if (self->exc != NULL)