summaryrefslogtreecommitdiffstats
path: root/Modules/_ssl.c
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2009-10-19 17:59:07 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2009-10-19 17:59:07 (GMT)
commit5ba84910ae25aff544272f223390482c63238c42 (patch)
tree96f4dd8f6d4965ae210a68ac96010a397eceb501 /Modules/_ssl.c
parenta24db67d4704550722db3181b38b3840ded989bc (diff)
downloadcpython-5ba84910ae25aff544272f223390482c63238c42.zip
cpython-5ba84910ae25aff544272f223390482c63238c42.tar.gz
cpython-5ba84910ae25aff544272f223390482c63238c42.tar.bz2
Issue #7133: SSL objects now support the new buffer API.
This fixes the test_ssl failure.
Diffstat (limited to 'Modules/_ssl.c')
-rw-r--r--Modules/_ssl.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index 643693e..87408c9 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -1144,14 +1144,13 @@ normal_return:
static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
{
- char *data;
+ Py_buffer buf;
int len;
- int count;
int sockstate;
int err;
int nonblocking;
- if (!PyArg_ParseTuple(args, "s#:write", &data, &count))
+ if (!PyArg_ParseTuple(args, "s*:write", &buf))
return NULL;
/* just in case the blocking state of the socket has been changed */
@@ -1163,24 +1162,24 @@ static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
if (sockstate == SOCKET_HAS_TIMED_OUT) {
PyErr_SetString(PySSLErrorObject,
"The write operation timed out");
- return NULL;
+ goto error;
} else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
PyErr_SetString(PySSLErrorObject,
"Underlying socket has been closed.");
- return NULL;
+ goto error;
} else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
PyErr_SetString(PySSLErrorObject,
"Underlying socket too large for select().");
- return NULL;
+ goto error;
}
do {
err = 0;
PySSL_BEGIN_ALLOW_THREADS
- len = SSL_write(self->ssl, data, count);
+ len = SSL_write(self->ssl, buf.buf, buf.len);
err = SSL_get_error(self->ssl, len);
PySSL_END_ALLOW_THREADS
- if(PyErr_CheckSignals()) {
- return NULL;
+ if (PyErr_CheckSignals()) {
+ goto error;
}
if (err == SSL_ERROR_WANT_READ) {
sockstate =
@@ -1194,19 +1193,25 @@ static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
if (sockstate == SOCKET_HAS_TIMED_OUT) {
PyErr_SetString(PySSLErrorObject,
"The write operation timed out");
- return NULL;
+ goto error;
} else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
PyErr_SetString(PySSLErrorObject,
"Underlying socket has been closed.");
- return NULL;
+ goto error;
} else if (sockstate == SOCKET_IS_NONBLOCKING) {
break;
}
} while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
+
+ PyBuffer_Release(&buf);
if (len > 0)
return PyInt_FromLong(len);
else
return PySSL_SetError(self, len, __FILE__, __LINE__);
+
+error:
+ PyBuffer_Release(&buf);
+ return NULL;
}
PyDoc_STRVAR(PySSL_SSLwrite_doc,