Permalink
Browse files

Fix adb leaking file descriptors to forked processes

accept() creates a new file descriptor that should be closed on exec so
that forked processes don't keep a fd opened on the socket.

This also fixes b/3297070 where adb hangs after running adb on the
target.

Change-Id: I8df511289e5549ae49b4824c9dfb71a3bf85eae8
  • Loading branch information...
1 parent eb5df47 commit 3b4a0c81c4f2af46e6075f1150dcde55d436c7a6 @benoitgoby benoitgoby committed with mikeandroid Feb 2, 2011
Showing with 11 additions and 1 deletion.
  1. +2 −0 adb/adb.c
  2. +1 −0 adb/jdwp_service.c
  3. +1 −0 adb/services.c
  4. +7 −1 adb/sysdeps.h
View
@@ -682,9 +682,11 @@ void start_device_log(void)
dup2(fd, 1);
dup2(fd, 2);
fprintf(stderr,"--- adb starting (pid %d) ---\n", getpid());
+ adb_close(fd);
fd = unix_open("/dev/null", O_RDONLY);
dup2(fd, 0);
+ adb_close(fd);
}
#endif
View
@@ -499,6 +499,7 @@ jdwp_control_init( JdwpControl* control,
/* only wait for incoming connections */
fdevent_add(control->fde, FDE_READ);
+ close_on_exec(s);
D("jdwp control socket started (%d)\n", control->listen_socket);
return 0;
View
@@ -309,6 +309,7 @@ static int create_subprocess(const char *cmd, const char *arg0, const char *arg1
dup2(pts, 1);
dup2(pts, 2);
+ adb_close(pts);
adb_close(ptm);
execl(cmd, cmd, arg0, arg1, NULL);
View
@@ -387,7 +387,13 @@ static __inline__ int adb_creat(const char* path, int mode)
static __inline__ int adb_socket_accept(int serverfd, struct sockaddr* addr, socklen_t *addrlen)
{
- return accept( serverfd, addr, addrlen );
+ int fd;
+
+ fd = accept(serverfd, addr, addrlen);
+ if (fd >= 0)
+ close_on_exec(fd);
+
+ return fd;
}
#undef accept

0 comments on commit 3b4a0c8

Please sign in to comment.