diff options
author | 2025-04-17 16:31:27 -0700 | |
---|---|---|
committer | 2025-04-22 18:30:50 -0700 | |
commit | 1144bcaee5c28ce4261865af197990b7b77f8e28 (patch) | |
tree | e4cd65da39c8b0e29f001d752bcd8af007eba96e /libs | |
parent | c2992ce6c7904e7d65c264d1fcee6e0fc2902ae3 (diff) |
[res] Fix a crash for the apps doing a bad thing
Some apps started crashing after the CL that changed one of the
parameters of ZipAssetsProvider constructor from time_t to
timespec. Apparently they dlsym() and call that constructor,
even when it's not a public or somehow supported API.
This CL puts one back for them so they at least don't stop
working all at once, and instead it just logs an error so the
developers could at least know they're doing a BAD THING.
+ fix the timespec operator== to actually compare nanoseconds.
Bug: 406670650
Test: run the app and ensure it launches
Flag: EXEMPT bugfix - a dummy symbol that's unflaggable
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:481f13eaff6a88cbe9b8b9da65f52bc26ba440bd)
Merged-In: I85e03985d7303f4e0f943441da57cf0f50230db6
Change-Id: I85e03985d7303f4e0f943441da57cf0f50230db6
Diffstat (limited to 'libs')
-rw-r--r-- | libs/androidfw/AssetsProvider.cpp | 13 | ||||
-rw-r--r-- | libs/androidfw/include/androidfw/AssetsProvider.h | 8 | ||||
-rw-r--r-- | libs/androidfw/include/androidfw/misc.h | 4 | ||||
-rw-r--r-- | libs/androidfw/misc.cpp | 5 |
4 files changed, 20 insertions, 10 deletions
diff --git a/libs/androidfw/AssetsProvider.cpp b/libs/androidfw/AssetsProvider.cpp index 808509120462..13456fbadbc7 100644 --- a/libs/androidfw/AssetsProvider.cpp +++ b/libs/androidfw/AssetsProvider.cpp @@ -104,7 +104,14 @@ void ZipAssetsProvider::ZipCloser::operator()(ZipArchive* a) const { } ZipAssetsProvider::ZipAssetsProvider(ZipArchiveHandle handle, PathOrDebugName&& path, - package_property_t flags, ModDate last_mod_time) + package_property_t flags, time_t last_mod_time) + : zip_handle_(handle), name_(std::move(path)), flags_(flags), last_mod_time_(last_mod_time) { + LOG(ERROR) << "This function is not supported and will result in " + "poor performance and/or crashes. Stop calling it."; +} + +ZipAssetsProvider::ZipAssetsProvider(ZipArchiveHandle handle, PathOrDebugName&& path, + ModDate last_mod_time, package_property_t flags) : zip_handle_(handle), name_(std::move(path)), flags_(flags), last_mod_time_(last_mod_time) { } @@ -132,7 +139,7 @@ std::unique_ptr<ZipAssetsProvider> ZipAssetsProvider::Create(std::string path, } return std::unique_ptr<ZipAssetsProvider>( - new ZipAssetsProvider(handle, PathOrDebugName::Path(std::move(path)), flags, mod_date)); + new ZipAssetsProvider(handle, PathOrDebugName::Path(std::move(path)), mod_date, flags)); } std::unique_ptr<ZipAssetsProvider> ZipAssetsProvider::Create(base::unique_fd fd, @@ -166,7 +173,7 @@ std::unique_ptr<ZipAssetsProvider> ZipAssetsProvider::Create(base::unique_fd fd, } return std::unique_ptr<ZipAssetsProvider>(new ZipAssetsProvider( - handle, PathOrDebugName::DebugName(std::move(friendly_name)), flags, mod_date)); + handle, PathOrDebugName::DebugName(std::move(friendly_name)), mod_date, flags)); } std::unique_ptr<Asset> ZipAssetsProvider::OpenInternal(const std::string& path, diff --git a/libs/androidfw/include/androidfw/AssetsProvider.h b/libs/androidfw/include/androidfw/AssetsProvider.h index 037f684f5b78..10e1fe33332c 100644 --- a/libs/androidfw/include/androidfw/AssetsProvider.h +++ b/libs/androidfw/include/androidfw/AssetsProvider.h @@ -110,8 +110,14 @@ struct ZipAssetsProvider : public AssetsProvider { private: struct PathOrDebugName; + + // There are applications that decided to dlsym and call this constructor somehow, so we + // have to keep it for backwards compatibility. ZipAssetsProvider(ZipArchive* handle, PathOrDebugName&& path, package_property_t flags, - ModDate last_mod_time); + time_t last_mod_time); + // ModTime is time_t on Win32, need to change the parameter order to make it overloadable. + ZipAssetsProvider(ZipArchive* handle, PathOrDebugName&& path, ModDate last_mod_time, + package_property_t flags); struct PathOrDebugName { static PathOrDebugName Path(std::string value) { diff --git a/libs/androidfw/include/androidfw/misc.h b/libs/androidfw/include/androidfw/misc.h index d8ca64a174a2..5f9fcc9a8a1f 100644 --- a/libs/androidfw/include/androidfw/misc.h +++ b/libs/androidfw/include/androidfw/misc.h @@ -77,4 +77,6 @@ bool isKnownWritablePath(const char* path); } // namespace android // Whoever uses getFileModDate() will need this as well -bool operator==(const timespec& l, const timespec& r); +inline bool operator==(const timespec& l, const timespec& r) { + return l.tv_sec == r.tv_sec && l.tv_nsec == r.tv_nsec; +} diff --git a/libs/androidfw/misc.cpp b/libs/androidfw/misc.cpp index 26eb320805c9..052d9e8dbe68 100644 --- a/libs/androidfw/misc.cpp +++ b/libs/androidfw/misc.cpp @@ -31,7 +31,6 @@ #include <array> #include <cstdio> #include <cstring> -#include <tuple> namespace android { @@ -143,7 +142,3 @@ bool isKnownWritablePath(const char* path) { #endif // __linux__ } // namespace android - -bool operator==(const timespec& l, const timespec& r) { - return std::tie(l.tv_sec, l.tv_nsec) == std::tie(r.tv_sec, l.tv_nsec); -} |