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

Commit 61aeac6d authored by Winson's avatar Winson
Browse files

Do not force endDocument for domain verify settings

Removes the endDocument call so the serializer can be used as a child
of a larger group. Instead calls flush and assumes all usages will
close tags appropriately.

This usage is incorrect regardless, but endDocument itself is broken
and does not behave the same depending on which XmlSerialier
implementation is being used. Which is why this bug never appeared
during testing/development.

Bug: 180838875
Bug: 181813200

Test: manual, debug linked Bug
Test: atest DomainVerificationPersistenceTest

Change-Id: I50e27817e526d2cbcc0efbcc3ffdfffa53886f0f
parent c28d1fee
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -83,7 +83,7 @@ public class SettingsXml {
        @Override
        @Override
        public void close() throws IOException {
        public void close() throws IOException {
            mWriteSection.closeCompletely();
            mWriteSection.closeCompletely();
            mXmlSerializer.endDocument();
            mXmlSerializer.flush();
        }
        }
    }
    }


+0 −1
Original line number Original line Diff line number Diff line
@@ -32,7 +32,6 @@ import com.android.server.pm.SettingsXml;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserException;


import java.io.IOException;
import java.io.IOException;
import java.util.Map;


/**
/**
 * Reads and writes the old {@link android.content.pm.IntentFilterVerificationInfo} so that it can
 * Reads and writes the old {@link android.content.pm.IntentFilterVerificationInfo} so that it can
+24 −3
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@ import com.google.common.truth.Truth.assertWithMessage
import org.junit.Rule
import org.junit.Rule
import org.junit.Test
import org.junit.Test
import org.junit.rules.TemporaryFolder
import org.junit.rules.TemporaryFolder
import org.xmlpull.v1.XmlPullParser
import java.io.File
import java.io.File
import java.nio.charset.StandardCharsets
import java.nio.charset.StandardCharsets
import java.util.UUID
import java.util.UUID
@@ -41,21 +42,41 @@ class DomainVerificationPersistenceTest {


        internal fun File.writeXml(block: (serializer: TypedXmlSerializer) -> Unit) = apply {
        internal fun File.writeXml(block: (serializer: TypedXmlSerializer) -> Unit) = apply {
            outputStream().use {
            outputStream().use {
                // Explicitly use string based XML so it can printed in the test failure output
                // This must use the binary serializer the mirror the production behavior, as
                Xml.newFastSerializer()
                // there are slight differences with the string based one.
                Xml.newBinarySerializer()
                    .apply {
                    .apply {
                        setOutput(it, StandardCharsets.UTF_8.name())
                        setOutput(it, StandardCharsets.UTF_8.name())
                        startDocument(null, true)
                        startDocument(null, true)
                        setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true)
                        setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true)
                        // Write a wrapping tag to ensure the domain verification settings didn't
                        // close out the document, allowing other settings to be written
                        startTag(null, "wrapper-tag")
                    }
                    }
                    .apply(block)
                    .apply(block)
                    .apply {
                        startTag(null, "trailing-tag")
                        endTag(null, "trailing-tag")
                        endTag(null, "wrapper-tag")
                    }
                    .endDocument()
                    .endDocument()
            }
            }
        }
        }


        internal fun <T> File.readXml(block: (parser: TypedXmlPullParser) -> T) =
        internal fun <T> File.readXml(block: (parser: TypedXmlPullParser) -> T) =
            inputStream().use {
            inputStream().use {
                block(Xml.resolvePullParser(it))
                val parser = Xml.resolvePullParser(it)
                assertThat(parser.nextTag()).isEqualTo(XmlPullParser.START_TAG)
                assertThat(parser.name).isEqualTo("wrapper-tag")
                assertThat(parser.nextTag()).isEqualTo(XmlPullParser.START_TAG)
                block(parser).also {
                    assertThat(parser.nextTag()).isEqualTo(XmlPullParser.START_TAG)
                    assertThat(parser.name).isEqualTo("trailing-tag")
                    assertThat(parser.nextTag()).isEqualTo(XmlPullParser.END_TAG)
                    assertThat(parser.name).isEqualTo("trailing-tag")
                    assertThat(parser.nextTag()).isEqualTo(XmlPullParser.END_TAG)
                    assertThat(parser.name).isEqualTo("wrapper-tag")
                }
            }
            }
    }
    }