Merge "Fix hang after end of backup"
diff --git a/adb/backup_service.c b/adb/backup_service.c
index 4f0c8ac..669ff86 100644
--- a/adb/backup_service.c
+++ b/adb/backup_service.c
@@ -22,6 +22,11 @@
 #define TRACE_TAG  TRACE_ADB
 #include "adb.h"
 
+typedef struct {
+    pid_t pid;
+    int fd;
+} backup_harvest_params;
+
 // socketpair but do *not* mark as close_on_exec
 static int backup_socketpair(int sv[2]) {
     int rc = unix_socketpair( AF_UNIX, SOCK_STREAM, 0, sv );
@@ -31,11 +36,14 @@
     return 0;
 }
 
-static void* backup_child_waiter(void* pid_cookie) {
+// harvest the child process then close the read end of the socketpair
+static void* backup_child_waiter(void* args) {
     int status;
+    backup_harvest_params* params = (backup_harvest_params*) args;
 
-    waitpid((pid_t) pid_cookie, &status, 0);
-    D("harvested backup/restore child, status=%d\n", status);
+    waitpid(params->pid, &status, 0);
+    adb_close(params->fd);
+    free(params);
     return NULL;
 }
 
@@ -124,14 +132,19 @@
         exit(-1);
     } else {
         adb_thread_t t;
+        backup_harvest_params* params;
 
         // parent, i.e. adbd -- close the sending half of the socket
         D("fork() returned pid %d\n", pid);
         adb_close(s[1]);
 
         // spin a thread to harvest the child process
-        if (adb_thread_create(&t, backup_child_waiter, (void*)pid)) {
+        params = (backup_harvest_params*) malloc(sizeof(backup_harvest_params));
+        params->pid = pid;
+        params->fd = s[0];
+        if (adb_thread_create(&t, backup_child_waiter, params)) {
             adb_close(s[0]);
+            free(params);
             D("Unable to create child harvester\n");
             return -1;
         }