diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2009-10-19 17:59:07 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2009-10-19 17:59:07 (GMT) |
commit | 5ba84910ae25aff544272f223390482c63238c42 (patch) | |
tree | 96f4dd8f6d4965ae210a68ac96010a397eceb501 /Modules/_ssl.c | |
parent | a24db67d4704550722db3181b38b3840ded989bc (diff) | |
download | cpython-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.c | 27 |
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, |