Merge "Do not throw new incremental not found exceptions" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
b8c21ea5d5
@@ -29,7 +29,6 @@
|
||||
#include "utils/Trace.h"
|
||||
|
||||
#include "android_content_res_ApkAssets.h"
|
||||
#include "android_util_AssetManager_private.h"
|
||||
#include "core_jni_helpers.h"
|
||||
#include "jni.h"
|
||||
#include "nativehelper/ScopedUtfChars.h"
|
||||
@@ -473,8 +472,9 @@ static jlong NativeOpenXml(JNIEnv* env, jclass /*clazz*/, jlong ptr, jstring fil
|
||||
const auto buffer = asset->getIncFsBuffer(true /* aligned */);
|
||||
const size_t length = asset->getLength();
|
||||
if (!buffer.convert<uint8_t>().verify(length)) {
|
||||
jniThrowException(env, kResourcesNotFound, kIOErrorMessage);
|
||||
return 0;
|
||||
jniThrowException(env, "java/io/FileNotFoundException",
|
||||
"File not fully present due to incremental installation");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// DynamicRefTable is only needed when looking up resource references. Opening an XML file
|
||||
|
||||
@@ -43,7 +43,6 @@
|
||||
#include "androidfw/ResourceUtils.h"
|
||||
|
||||
#include "android_content_res_ApkAssets.h"
|
||||
#include "android_util_AssetManager_private.h"
|
||||
#include "core_jni_helpers.h"
|
||||
#include "jni.h"
|
||||
#include "nativehelper/JNIPlatformHelp.h"
|
||||
@@ -574,8 +573,9 @@ static jlong NativeOpenXmlAsset(JNIEnv* env, jobject /*clazz*/, jlong ptr, jint
|
||||
const incfs::map_ptr<void> buffer = asset->getIncFsBuffer(true /* aligned */);
|
||||
const size_t length = asset->getLength();
|
||||
if (!buffer.convert<uint8_t>().verify(length)) {
|
||||
jniThrowException(env, kResourcesNotFound, kIOErrorMessage);
|
||||
return 0;
|
||||
jniThrowException(env, "java/io/FileNotFoundException",
|
||||
"File not fully present due to incremental installation");
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto xml_tree = util::make_unique<ResXMLTree>(assetmanager->GetDynamicRefTableForCookie(cookie));
|
||||
@@ -611,8 +611,9 @@ static jlong NativeOpenXmlAssetFd(JNIEnv* env, jobject /*clazz*/, jlong ptr, int
|
||||
const incfs::map_ptr<void> buffer = asset->getIncFsBuffer(true /* aligned */);
|
||||
const size_t length = asset->getLength();
|
||||
if (!buffer.convert<uint8_t>().verify(length)) {
|
||||
jniThrowException(env, kResourcesNotFound, kIOErrorMessage);
|
||||
return 0;
|
||||
jniThrowException(env, "java/io/FileNotFoundException",
|
||||
"File not fully present due to incremental installation");
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto xml_tree = util::make_unique<ResXMLTree>(assetmanager->GetDynamicRefTableForCookie(cookie));
|
||||
@@ -631,14 +632,12 @@ static jint NativeGetResourceValue(JNIEnv* env, jclass /*clazz*/, jlong ptr, jin
|
||||
auto value = assetmanager->GetResource(static_cast<uint32_t>(resid), false /*may_be_bag*/,
|
||||
static_cast<uint16_t>(density));
|
||||
if (!value.has_value()) {
|
||||
ThrowIfIOError(env, value);
|
||||
return ApkAssetsCookieToJavaCookie(kInvalidCookie);
|
||||
}
|
||||
|
||||
if (resolve_references) {
|
||||
auto result = assetmanager->ResolveReference(value.value());
|
||||
if (!result.has_value()) {
|
||||
ThrowIfIOError(env, result);
|
||||
return ApkAssetsCookieToJavaCookie(kInvalidCookie);
|
||||
}
|
||||
}
|
||||
@@ -650,7 +649,6 @@ static jint NativeGetResourceBagValue(JNIEnv* env, jclass /*clazz*/, jlong ptr,
|
||||
ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
|
||||
auto bag = assetmanager->GetBag(static_cast<uint32_t>(resid));
|
||||
if (!bag.has_value()) {
|
||||
ThrowIfIOError(env, bag);
|
||||
return ApkAssetsCookieToJavaCookie(kInvalidCookie);
|
||||
}
|
||||
|
||||
@@ -669,7 +667,6 @@ static jint NativeGetResourceBagValue(JNIEnv* env, jclass /*clazz*/, jlong ptr,
|
||||
AssetManager2::SelectedValue attr_value(*bag, *entry);
|
||||
auto result = assetmanager->ResolveReference(attr_value);
|
||||
if (!result.has_value()) {
|
||||
ThrowIfIOError(env, result);
|
||||
return ApkAssetsCookieToJavaCookie(kInvalidCookie);
|
||||
}
|
||||
return CopyValue(env, attr_value, typed_value);
|
||||
@@ -679,7 +676,6 @@ static jintArray NativeGetStyleAttributes(JNIEnv* env, jclass /*clazz*/, jlong p
|
||||
ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
|
||||
auto bag_result = assetmanager->GetBag(static_cast<uint32_t>(resid));
|
||||
if (!bag_result.has_value()) {
|
||||
ThrowIfIOError(env, bag_result);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -701,7 +697,6 @@ static jobjectArray NativeGetResourceStringArray(JNIEnv* env, jclass /*clazz*/,
|
||||
ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
|
||||
auto bag_result = assetmanager->GetBag(static_cast<uint32_t>(resid));
|
||||
if (!bag_result.has_value()) {
|
||||
ThrowIfIOError(env, bag_result);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -716,7 +711,6 @@ static jobjectArray NativeGetResourceStringArray(JNIEnv* env, jclass /*clazz*/,
|
||||
AssetManager2::SelectedValue attr_value(bag, bag->entries[i]);
|
||||
auto result = assetmanager->ResolveReference(attr_value);
|
||||
if (!result.has_value()) {
|
||||
ThrowIfIOError(env, result);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -724,22 +718,16 @@ static jobjectArray NativeGetResourceStringArray(JNIEnv* env, jclass /*clazz*/,
|
||||
const ApkAssets* apk_assets = assetmanager->GetApkAssets()[attr_value.cookie];
|
||||
const ResStringPool* pool = apk_assets->GetLoadedArsc()->GetStringPool();
|
||||
|
||||
jstring java_string = nullptr;
|
||||
auto str_utf8 = pool->string8At(attr_value.data);
|
||||
if (UNLIKELY(ThrowIfIOError(env, str_utf8))) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (str_utf8.has_value()) {
|
||||
java_string = env->NewStringUTF(str_utf8->data());
|
||||
jstring java_string;
|
||||
if (auto str_utf8 = pool->string8At(attr_value.data); str_utf8.has_value()) {
|
||||
java_string = env->NewStringUTF(str_utf8->data());
|
||||
} else {
|
||||
auto str_utf16 = pool->stringAt(attr_value.data);
|
||||
if (!str_utf16.has_value()) {
|
||||
ThrowIfIOError(env, str_utf16);
|
||||
return nullptr;
|
||||
}
|
||||
java_string = env->NewString(reinterpret_cast<const jchar*>(str_utf16->data()),
|
||||
str_utf16->size());
|
||||
auto str_utf16 = pool->stringAt(attr_value.data);
|
||||
if (!str_utf16.has_value()) {
|
||||
return nullptr;
|
||||
}
|
||||
java_string = env->NewString(reinterpret_cast<const jchar*>(str_utf16->data()),
|
||||
str_utf16->size());
|
||||
}
|
||||
|
||||
// Check for errors creating the strings (if malformed or no memory).
|
||||
@@ -762,7 +750,6 @@ static jintArray NativeGetResourceStringArrayInfo(JNIEnv* env, jclass /*clazz*/,
|
||||
ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
|
||||
auto bag_result = assetmanager->GetBag(static_cast<uint32_t>(resid));
|
||||
if (!bag_result.has_value()) {
|
||||
ThrowIfIOError(env, bag_result);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -782,7 +769,6 @@ static jintArray NativeGetResourceStringArrayInfo(JNIEnv* env, jclass /*clazz*/,
|
||||
auto result = assetmanager->ResolveReference(attr_value);
|
||||
if (!result.has_value()) {
|
||||
env->ReleasePrimitiveArrayCritical(array, buffer, JNI_ABORT);
|
||||
ThrowIfIOError(env, result);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -802,7 +788,6 @@ static jintArray NativeGetResourceIntArray(JNIEnv* env, jclass /*clazz*/, jlong
|
||||
ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
|
||||
auto bag_result = assetmanager->GetBag(static_cast<uint32_t>(resid));
|
||||
if (!bag_result.has_value()) {
|
||||
ThrowIfIOError(env, bag_result);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -822,7 +807,6 @@ static jintArray NativeGetResourceIntArray(JNIEnv* env, jclass /*clazz*/, jlong
|
||||
auto result = assetmanager->ResolveReference(attr_value);
|
||||
if (!result.has_value()) {
|
||||
env->ReleasePrimitiveArrayCritical(array, buffer, 0);
|
||||
ThrowIfIOError(env, result);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -839,7 +823,6 @@ static jint NativeGetResourceArraySize(JNIEnv* env, jclass /*clazz*/, jlong ptr,
|
||||
ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
|
||||
auto bag = assetmanager->GetBag(static_cast<uint32_t>(resid));
|
||||
if (!bag.has_value()) {
|
||||
ThrowIfIOError(env, bag);
|
||||
return -1;
|
||||
}
|
||||
return static_cast<jint>((*bag)->entry_count);
|
||||
@@ -850,7 +833,6 @@ static jint NativeGetResourceArray(JNIEnv* env, jclass /*clazz*/, jlong ptr, jin
|
||||
ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
|
||||
auto bag_result = assetmanager->GetBag(static_cast<uint32_t>(resid));
|
||||
if (!bag_result.has_value()) {
|
||||
ThrowIfIOError(env, bag_result);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -877,7 +859,6 @@ static jint NativeGetResourceArray(JNIEnv* env, jclass /*clazz*/, jlong ptr, jin
|
||||
auto result = assetmanager->ResolveReference(attr_value);
|
||||
if (!result.has_value()) {
|
||||
env->ReleasePrimitiveArrayCritical(out_data, buffer, JNI_ABORT);
|
||||
ThrowIfIOError(env, bag_result);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -924,7 +905,6 @@ static jint NativeGetResourceIdentifier(JNIEnv* env, jclass /*clazz*/, jlong ptr
|
||||
ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
|
||||
auto resid = assetmanager->GetResourceId(name_utf8.c_str(), type, package);
|
||||
if (!resid.has_value()) {
|
||||
ThrowIfIOError(env, resid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -935,7 +915,6 @@ static jstring NativeGetResourceName(JNIEnv* env, jclass /*clazz*/, jlong ptr, j
|
||||
ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
|
||||
auto name = assetmanager->GetResourceName(static_cast<uint32_t>(resid));
|
||||
if (!name.has_value()) {
|
||||
ThrowIfIOError(env, name);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -947,7 +926,6 @@ static jstring NativeGetResourcePackageName(JNIEnv* env, jclass /*clazz*/, jlong
|
||||
ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
|
||||
auto name = assetmanager->GetResourceName(static_cast<uint32_t>(resid));
|
||||
if (!name.has_value()) {
|
||||
ThrowIfIOError(env, name);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -961,7 +939,6 @@ static jstring NativeGetResourceTypeName(JNIEnv* env, jclass /*clazz*/, jlong pt
|
||||
ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
|
||||
auto name = assetmanager->GetResourceName(static_cast<uint32_t>(resid));
|
||||
if (!name.has_value()) {
|
||||
ThrowIfIOError(env, name);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -977,7 +954,6 @@ static jstring NativeGetResourceEntryName(JNIEnv* env, jclass /*clazz*/, jlong p
|
||||
ScopedLock<AssetManager2> assetmanager(AssetManagerFromLong(ptr));
|
||||
auto name = assetmanager->GetResourceName(static_cast<uint32_t>(resid));
|
||||
if (!name.has_value()) {
|
||||
ThrowIfIOError(env, name);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -1051,7 +1027,6 @@ static jobjectArray NativeGetSizeConfigurations(JNIEnv* env, jclass /*clazz*/, j
|
||||
auto configurations = assetmanager->GetResourceConfigurations(true /*exclude_system*/,
|
||||
false /*exclude_mipmap*/);
|
||||
if (!configurations.has_value()) {
|
||||
ThrowIfIOError(env, configurations);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -1129,11 +1104,10 @@ static void NativeApplyStyle(JNIEnv* env, jclass /*clazz*/, jlong ptr, jlong the
|
||||
return;
|
||||
}
|
||||
|
||||
auto result = ApplyStyle(theme, xml_parser, static_cast<uint32_t>(def_style_attr),
|
||||
static_cast<uint32_t>(def_style_resid),
|
||||
reinterpret_cast<uint32_t*>(attrs), attrs_len, out_values, out_indices);
|
||||
ApplyStyle(theme, xml_parser, static_cast<uint32_t>(def_style_attr),
|
||||
static_cast<uint32_t>(def_style_resid), reinterpret_cast<uint32_t*>(attrs), attrs_len,
|
||||
out_values, out_indices);
|
||||
env->ReleasePrimitiveArrayCritical(java_attrs, attrs, JNI_ABORT);
|
||||
ThrowIfIOError(env, result);
|
||||
}
|
||||
|
||||
static jboolean NativeResolveAttrs(JNIEnv* env, jclass /*clazz*/, jlong ptr, jlong theme_ptr,
|
||||
@@ -1210,11 +1184,7 @@ static jboolean NativeResolveAttrs(JNIEnv* env, jclass /*clazz*/, jlong ptr, jlo
|
||||
}
|
||||
|
||||
env->ReleasePrimitiveArrayCritical(java_attrs, attrs, JNI_ABORT);
|
||||
if (!result.has_value()) {
|
||||
ThrowIfIOError(env, result);
|
||||
return JNI_FALSE;
|
||||
}
|
||||
return JNI_TRUE;
|
||||
return result.has_value() ? JNI_TRUE : JNI_FALSE;
|
||||
}
|
||||
|
||||
static jboolean NativeRetrieveAttributes(JNIEnv* env, jclass /*clazz*/, jlong ptr,
|
||||
@@ -1266,11 +1236,7 @@ static jboolean NativeRetrieveAttributes(JNIEnv* env, jclass /*clazz*/, jlong pt
|
||||
|
||||
env->ReleasePrimitiveArrayCritical(out_java_values, out_values, 0);
|
||||
env->ReleasePrimitiveArrayCritical(java_attrs, attrs, JNI_ABORT);
|
||||
if (!result.has_value()) {
|
||||
ThrowIfIOError(env, result);
|
||||
return JNI_FALSE;
|
||||
}
|
||||
return JNI_TRUE;
|
||||
return result.has_value() ? JNI_TRUE : JNI_FALSE;
|
||||
}
|
||||
|
||||
static jlong NativeThemeCreate(JNIEnv* /*env*/, jclass /*clazz*/, jlong ptr) {
|
||||
@@ -1290,8 +1256,7 @@ static void NativeThemeApplyStyle(JNIEnv* env, jclass /*clazz*/, jlong ptr, jlon
|
||||
CHECK(theme->GetAssetManager() == &(*assetmanager));
|
||||
(void) assetmanager;
|
||||
|
||||
auto result = theme->ApplyStyle(static_cast<uint32_t>(resid), force);
|
||||
ThrowIfIOError(env, result);
|
||||
theme->ApplyStyle(static_cast<uint32_t>(resid), force);
|
||||
|
||||
// TODO(adamlesinski): Consider surfacing exception when result is failure.
|
||||
// CTS currently expects no exceptions from this method.
|
||||
@@ -1313,13 +1278,10 @@ static void NativeThemeCopy(JNIEnv* env, jclass /*clazz*/, jlong dst_asset_manag
|
||||
CHECK(dst_theme->GetAssetManager() == &(*dst_assetmanager));
|
||||
(void) dst_assetmanager;
|
||||
|
||||
auto result = dst_theme->SetTo(*src_theme);
|
||||
ThrowIfIOError(env, result);
|
||||
return;
|
||||
dst_theme->SetTo(*src_theme);
|
||||
} else {
|
||||
dst_theme->SetTo(*src_theme);
|
||||
}
|
||||
|
||||
auto result = dst_theme->SetTo(*src_theme);
|
||||
ThrowIfIOError(env, result);
|
||||
}
|
||||
|
||||
static void NativeThemeClear(JNIEnv* /*env*/, jclass /*clazz*/, jlong theme_ptr) {
|
||||
@@ -1345,7 +1307,6 @@ static jint NativeThemeGetAttributeValue(JNIEnv* env, jclass /*clazz*/, jlong pt
|
||||
|
||||
auto result = theme->GetAssetManager()->ResolveReference(*value);
|
||||
if (!result.has_value()) {
|
||||
ThrowIfIOError(env, result);
|
||||
return ApkAssetsCookieToJavaCookie(kInvalidCookie);
|
||||
}
|
||||
return CopyValue(env, *value, typed_value);
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_UTIL_ASSETMANAGER_PRIVATE_H
|
||||
#define ANDROID_UTIL_ASSETMANAGER_PRIVATE_H
|
||||
|
||||
#include <optional>
|
||||
|
||||
#include <androidfw/Errors.h>
|
||||
#include <android-base/expected.h>
|
||||
|
||||
#include "core_jni_helpers.h"
|
||||
#include "jni.h"
|
||||
#include "nativehelper/JNIHelp.h"
|
||||
|
||||
namespace android {
|
||||
|
||||
constexpr const char* kResourcesNotFound = "android/content/res/Resources$NotFoundException";
|
||||
constexpr const static char* kIOErrorMessage = "failed to read resources.arsc data";
|
||||
|
||||
template <typename T, typename E>
|
||||
static bool ThrowIfIOError(JNIEnv* env, const base::expected<T, E>& result) {
|
||||
if constexpr (std::is_same<NullOrIOError, E>::value) {
|
||||
if (IsIOError(result)) {
|
||||
jniThrowException(env, kResourcesNotFound, kIOErrorMessage);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
if (!result.has_value()) {
|
||||
static_assert(std::is_same<IOError, E>::value, "Unknown result error type");
|
||||
jniThrowException(env, kResourcesNotFound, kIOErrorMessage);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace android
|
||||
|
||||
#endif //ANDROID_UTIL_ASSETMANAGER_PRIVATE_H
|
||||
@@ -17,7 +17,6 @@
|
||||
|
||||
#define LOG_TAG "StringBlock"
|
||||
|
||||
#include "android_util_AssetManager_private.h"
|
||||
#include "jni.h"
|
||||
#include <nativehelper/JNIHelp.h>
|
||||
#include <utils/misc.h>
|
||||
@@ -76,17 +75,12 @@ static jstring android_content_StringBlock_nativeGetString(JNIEnv* env, jobject
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto str8 = osb->string8At(idx);
|
||||
if (UNLIKELY(ThrowIfIOError(env, str8))) {
|
||||
return 0;
|
||||
} else if (str8.has_value()) {
|
||||
if (auto str8 = osb->string8At(idx); str8.has_value()) {
|
||||
return env->NewStringUTF(str8->data());
|
||||
}
|
||||
|
||||
auto str = osb->stringAt(idx);
|
||||
if (UNLIKELY(ThrowIfIOError(env, str))) {
|
||||
return 0;
|
||||
} else if (UNLIKELY(!str.has_value())) {
|
||||
if (UNLIKELY(!str.has_value())) {
|
||||
jniThrowException(env, "java/lang/IndexOutOfBoundsException", NULL);
|
||||
return 0;
|
||||
}
|
||||
@@ -104,7 +98,6 @@ static jintArray android_content_StringBlock_nativeGetStyle(JNIEnv* env, jobject
|
||||
|
||||
auto spans = osb->styleAt(idx);
|
||||
if (!spans.has_value()) {
|
||||
ThrowIfIOError(env, spans);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -114,7 +107,6 @@ static jintArray android_content_StringBlock_nativeGetStyle(JNIEnv* env, jobject
|
||||
auto pos = *spans;
|
||||
while (true) {
|
||||
if (UNLIKELY(!pos)) {
|
||||
jniThrowException(env, kResourcesNotFound, kIOErrorMessage);
|
||||
return NULL;
|
||||
}
|
||||
if (pos->name.index == ResStringPool_span::END) {
|
||||
|
||||
Reference in New Issue
Block a user