[Python-checkins] CVS: python/dist/src/Modules socketmodule.c,1.176,1.177

Jeremy Hylton jhylton@users.sourceforge.net
Thu, 11 Oct 2001 10:23:36 -0700


Update of /cvsroot/python/python/dist/src/Modules
In directory usw-pr-cvs1:/tmp/cvs-serv755

Modified Files:
	socketmodule.c 
Log Message:
Commit parts of SF patch #462759

Use #define X509_NAME_MAXLEN for server/issuer length on an SSL
object.

Update doc strings for socket.ssl() and ssl methods read() and
write().

PySSL_SSLwrite(): Check return value and raise exception on error.
Use int for len instead of size_t.  (All the function the size_t obj
was passed to our from expected an int!)

PySSL_SSLread(): Check return value of PyArg_ParseTuple()!  More
robust checks of return values from SSL_read().


Index: socketmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/socketmodule.c,v
retrieving revision 1.176
retrieving revision 1.177
diff -C2 -d -r1.176 -r1.177
*** socketmodule.c	2001/10/11 16:36:35	1.176
--- socketmodule.c	2001/10/11 17:23:34	1.177
***************
*** 489,492 ****
--- 489,494 ----
  #ifdef USE_SSL
  
+ #define X509_NAME_MAXLEN 256
+ 
  typedef struct {
  	PyObject_HEAD
***************
*** 496,501 ****
  	X509*    	server_cert;
  	BIO*		sbio;
! 	char    	server[256];
! 	char		issuer[256];
  
  } PySSLObject;
--- 498,503 ----
  	X509*    	server_cert;
  	BIO*		sbio;
! 	char    	server[X509_NAME_MAXLEN];
! 	char		issuer[X509_NAME_MAXLEN];
  
  } PySSLObject;
***************
*** 2564,2569 ****
  		goto fail;
  	}
! 	memset(self->server, '\0', sizeof(char) * 256);
! 	memset(self->issuer, '\0', sizeof(char) * 256);
  	self->server_cert = NULL;
  	self->ssl = NULL;
--- 2566,2571 ----
  		goto fail;
  	}
! 	memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
! 	memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
  	self->server_cert = NULL;
  	self->ssl = NULL;
***************
*** 2613,2619 ****
  	if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
  		X509_NAME_oneline(X509_get_subject_name(self->server_cert),
! 				  self->server, 256);
  		X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
! 				  self->issuer, 256);
  	}
  	self->Socket = Sock;
--- 2615,2621 ----
  	if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
  		X509_NAME_oneline(X509_get_subject_name(self->server_cert),
! 				  self->server, X509_NAME_MAXLEN);
  		X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
! 				  self->issuer, X509_NAME_MAXLEN);
  	}
  	self->Socket = Sock;
***************
*** 2648,2655 ****
  
  static char ssl_doc[] =
! "ssl(socket, keyfile, certfile) -> sslobject";
  
  static PyObject *
! PySSL_server(PySSLObject *self, PyObject *args)
  {
  	return PyString_FromString(self->server);
--- 2650,2659 ----
  
  static char ssl_doc[] =
! "ssl(socket, [keyfile, certfile]) -> sslobject";
! 
! /* SSL object methods */
  
  static PyObject *
! PySSL_server(PySSLObject *self)
  {
  	return PyString_FromString(self->server);
***************
*** 2657,2661 ****
  
  static PyObject *
! PySSL_issuer(PySSLObject *self, PyObject *args)
  {
  	return PyString_FromString(self->issuer);
--- 2661,2665 ----
  
  static PyObject *
! PySSL_issuer(PySSLObject *self)
  {
  	return PyString_FromString(self->issuer);
***************
*** 2663,2676 ****
  
  
- /* SSL object methods */
- 
- static PyMethodDef PySSLMethods[] = {
- 	{"write", (PyCFunction)PySSL_SSLwrite, 1},
- 	{"read", (PyCFunction)PySSL_SSLread, 1},
- 	{"server", (PyCFunction)PySSL_server, 1},
- 	{"issuer", (PyCFunction)PySSL_issuer, 1},
- 	{NULL, NULL}
- };
- 
  static void PySSL_dealloc(PySSLObject *self)
  {
--- 2667,2670 ----
***************
*** 2685,2718 ****
  }
  
- static PyObject *PySSL_getattr(PySSLObject *self, char *name)
- {
- 	return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
- }
- 
- staticforward PyTypeObject PySSL_Type = {
- 	PyObject_HEAD_INIT(NULL)
- 	0,				/*ob_size*/
- 	"SSL",			/*tp_name*/
- 	sizeof(PySSLObject),		/*tp_basicsize*/
- 	0,				/*tp_itemsize*/
- 	/* methods */
- 	(destructor)PySSL_dealloc,	/*tp_dealloc*/
- 	0,				/*tp_print*/
- 	(getattrfunc)PySSL_getattr,	/*tp_getattr*/
- 	0,				/*tp_setattr*/
- 	0,				/*tp_compare*/
- 	0,				/*tp_repr*/
- 	0,				/*tp_as_number*/
- 	0,				/*tp_as_sequence*/
- 	0,				/*tp_as_mapping*/
- 	0,				/*tp_hash*/
- };
- 
- 
- 
  static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
  {
  	char *data;
! 	size_t len;
  
  	if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
--- 2679,2686 ----
  }
  
  static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
  {
  	char *data;
! 	int len;
  
  	if (!PyArg_ParseTuple(args, "s#:write", &data, &len))
***************
*** 2720,2726 ****
  
  	len = SSL_write(self->ssl, data, len);
! 	return PyInt_FromLong((long)len);
  }
  
  static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
  {
--- 2688,2703 ----
  
  	len = SSL_write(self->ssl, data, len);
! 	if (len > 0)
! 		return PyInt_FromLong(len);
! 	else
! 		return PySSL_SetError(self->ssl, len);
  }
  
+ static char PySSL_SSLwrite_doc[] =
+ "write(s) -> len\n\
+ \n\
+ Writes the string s into the SSL object.  Returns the number\n\
+ of bytes written.";
+ 
  static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
  {
***************
*** 2728,2763 ****
  	int count = 0;
  	int len = 1024;
- 	int res;
  
! 	PyArg_ParseTuple(args, "|i:read", &len);
  
  	if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
! 		return NULL;	/* Error object should already be set */
  
  	count = SSL_read(self->ssl, PyString_AsString(buf), len);
! 	res = SSL_get_error(self->ssl, count);
! 
! 	switch (res) {
! 	case SSL_ERROR_NONE:
! 		assert(count > 0);
! 		break;
! 	case SSL_ERROR_ZERO_RETURN: /* normal EOF */
! 		assert(count == 0);
! 		break;
! 	default:
! 		return PyErr_SetFromErrno(PySSLErrorObject);
! 	}
! 
! 	fflush(stderr);
! 
! 	if (count < 0) {
  		Py_DECREF(buf);
! 		return PyErr_SetFromErrno(PySSLErrorObject);
  	}
- 
  	if (count != len && _PyString_Resize(&buf, count) < 0)
  		return NULL;
  	return buf;
  }
  
  #endif /* USE_SSL */
--- 2705,2763 ----
  	int count = 0;
  	int len = 1024;
  
! 	if (!PyArg_ParseTuple(args, "|i:read", &len))
! 		return NULL;
  
  	if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
! 		return NULL;
  
  	count = SSL_read(self->ssl, PyString_AsString(buf), len);
!  	if (count <= 0) {
  		Py_DECREF(buf);
! 		return PySSL_SetError(self->ssl, count);
  	}
  	if (count != len && _PyString_Resize(&buf, count) < 0)
  		return NULL;
  	return buf;
  }
+ 
+ static char PySSL_SSLread_doc[] =
+ "read([len]) -> string\n\
+ \n\
+ Read up to len bytes from the SSL socket.";
+ 
+ static PyMethodDef PySSLMethods[] = {
+ 	{"write", (PyCFunction)PySSL_SSLwrite, 1,
+ 	          PySSL_SSLwrite_doc},
+ 	{"read", (PyCFunction)PySSL_SSLread, 1,
+ 	          PySSL_SSLread_doc},
+ 	{"server", (PyNoArgsFunction)PySSL_server, METH_NOARGS},
+ 	{"issuer", (PyNoArgsFunction)PySSL_issuer, METH_NOARGS},
+ 	{NULL, NULL}
+ };
+ 
+ static PyObject *PySSL_getattr(PySSLObject *self, char *name)
+ {
+ 	return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
+ }
+ 
+ staticforward PyTypeObject PySSL_Type = {
+ 	PyObject_HEAD_INIT(NULL)
+ 	0,				/*ob_size*/
+ 	"SSL",			/*tp_name*/
+ 	sizeof(PySSLObject),		/*tp_basicsize*/
+ 	0,				/*tp_itemsize*/
+ 	/* methods */
+ 	(destructor)PySSL_dealloc,	/*tp_dealloc*/
+ 	0,				/*tp_print*/
+ 	(getattrfunc)PySSL_getattr,	/*tp_getattr*/
+ 	0,				/*tp_setattr*/
+ 	0,				/*tp_compare*/
+ 	0,				/*tp_repr*/
+ 	0,				/*tp_as_number*/
+ 	0,				/*tp_as_sequence*/
+ 	0,				/*tp_as_mapping*/
+ 	0,				/*tp_hash*/
+ };
  
  #endif /* USE_SSL */