Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 10c4c23

Browse files
committed
Merged revisions 84464 via svnmerge from
svn+ssh://[email protected]/python/branches/py3k ........ r84464 | antoine.pitrou | 2010-09-03 20:38:17 +0200 (ven., 03 sept. 2010) | 3 lines Issue #3805: clean up implementation of the _read method in _ssl.c. ........
1 parent 23ef20f commit 10c4c23

2 files changed

Lines changed: 33 additions & 32 deletions

File tree

Lib/ssl.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,14 @@ def read(self, len=0, buffer=None):
162162

163163
self._checkClosed()
164164
try:
165-
if buffer:
166-
v = self._sslobj.read(buffer, len)
165+
if buffer is not None:
166+
v = self._sslobj.read(len, buffer)
167167
else:
168168
v = self._sslobj.read(len or 1024)
169169
return v
170170
except SSLError as x:
171171
if x.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs:
172-
if buffer:
172+
if buffer is not None:
173173
return 0
174174
else:
175175
return b''

Modules/_ssl.c

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1277,11 +1277,9 @@ static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
12771277
{
12781278
PyObject *dest = NULL;
12791279
Py_buffer buf;
1280-
int buf_passed = 0;
1281-
int count = -1;
12821280
char *mem;
1283-
/* XXX this should use Py_ssize_t */
1284-
int len = 1024;
1281+
int len, count;
1282+
int buf_passed = 0;
12851283
int sockstate;
12861284
int err;
12871285
int nonblocking;
@@ -1295,26 +1293,28 @@ static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
12951293
}
12961294
Py_INCREF(sock);
12971295

1298-
if (!PyArg_ParseTuple(args, "|Oi:read", &dest, &count))
1296+
buf.obj = NULL;
1297+
buf.buf = NULL;
1298+
if (!PyArg_ParseTuple(args, "i|w*:read", &len, &buf))
12991299
goto error;
13001300

1301-
if ((dest == NULL) || (dest == Py_None)) {
1302-
if (!(dest = PyByteArray_FromStringAndSize((char *) 0, len)))
1303-
goto error;
1304-
mem = PyByteArray_AS_STRING(dest);
1305-
} else if (PyLong_Check(dest)) {
1306-
len = PyLong_AS_LONG(dest);
1307-
if (!(dest = PyByteArray_FromStringAndSize((char *) 0, len)))
1308-
goto error;
1309-
mem = PyByteArray_AS_STRING(dest);
1310-
} else {
1311-
if (PyObject_GetBuffer(dest, &buf, PyBUF_CONTIG) < 0)
1301+
if ((buf.buf == NULL) && (buf.obj == NULL)) {
1302+
dest = PyBytes_FromStringAndSize(NULL, len);
1303+
if (dest == NULL)
13121304
goto error;
1313-
mem = buf.buf;
1314-
len = buf.len;
1315-
if ((count > 0) && (count <= len))
1316-
len = count;
1305+
mem = PyBytes_AS_STRING(dest);
1306+
}
1307+
else {
13171308
buf_passed = 1;
1309+
mem = buf.buf;
1310+
if (len <= 0 || len > buf.len) {
1311+
len = (int) buf.len;
1312+
if (buf.len != len) {
1313+
PyErr_SetString(PyExc_OverflowError,
1314+
"maximum length can't fit in a C 'int'");
1315+
goto error;
1316+
}
1317+
}
13181318
}
13191319

13201320
/* just in case the blocking state of the socket has been changed */
@@ -1375,23 +1375,24 @@ static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
13751375
PySSL_SetError(self, count, __FILE__, __LINE__);
13761376
goto error;
13771377
}
1378-
done:
1378+
1379+
done:
13791380
Py_DECREF(sock);
13801381
if (!buf_passed) {
1381-
PyObject *res = PyBytes_FromStringAndSize(mem, count);
1382-
Py_DECREF(dest);
1383-
return res;
1384-
} else {
1382+
_PyBytes_Resize(&dest, count);
1383+
return dest;
1384+
}
1385+
else {
13851386
PyBuffer_Release(&buf);
13861387
return PyLong_FromLong(count);
13871388
}
1388-
error:
1389+
1390+
error:
13891391
Py_DECREF(sock);
1390-
if (!buf_passed) {
1392+
if (!buf_passed)
13911393
Py_XDECREF(dest);
1392-
} else {
1394+
else
13931395
PyBuffer_Release(&buf);
1394-
}
13951396
return NULL;
13961397
}
13971398

0 commit comments

Comments
 (0)