am 02565fec: merge from open-source master

Merge commit '02565fec8240bbff105f285e9e25aade52c15450'

* commit '02565fec8240bbff105f285e9e25aade52c15450':
  Fix ADB daemon file descriptor leak
This commit is contained in:
The Android Open Source Project 2010-07-20 10:16:40 -07:00 committed by Android Git Automerger
commit 4984f54c4c
1 changed files with 26 additions and 1 deletions

View File

@ -5,6 +5,7 @@
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
/* here's how these things work.
@ -320,6 +321,7 @@ jdwp_process_event( int socket, unsigned events, void* _proc )
struct iovec iov;
char dummy = '!';
char buffer[sizeof(struct cmsghdr) + sizeof(int)];
int flags;
iov.iov_base = &dummy;
iov.iov_len = 1;
@ -337,10 +339,27 @@ jdwp_process_event( int socket, unsigned events, void* _proc )
cmsg->cmsg_type = SCM_RIGHTS;
((int*)CMSG_DATA(cmsg))[0] = fd;
flags = fcntl(proc->socket,F_GETFL,0);
if (flags == -1) {
D("failed to get cntl flags for socket %d: %s\n",
proc->pid, strerror(errno));
goto CloseProcess;
}
if (fcntl(proc->socket, F_SETFL, flags & ~O_NONBLOCK) == -1) {
D("failed to remove O_NONBLOCK flag for socket %d: %s\n",
proc->pid, strerror(errno));
goto CloseProcess;
}
for (;;) {
ret = sendmsg(proc->socket, &msg, 0);
if (ret >= 0)
if (ret >= 0) {
adb_close(fd);
break;
}
if (errno == EINTR)
continue;
D("sending new file descriptor to JDWP %d failed: %s\n",
@ -354,6 +373,12 @@ jdwp_process_event( int socket, unsigned events, void* _proc )
for (n = 1; n < proc->out_count; n++)
proc->out_fds[n-1] = proc->out_fds[n];
if (fcntl(proc->socket, F_SETFL, flags) == -1) {
D("failed to set O_NONBLOCK flag for socket %d: %s\n",
proc->pid, strerror(errno));
goto CloseProcess;
}
if (--proc->out_count == 0)
fdevent_del( proc->fde, FDE_WRITE );
}