Merge pull request #1120 from ihanson/encode

Consistently encode unknown filenames to prevent cast error
This commit is contained in:
Connor Tumbleson 2016-01-03 17:49:54 -06:00
commit 06a96d035d
5 changed files with 26 additions and 9 deletions

View File

@ -30,6 +30,7 @@ import brut.directory.*;
import brut.util.BrutIO; import brut.util.BrutIO;
import brut.util.OS; import brut.util.OS;
import java.io.*; import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -258,7 +259,11 @@ public class Androlib {
InputStream in = appDir.getDirectory().getFileInput("apktool.yml") InputStream in = appDir.getDirectory().getFileInput("apktool.yml")
) { ) {
Yaml yaml = new Yaml(); Yaml yaml = new Yaml();
return (Map<String, Object>) yaml.load(in); Map<String, Object> result = (Map<String, Object>) yaml.load(in);
if (result.containsKey("unknownFiles")) {
result.put("unknownFiles", getUnknownFiles(result));
}
return result;
} catch (DirectoryException | IOException ex) { } catch (DirectoryException | IOException ex) {
throw new AndrolibException(ex); throw new AndrolibException(ex);
} }
@ -737,6 +742,15 @@ public class Androlib {
return files; return files;
} }
private static Map<String, String> getUnknownFiles(Map<String, Object> meta) {
Map<byte[], String> unknownFiles = (Map<byte[], String>) meta.get("unknownFiles");
Map<String, String> result = new LinkedHashMap<>();
for (Map.Entry<byte[], String> entry : unknownFiles.entrySet()) {
result.put(new String(entry.getKey(), StandardCharsets.UTF_8), entry.getValue());
}
return result;
}
private final static Logger LOGGER = Logger.getLogger(Androlib.class.getName()); private final static Logger LOGGER = Logger.getLogger(Androlib.class.getName());
private final static String SMALI_DIRNAME = "smali"; private final static String SMALI_DIRNAME = "smali";

View File

@ -377,7 +377,7 @@ public class ApkDecoder {
} }
private void putUnknownInfo(Map<String, Object> meta) throws AndrolibException { private void putUnknownInfo(Map<String, Object> meta) throws AndrolibException {
Map<String,String> info = mAndrolib.mResUnknownFiles.getUnknownFiles(); Map<byte[], String> info = mAndrolib.mResUnknownFiles.getUnknownFiles();
if (info.size() > 0) { if (info.size() > 0) {
meta.put("unknownFiles", info); meta.put("unknownFiles", info);
} }

View File

@ -15,6 +15,7 @@
*/ */
package brut.androlib.res.data; package brut.androlib.res.data;
import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
@ -23,13 +24,13 @@ import java.util.Map;
*/ */
public class ResUnknownFiles { public class ResUnknownFiles {
private final Map<String, String> mUnknownFiles = new LinkedHashMap<String, String>(); private final Map<byte[], String> mUnknownFiles = new LinkedHashMap<byte[], String>();
public void addUnknownFileInfo(String file, String value) { public void addUnknownFileInfo(String file, String value) {
mUnknownFiles.put(file,value); mUnknownFiles.put(file.getBytes(StandardCharsets.UTF_8), value);
} }
public Map<String, String> getUnknownFiles() { public Map<byte[], String> getUnknownFiles() {
return mUnknownFiles; return mUnknownFiles;
} }
} }

View File

@ -11,7 +11,8 @@ versionInfo:
versionName: '1.0' versionName: '1.0'
compressionType: false compressionType: false
unknownFiles: unknownFiles:
hidden.file: '8' !!binary "aGlkZGVuLmZpbGU=": '8'
stored.file: '0' !!binary "bm9uf3ByaW50YWJsZS5maWxl": '8'
unk_folder/unknown_file: '8' !!binary "c3RvcmVkLmZpbGU=": '0'
lib_bug603/bug603: '8' !!binary "dW5rX2ZvbGRlci91bmtub3duX2ZpbGU=": '8'
!!binary "bGliX2J1ZzYwMy9idWc2MDM=": '8'

View File

@ -0,0 +1 @@
This file's name contains a non-printable character.