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
This commit is contained in:
Winson
2021-03-03 12:48:40 -08:00
parent c28d1fee5e
commit 61aeac6dc5
3 changed files with 25 additions and 5 deletions

View File

@@ -83,7 +83,7 @@ public class SettingsXml {
@Override
public void close() throws IOException {
mWriteSection.closeCompletely();
mXmlSerializer.endDocument();
mXmlSerializer.flush();
}
}

View File

@@ -32,7 +32,6 @@ import com.android.server.pm.SettingsXml;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.Map;
/**
* Reads and writes the old {@link android.content.pm.IntentFilterVerificationInfo} so that it can

View File

@@ -30,6 +30,7 @@ import com.google.common.truth.Truth.assertWithMessage
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TemporaryFolder
import org.xmlpull.v1.XmlPullParser
import java.io.File
import java.nio.charset.StandardCharsets
import java.util.UUID
@@ -41,21 +42,41 @@ class DomainVerificationPersistenceTest {
internal fun File.writeXml(block: (serializer: TypedXmlSerializer) -> Unit) = apply {
outputStream().use {
// Explicitly use string based XML so it can printed in the test failure output
Xml.newFastSerializer()
// This must use the binary serializer the mirror the production behavior, as
// there are slight differences with the string based one.
Xml.newBinarySerializer()
.apply {
setOutput(it, StandardCharsets.UTF_8.name())
startDocument(null, 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 {
startTag(null, "trailing-tag")
endTag(null, "trailing-tag")
endTag(null, "wrapper-tag")
}
.endDocument()
}
}
internal fun <T> File.readXml(block: (parser: TypedXmlPullParser) -> T) =
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")
}
}
}