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

Commit 1bd43c16 authored by Narayan Kamath's avatar Narayan Kamath Committed by android-build-merger
Browse files

Process: Fix communication with zygote.

am: e29c6493

Change-Id: I86b073f7f69943911aa0bea782e29ae6d86609a2
parents 62783bde e29c6493
Loading
Loading
Loading
Loading
+15 −6
Original line number Original line Diff line number Diff line
@@ -537,6 +537,15 @@ public class Process {
            ZygoteState zygoteState, ArrayList<String> args)
            ZygoteState zygoteState, ArrayList<String> args)
            throws ZygoteStartFailedEx {
            throws ZygoteStartFailedEx {
        try {
        try {
            // Throw early if any of the arguments are malformed. This means we can
            // avoid writing a partial response to the zygote.
            int sz = args.size();
            for (int i = 0; i < sz; i++) {
                if (args.get(i).indexOf('\n') >= 0) {
                    throw new ZygoteStartFailedEx("embedded newlines not allowed");
                }
            }

            /**
            /**
             * See com.android.internal.os.ZygoteInit.readArgumentList()
             * See com.android.internal.os.ZygoteInit.readArgumentList()
             * Presently the wire format to the zygote process is:
             * Presently the wire format to the zygote process is:
@@ -553,13 +562,8 @@ public class Process {
            writer.write(Integer.toString(args.size()));
            writer.write(Integer.toString(args.size()));
            writer.newLine();
            writer.newLine();


            int sz = args.size();
            for (int i = 0; i < sz; i++) {
            for (int i = 0; i < sz; i++) {
                String arg = args.get(i);
                String arg = args.get(i);
                if (arg.indexOf('\n') >= 0) {
                    throw new ZygoteStartFailedEx(
                            "embedded newlines not allowed");
                }
                writer.write(arg);
                writer.write(arg);
                writer.newLine();
                writer.newLine();
            }
            }
@@ -568,11 +572,16 @@ public class Process {


            // Should there be a timeout on this?
            // Should there be a timeout on this?
            ProcessStartResult result = new ProcessStartResult();
            ProcessStartResult result = new ProcessStartResult();

            // Always read the entire result from the input stream to avoid leaving
            // bytes in the stream for future process starts to accidentally stumble
            // upon.
            result.pid = inputStream.readInt();
            result.pid = inputStream.readInt();
            result.usingWrapper = inputStream.readBoolean();

            if (result.pid < 0) {
            if (result.pid < 0) {
                throw new ZygoteStartFailedEx("fork() failed");
                throw new ZygoteStartFailedEx("fork() failed");
            }
            }
            result.usingWrapper = inputStream.readBoolean();
            return result;
            return result;
        } catch (IOException ex) {
        } catch (IOException ex) {
            zygoteState.close();
            zygoteState.close();