mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 01:03:55 -06:00
Don't leak file descriptors
We're leaking file descriptors to child processes. Set FD_CLOEXEC on file descriptors that don't need to be passed to children to stop this misbehaviour. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
12c09b8ce2
commit
40ff6d7e8d
20 changed files with 178 additions and 34 deletions
|
@ -132,7 +132,7 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
|
|||
addr.sin_port = 0;
|
||||
addr.sin_addr.s_addr = INADDR_ANY;
|
||||
|
||||
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0 ||
|
||||
if ((s = qemu_socket(AF_INET, SOCK_STREAM, 0)) < 0 ||
|
||||
bind(s, (struct sockaddr *)&addr, addrlen) < 0 ||
|
||||
listen(s, 1) < 0) {
|
||||
lprint("Error: inet socket: %s\n", strerror(errno));
|
||||
|
@ -165,7 +165,7 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
|
|||
* Connect to the socket
|
||||
* XXX If any of these fail, we're in trouble!
|
||||
*/
|
||||
s = socket(AF_INET, SOCK_STREAM, 0);
|
||||
s = qemu_socket(AF_INET, SOCK_STREAM, 0);
|
||||
addr.sin_addr = loopback_addr;
|
||||
do {
|
||||
ret = connect(s, (struct sockaddr *)&addr, addrlen);
|
||||
|
|
|
@ -197,6 +197,10 @@ int inet_aton(const char *cp, struct in_addr *ia);
|
|||
#include "bootp.h"
|
||||
#include "tftp.h"
|
||||
|
||||
/* osdep.c */
|
||||
int qemu_socket(int domain, int type, int protocol);
|
||||
|
||||
|
||||
struct Slirp {
|
||||
QTAILQ_ENTRY(Slirp) entry;
|
||||
|
||||
|
|
|
@ -626,7 +626,7 @@ tcp_listen(Slirp *slirp, u_int32_t haddr, u_int hport, u_int32_t laddr,
|
|||
addr.sin_addr.s_addr = haddr;
|
||||
addr.sin_port = hport;
|
||||
|
||||
if (((s = socket(AF_INET,SOCK_STREAM,0)) < 0) ||
|
||||
if (((s = qemu_socket(AF_INET,SOCK_STREAM,0)) < 0) ||
|
||||
(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int)) < 0) ||
|
||||
(bind(s,(struct sockaddr *)&addr, sizeof(addr)) < 0) ||
|
||||
(listen(s,1) < 0)) {
|
||||
|
|
|
@ -325,7 +325,7 @@ int tcp_fconnect(struct socket *so)
|
|||
DEBUG_CALL("tcp_fconnect");
|
||||
DEBUG_ARG("so = %lx", (long )so);
|
||||
|
||||
if( (ret=so->s=socket(AF_INET,SOCK_STREAM,0)) >= 0) {
|
||||
if( (ret = so->s = qemu_socket(AF_INET,SOCK_STREAM,0)) >= 0) {
|
||||
int opt, s=so->s;
|
||||
struct sockaddr_in addr;
|
||||
|
||||
|
|
|
@ -302,7 +302,7 @@ int udp_output(struct socket *so, struct mbuf *m,
|
|||
int
|
||||
udp_attach(struct socket *so)
|
||||
{
|
||||
if((so->s = socket(AF_INET,SOCK_DGRAM,0)) != -1) {
|
||||
if((so->s = qemu_socket(AF_INET,SOCK_DGRAM,0)) != -1) {
|
||||
so->so_expire = curtime + SO_EXPIRE;
|
||||
insque(so, &so->slirp->udb);
|
||||
}
|
||||
|
@ -350,7 +350,7 @@ udp_listen(Slirp *slirp, u_int32_t haddr, u_int hport, u_int32_t laddr,
|
|||
if (!so) {
|
||||
return NULL;
|
||||
}
|
||||
so->s = socket(AF_INET,SOCK_DGRAM,0);
|
||||
so->s = qemu_socket(AF_INET,SOCK_DGRAM,0);
|
||||
so->so_expire = curtime + SO_EXPIRE;
|
||||
insque(so, &slirp->udb);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue