summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/content/pm/parsing/ApkLiteParseUtils.java13
-rw-r--r--core/java/android/content/pm/parsing/ParsingPackageUtils.java25
-rw-r--r--core/java/android/content/pm/parsing/component/ComponentParseUtils.java18
3 files changed, 40 insertions, 16 deletions
diff --git a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
index 6d92d3e0d219..72a66ed4d9fe 100644
--- a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
+++ b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
@@ -18,6 +18,7 @@ package android.content.pm.parsing;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME;
import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
+import static android.content.pm.parsing.ParsingPackageUtils.validateName;
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
import android.content.pm.PackageInfo;
@@ -501,10 +502,10 @@ public class ApkLiteParseUtils {
final String packageName = attrs.getAttributeValue(null, "package");
if (!"android".equals(packageName)) {
- final String error = PackageParser.validateName(packageName, true, true);
- if (error != null) {
+ final ParseResult<?> nameResult = validateName(input, packageName, true, true);
+ if (nameResult.isError()) {
return input.error(INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME,
- "Invalid manifest package: " + error);
+ "Invalid manifest package: " + nameResult.getErrorMessage());
}
}
@@ -513,10 +514,10 @@ public class ApkLiteParseUtils {
if (splitName.length() == 0) {
splitName = null;
} else {
- final String error = PackageParser.validateName(splitName, false, false);
- if (error != null) {
+ final ParseResult<?> nameResult = validateName(input, splitName, false, false);
+ if (nameResult.isError()) {
return input.error(INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME,
- "Invalid manifest split: " + error);
+ "Invalid manifest split: " + nameResult.getErrorMessage());
}
}
}
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index b936c6323a80..6196854526e0 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -130,6 +130,12 @@ public class ParsingPackageUtils {
private static final String TAG = ParsingUtils.TAG;
/**
+ * For those names would be used as a part of the file name. Limits size to 223 and reserves 32
+ * for the OS.
+ */
+ private static final int MAX_FILE_NAME_SIZE = 223;
+
+ /**
* @see #parseDefault(ParseInput, File, int, boolean)
*/
@NonNull
@@ -2686,7 +2692,16 @@ public class ParsingPackageUtils {
}
}
- private static ParseResult validateName(ParseInput input, String name, boolean requireSeparator,
+ /**
+ * Check if the given name is valid.
+ *
+ * @param name The name to check.
+ * @param requireSeparator {@code true} if the name requires containing a separator at least.
+ * @param requireFilename {@code true} to apply file name validation to the given name. It also
+ * limits length of the name to the {@link #MAX_FILE_NAME_SIZE}.
+ * @return Success if it's valid.
+ */
+ public static ParseResult validateName(ParseInput input, String name, boolean requireSeparator,
boolean requireFilename) {
final int N = name.length();
boolean hasSep = false;
@@ -2709,8 +2724,12 @@ public class ParsingPackageUtils {
}
return input.error("bad character '" + c + "'");
}
- if (requireFilename && !FileUtils.isValidExtFilename(name)) {
- return input.error("Invalid filename");
+ if (requireFilename) {
+ if (!FileUtils.isValidExtFilename(name)) {
+ return input.error("Invalid filename");
+ } else if (N > MAX_FILE_NAME_SIZE) {
+ return input.error("the length of the name is greater than " + MAX_FILE_NAME_SIZE);
+ }
}
return hasSep || !requireSeparator
? input.success(null)
diff --git a/core/java/android/content/pm/parsing/component/ComponentParseUtils.java b/core/java/android/content/pm/parsing/component/ComponentParseUtils.java
index cfefc016d4a4..d65f8ffc989a 100644
--- a/core/java/android/content/pm/parsing/component/ComponentParseUtils.java
+++ b/core/java/android/content/pm/parsing/component/ComponentParseUtils.java
@@ -16,6 +16,8 @@
package android.content.pm.parsing.component;
+import static android.content.pm.parsing.ParsingPackageUtils.validateName;
+
import android.annotation.AttrRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -118,17 +120,19 @@ public class ComponentParseUtils {
+ ": must be at least two characters");
}
String subName = proc.substring(1);
- String nameError = PackageParser.validateName(subName, false, false);
- if (nameError != null) {
+ final ParseResult<?> nameResult = validateName(input, subName, false, false);
+ if (nameResult.isError()) {
return input.error("Invalid " + type + " name " + proc + " in package " + pkg
- + ": " + nameError);
+ + ": " + nameResult.getErrorMessage());
}
return input.success(pkg + proc);
}
- String nameError = PackageParser.validateName(proc, true, false);
- if (nameError != null && !"system".equals(proc)) {
- return input.error("Invalid " + type + " name " + proc + " in package " + pkg
- + ": " + nameError);
+ if (!"system".equals(proc)) {
+ final ParseResult<?> nameResult = validateName(input, proc, true, false);
+ if (nameResult.isError()) {
+ return input.error("Invalid " + type + " name " + proc + " in package " + pkg
+ + ": " + nameResult.getErrorMessage());
+ }
}
return input.success(proc);
}