Commit fec0a058 authored by Barry Warsaw's avatar Barry Warsaw

Check of return values and proper error handling.

parent 866eb622
...@@ -344,9 +344,12 @@ BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen) ...@@ -344,9 +344,12 @@ BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
case AF_INET: case AF_INET:
{ {
struct sockaddr_in *a = (struct sockaddr_in *) addr; struct sockaddr_in *a = (struct sockaddr_in *) addr;
PyObject *addr = makeipaddr(a); PyObject *addrobj = makeipaddr(a);
PyObject *ret = Py_BuildValue("Oi", addr, ntohs(a->sin_port)); PyObject *ret = NULL;
Py_XDECREF(addr); if (addrobj) {
ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
Py_DECREF(addrobj);
}
return ret; return ret;
} }
...@@ -361,7 +364,8 @@ BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen) ...@@ -361,7 +364,8 @@ BUILD_FUNC_DEF_2(makesockaddr,struct sockaddr *,addr, int,addrlen)
/* More cases here... */ /* More cases here... */
default: default:
PyErr_SetString(PySocket_Error, "return unknown socket address type"); PyErr_SetString(PySocket_Error,
"return unknown socket address type");
return NULL; return NULL;
} }
...@@ -389,7 +393,8 @@ getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_ ...@@ -389,7 +393,8 @@ getsockaddrarg,PySocketSockObject *,s, PyObject *,args, struct sockaddr **,addr_
if (!PyArg_Parse(args, "s#", &path, &len)) if (!PyArg_Parse(args, "s#", &path, &len))
return 0; return 0;
if (len > sizeof addr->sun_path) { if (len > sizeof addr->sun_path) {
PyErr_SetString(PySocket_Error, "AF_UNIX path too long"); PyErr_SetString(PySocket_Error,
"AF_UNIX path too long");
return 0; return 0;
} }
addr->sun_family = AF_UNIX; addr->sun_family = AF_UNIX;
...@@ -468,7 +473,10 @@ BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args) ...@@ -468,7 +473,10 @@ BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
{ {
char addrbuf[256]; char addrbuf[256];
int addrlen, newfd; int addrlen, newfd;
PyObject *sock, *addr, *res; PyObject *sock = NULL;
PyObject *addr = NULL;
PyObject *res = NULL;
if (!PyArg_NoArgs(args)) if (!PyArg_NoArgs(args))
return NULL; return NULL;
if (!getsockaddrlen(s, &addrlen)) if (!getsockaddrlen(s, &addrlen))
...@@ -478,16 +486,24 @@ BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args) ...@@ -478,16 +486,24 @@ BUILD_FUNC_DEF_2(PySocketSock_accept,PySocketSockObject *,s, PyObject *,args)
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (newfd < 0) if (newfd < 0)
return PySocket_Err(); return PySocket_Err();
/* Create the new object with unspecified family, /* Create the new object with unspecified family,
to avoid calls to bind() etc. on it. */ to avoid calls to bind() etc. on it. */
sock = (PyObject *) PySocketSock_New(newfd, sock = (PyObject *) PySocketSock_New(newfd,
s->sock_family, s->sock_family,
s->sock_type, s->sock_type,
s->sock_proto); s->sock_proto);
if (sock == NULL) if (sock == NULL) {
close(newfd); close(newfd);
addr = makesockaddr((struct sockaddr *) addrbuf, addrlen); goto finally;
res = Py_BuildValue("OO", sock, addr); }
if (!(addr = makesockaddr((struct sockaddr *) addrbuf, addrlen)))
goto finally;
if (!(res = Py_BuildValue("OO", sock, addr)))
goto finally;
finally:
Py_XDECREF(sock); Py_XDECREF(sock);
Py_XDECREF(addr); Py_XDECREF(addr);
return res; return res;
...@@ -543,7 +559,8 @@ BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args ...@@ -543,7 +559,8 @@ BUILD_FUNC_DEF_2(PySocketSock_setsockopt,PySocketSockObject *,s, PyObject *,args
} }
else { else {
PyErr_Clear(); PyErr_Clear();
if (!PyArg_Parse(args, "(iis#)", &level, &optname, &buf, &buflen)) if (!PyArg_Parse(args, "(iis#)", &level, &optname,
&buf, &buflen))
return NULL; return NULL;
} }
res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen); res = setsockopt(s->sock_fd, level, optname, (ANY *)buf, buflen);
...@@ -581,7 +598,8 @@ BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args ...@@ -581,7 +598,8 @@ BUILD_FUNC_DEF_2(PySocketSock_getsockopt,PySocketSockObject *,s, PyObject *,args
return PyInt_FromLong(flag); return PyInt_FromLong(flag);
} }
if (buflen <= 0 || buflen > 1024) { if (buflen <= 0 || buflen > 1024) {
PyErr_SetString(PySocket_Error, "getsockopt buflen out of range"); PyErr_SetString(PySocket_Error,
"getsockopt buflen out of range");
return NULL; return NULL;
} }
buf = PyString_FromStringAndSize((char *)NULL, buflen); buf = PyString_FromStringAndSize((char *)NULL, buflen);
...@@ -683,9 +701,9 @@ BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args) ...@@ -683,9 +701,9 @@ BUILD_FUNC_DEF_2(PySocketSock_dup,PySocketSockObject *,s, PyObject *,args)
if (newfd < 0) if (newfd < 0)
return PySocket_Err(); return PySocket_Err();
sock = (PyObject *) PySocketSock_New(newfd, sock = (PyObject *) PySocketSock_New(newfd,
s->sock_family, s->sock_family,
s->sock_type, s->sock_type,
s->sock_proto); s->sock_proto);
if (sock == NULL) if (sock == NULL)
close(newfd); close(newfd);
return sock; return sock;
...@@ -825,7 +843,10 @@ static PyObject * ...@@ -825,7 +843,10 @@ static PyObject *
BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args) BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
{ {
char addrbuf[256]; char addrbuf[256];
PyObject *buf, *addr, *ret; PyObject *buf = NULL;
PyObject *addr = NULL;
PyObject *ret = NULL;
int addrlen, len, n, flags = 0; int addrlen, len, n, flags = 0;
if (!PyArg_ParseTuple(args, "i|i", &len, &flags)) if (!PyArg_ParseTuple(args, "i|i", &len, &flags))
return NULL; return NULL;
...@@ -837,10 +858,11 @@ BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args) ...@@ -837,10 +858,11 @@ BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags, n = recvfrom(s->sock_fd, PyString_AsString(buf), len, flags,
#ifndef MS_WINDOWS #ifndef MS_WINDOWS
(ANY *)addrbuf, &addrlen); (ANY *)addrbuf, &addrlen
#else #else
(struct sockaddr *)addrbuf, &addrlen); (struct sockaddr *)addrbuf, &addrlen
#endif #endif
);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (n < 0) { if (n < 0) {
Py_DECREF(buf); Py_DECREF(buf);
...@@ -848,8 +870,12 @@ BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args) ...@@ -848,8 +870,12 @@ BUILD_FUNC_DEF_2(PySocketSock_recvfrom,PySocketSockObject *,s, PyObject *,args)
} }
if (n != len && _PyString_Resize(&buf, n) < 0) if (n != len && _PyString_Resize(&buf, n) < 0)
return NULL; return NULL;
addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
if (!(addr = makesockaddr((struct sockaddr *)addrbuf, addrlen)))
goto finally;
ret = Py_BuildValue("OO", buf, addr); ret = Py_BuildValue("OO", buf, addr);
finally:
Py_XDECREF(addr); Py_XDECREF(addr);
Py_XDECREF(buf); Py_XDECREF(buf);
return ret; return ret;
...@@ -1073,19 +1099,25 @@ BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args) ...@@ -1073,19 +1099,25 @@ BUILD_FUNC_DEF_2(PySocket_gethostbyaddr,PyObject *,self, PyObject *, args)
if ((addr_list = PyList_New(0)) == NULL) if ((addr_list = PyList_New(0)) == NULL)
goto err; goto err;
for (pch = h->h_aliases; *pch != NULL; pch++) { for (pch = h->h_aliases; *pch != NULL; pch++) {
int status;
tmp = PyString_FromString(*pch); tmp = PyString_FromString(*pch);
if (tmp == NULL) if (tmp == NULL)
goto err; goto err;
PyList_Append(name_list, tmp); status = PyList_Append(name_list, tmp);
Py_DECREF(tmp); Py_DECREF(tmp);
if (status)
goto err;
} }
for (pch = h->h_addr_list; *pch != NULL; pch++) { for (pch = h->h_addr_list; *pch != NULL; pch++) {
int status;
memcpy((char *) &addr.sin_addr, *pch, h->h_length); memcpy((char *) &addr.sin_addr, *pch, h->h_length);
tmp = makeipaddr(&addr); tmp = makeipaddr(&addr);
if (tmp == NULL) if (tmp == NULL)
goto err; goto err;
PyList_Append(addr_list, tmp); status = PyList_Append(addr_list, tmp);
Py_DECREF(tmp); Py_DECREF(tmp);
if (status)
goto err;
} }
rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list); rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
err: err:
...@@ -1276,20 +1308,18 @@ static PyMethodDef PySocket_methods[] = { ...@@ -1276,20 +1308,18 @@ static PyMethodDef PySocket_methods[] = {
/* Convenience routine to export an integer value. /* Convenience routine to export an integer value.
For simplicity, errors (which are unlikely anyway) are ignored. */ *
* Since this function is called only from initsocket/init_socket(), any
* errors trigger a fatal exception.
*/
static void static void
BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value) BUILD_FUNC_DEF_3(insint,PyObject *,d, char *,name, int,value)
{ {
PyObject *v = PyInt_FromLong((long) value); PyObject *v = PyInt_FromLong((long) value);
if (v == NULL) { if (!v || PyDict_SetItemString(d, name, v))
/* Don't bother reporting this error */ Py_FatalError("can't initialize socket module");
PyErr_Clear();
} Py_DECREF(v);
else {
PyDict_SetItemString(d, name, v);
Py_DECREF(v);
}
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment