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

Commit f6226c6b authored by Pawan Wagh's avatar Pawan Wagh
Browse files

Limit values of data position in fuzzer

Negative values for data position leads to crashes in native code.
Limit domain to positive values only.

Test: m java_binder_parcel_fuzzer && ./jazzer_helper.sh --fuzz_target java_binder_parcel_fuzzer --target_class parcelfuzzer.ParcelFuzzer
Bug: 264673355
Change-Id: I5ce13560c30f96a8562b0b3c0fe98e1c1d7318ab
parent 73de090f
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -97,7 +97,7 @@ public class ReadUtils {
    public static ReadOperation[] READ_OPERATIONS =
            new ReadOperation[] {
                    (parcel, provider) -> {
                        parcel.setDataPosition(provider.consumeInt());
                        parcel.setDataPosition(provider.consumeInt(0, Integer.MAX_VALUE));
                    },
                    (parcel, provider) -> {
                        parcel.setDataCapacity(provider.consumeInt());
@@ -155,6 +155,7 @@ public class ReadUtils {
                        byte[] array;
                        if (provider.consumeBoolean()) {
                            int pos = parcel.dataPosition();
                            if (pos < 0) return;
                            array = new byte[Math.min(MAX_LEN, parcel.readInt())];
                            parcel.setDataPosition(pos);
                        } else {
@@ -166,6 +167,7 @@ public class ReadUtils {
                        char[] array;
                        if (provider.consumeBoolean()) {
                            int pos = parcel.dataPosition();
                            if (pos < 0) return;
                            array = new char[Math.min(MAX_LEN, parcel.readInt())];
                            parcel.setDataPosition(pos);
                        } else {
@@ -177,6 +179,7 @@ public class ReadUtils {
                        int[] array;
                        if (provider.consumeBoolean()) {
                            int pos = parcel.dataPosition();
                            if (pos < 0) return;
                            array = new int[Math.min(MAX_LEN, parcel.readInt())];
                            parcel.setDataPosition(pos);
                        } else {
@@ -188,6 +191,7 @@ public class ReadUtils {
                        double[] array;
                        if (provider.consumeBoolean()) {
                            int pos = parcel.dataPosition();
                            if (pos < 0) return;
                            array = new double[Math.min(MAX_LEN, parcel.readInt())];
                            parcel.setDataPosition(pos);
                        } else {
@@ -199,6 +203,7 @@ public class ReadUtils {
                        float[] array;
                        if (provider.consumeBoolean()) {
                            int pos = parcel.dataPosition();
                            if (pos < 0) return;
                            array = new float[Math.min(MAX_LEN, parcel.readInt())];
                            parcel.setDataPosition(pos);
                        } else {
@@ -210,6 +215,7 @@ public class ReadUtils {
                        boolean[] array;
                        if (provider.consumeBoolean()) {
                            int pos = parcel.dataPosition();
                            if (pos < 0) return;
                            array = new boolean[Math.min(MAX_LEN, parcel.readInt())];
                            parcel.setDataPosition(pos);
                        } else {
@@ -221,6 +227,7 @@ public class ReadUtils {
                        long[] array;
                        if (provider.consumeBoolean()) {
                            int pos = parcel.dataPosition();
                            if (pos < 0) return;
                            array = new long[Math.min(MAX_LEN, parcel.readInt())];
                            parcel.setDataPosition(pos);
                        } else {
@@ -232,6 +239,7 @@ public class ReadUtils {
                        IBinder[] array;
                        if (provider.consumeBoolean()) {
                            int pos = parcel.dataPosition();
                            if (pos < 0) return;
                            array = new IBinder[Math.min(MAX_LEN, parcel.readInt())];
                            parcel.setDataPosition(pos);
                        } else {
@@ -274,6 +282,7 @@ public class ReadUtils {
                        SingleDataParcelable[] array;
                        if (provider.consumeBoolean()) {
                            int pos = parcel.dataPosition();
                            if (pos < 0) return;
                            array = new SingleDataParcelable[Math.min(MAX_LEN, parcel.readInt())];
                            parcel.setDataPosition(pos);
                        } else {
@@ -293,6 +302,7 @@ public class ReadUtils {
                        EmptyParcelable[] array;
                        if (provider.consumeBoolean()) {
                            int pos = parcel.dataPosition();
                            if (pos < 0) return;
                            array = new EmptyParcelable[Math.min(MAX_LEN, parcel.readInt())];
                            parcel.setDataPosition(pos);
                        } else {
@@ -312,6 +322,7 @@ public class ReadUtils {
                        GenericDataParcelable[] array;
                        if (provider.consumeBoolean()) {
                            int pos = parcel.dataPosition();
                            if (pos < 0) return;
                            array = new GenericDataParcelable[Math.min(MAX_LEN, parcel.readInt())];
                            parcel.setDataPosition(pos);
                        } else {
@@ -334,6 +345,7 @@ public class ReadUtils {
                        SomeParcelable[] array;
                        if (provider.consumeBoolean()) {
                            int pos = parcel.dataPosition();
                            if (pos < 0) return;
                            array = new SomeParcelable[Math.min(MAX_LEN, parcel.readInt())];
                            parcel.setDataPosition(pos);
                        } else {
@@ -390,6 +402,7 @@ public class ReadUtils {
                        TestInterface[] array;
                        if (provider.consumeBoolean()) {
                            int pos = parcel.dataPosition();
                            if (pos < 0) return;
                            array = new TestInterface[Math.min(MAX_LEN, parcel.readInt())];
                            parcel.setDataPosition(pos);
                        } else {