Skip to content

Commit d0ba27f

Browse files
authored
fix: tighten span tag parsing (#4061)
1 parent 07ae073 commit d0ba27f

File tree

2 files changed

+21
-17
lines changed

2 files changed

+21
-17
lines changed

brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/data/StyledString.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@
2121
import com.google.common.collect.Iterators;
2222
import com.google.common.collect.PeekingIterator;
2323

24+
import java.util.LinkedHashMap;
2425
import java.util.List;
2526
import java.util.Map;
2627
import java.util.logging.Logger;
28+
import java.util.regex.Pattern;
2729

2830
public class StyledString implements CharSequence {
2931
private static final Logger LOGGER = Logger.getLogger(StyledString.class.getName());
@@ -100,9 +102,10 @@ private void decodeIterate(PeekingIterator<Span> it) {
100102
mBuffer.append('<').append(name);
101103
if (attributes != null) {
102104
for (Map.Entry<String, String> entry : attributes.entrySet()) {
103-
mBuffer.append(' ').append(entry.getKey()).append("=\"")
104-
.append(ResXmlEncoders.escapeXmlChars(entry.getValue()))
105-
.append('"');
105+
mBuffer.append(' ')
106+
.append(entry.getKey()).append("=\"")
107+
.append(ResXmlEncoders.escapeXmlChars(entry.getValue()))
108+
.append('"');
106109
}
107110
}
108111
// If an opening tag is followed by a matching closing tag, write as an empty-element tag.
@@ -132,8 +135,9 @@ private void decodeIterate(PeekingIterator<Span> it) {
132135
}
133136

134137
public static class Span {
135-
private static final Splitter.MapSplitter ATTRIBUTES_SPLITTER =
136-
Splitter.on(';').omitEmptyStrings().withKeyValueSeparator(Splitter.on('=').limit(2));
138+
private static final Splitter.MapSplitter ATTR_SPLITTER = Splitter.on(
139+
Pattern.compile(";(?=[\\p{L}_][\\p{L}\\p{N}_.-]*=)"))
140+
.withKeyValueSeparator(Splitter.on('=').limit(2));
137141

138142
private final String mTag;
139143
private final int mFirstChar;
@@ -159,14 +163,12 @@ public int getLastChar() {
159163

160164
public String getName() {
161165
int separatorIdx = mTag.indexOf(';');
162-
return separatorIdx == -1 ? mTag : mTag.substring(0, separatorIdx);
166+
return separatorIdx != -1 ? mTag.substring(0, separatorIdx) : mTag;
163167
}
164168

165169
public Map<String, String> getAttributes() {
166170
int separatorIdx = mTag.indexOf(';');
167-
return separatorIdx != -1 ? ATTRIBUTES_SPLITTER.split(
168-
mTag.substring(separatorIdx + 1, mTag.endsWith(";") ? mTag.length() - 1 : mTag.length())
169-
) : null;
171+
return separatorIdx != -1 ? ATTR_SPLITTER.split(mTag.substring(separatorIdx + 1)) : null;
170172
}
171173
}
172174
}

brut.apktool/apktool-lib/src/test/resources/testapp/res/values-mcc001/strings.xml

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@
66
<string name="test_string3">\@</string>
77
<string name="test_string4">\?</string>
88
<string name="test_string5">\#ff123456</string>
9-
<string name="test_string7">&amp;</string>
10-
<string name="test_string8">"'"</string>
11-
<string name="test_string9">\"</string>
12-
<string name="test_string10">\u0005</string>
13-
<string name="test_string11">" foo bar "</string>
14-
<string name="test_string12">"foo
9+
<string name="test_string6">&amp;</string>
10+
<string name="test_string7">"'"</string>
11+
<string name="test_string8">\"</string>
12+
<string name="test_string9">\u0005</string>
13+
<string name="test_string10">" foo bar "</string>
14+
<string name="test_string11">"foo
1515
bar"</string>
16-
<string name="test_string13">" foo"<b>bar <i> baz </i></b> <u>foo</u></string>
17-
<string name="test_string14">foo<sometag someattr1="someval1" someattr2="someval2">bar</sometag>baz</string>
16+
<string name="test_string12">" foo"<b>bar <i> baz </i></b> <u>foo</u></string>
17+
<string name="test_string13">foo<sometag someattr1="someval1" someattr2="someval2">bar</sometag>baz</string>
18+
<string name="test_string14">foo<span style="font-family:serif;font-size: 12px;">bar</span>baz</string>
19+
<string name="test_string15">foo<span href="https://test.com/1234#param=val" style="font-family: serif; font-size:12px;">bar</span>baz</string>
1820
<string name="test_string16">foo<b>bar<i>"b
1921
az"</i></b>foo</string>
2022
<string name="test_string17" formatted="false">%d of %d</string>

0 commit comments

Comments
 (0)