Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fdb13f79 authored by Jean-Baptiste Queru's avatar Jean-Baptiste Queru Committed by Android Code Review
Browse files

Merge "Fix ADB daemon file descriptor leak"

parents 22b0b565 8f5daadc
Loading
Loading
Loading
Loading
+26 −1
Original line number Diff line number Diff line
@@ -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 );
        }