From b4c3591306dcab077fd2b408a20af3a296f0920c Mon Sep 17 00:00:00 2001 From: nkk71 Date: Wed, 11 Oct 2017 23:39:10 +0300 Subject: Auto detect possible use of legacy props * Revert: Make legacy props an option disabled by default (reverted from commit 75aa615767457f2b62dda65b16ded41b0e6df11f) * Instead check for ANDROID_PROPERTY_WORKSPACE in the updater- binary to determine whether legacy property service can be used Change-Id: If68d5cca9a2b56edcb1c73db0474668cf46d8c91 --- twinstall.cpp | 66 +++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 15 deletions(-) (limited to 'twinstall.cpp') diff --git a/twinstall.cpp b/twinstall.cpp index b0b6f3d17..0aaab4534 100644 --- a/twinstall.cpp +++ b/twinstall.cpp @@ -16,10 +16,16 @@ along with TWRP. If not, see . */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + #include #include #include #include +#include #include #include #include @@ -167,19 +173,51 @@ static int Prepare_Update_Binary(const char *path, ZipWrap *Zip, int* wipe_cache return INSTALL_SUCCESS; } +static bool update_binary_has_legacy_properties(const char *binary) { + const char str_to_match[] = "ANDROID_PROPERTY_WORKSPACE"; + int len_to_match = sizeof(str_to_match) - 1; + bool found = false; + + int fd = open(binary, O_RDONLY); + if (fd < 0) { + LOGINFO("has_legacy_properties: Could not open %s: %s!\n", binary, strerror(errno)); + return false; + } + + struct stat finfo; + if (fstat(fd, &finfo) < 0) { + LOGINFO("has_legacy_properties: Could not fstat %d: %s!\n", fd, strerror(errno)); + close(fd); + return false; + } + + void *data = mmap(NULL, finfo.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (data == MAP_FAILED) { + LOGINFO("has_legacy_properties: mmap (size=%lld) failed: %s!\n", finfo.st_size, strerror(errno)); + } else { + if (memmem(data, finfo.st_size, str_to_match, len_to_match)) { + LOGINFO("has_legacy_properties: Found legacy property match!\n"); + found = true; + } + munmap(data, finfo.st_size); + } + close(fd); + + return found; +} + static int Run_Update_Binary(const char *path, ZipWrap *Zip, int* wipe_cache, zip_type ztype) { int ret_val, pipe_fd[2], status, zip_verify; char buffer[1024]; FILE* child_data; #ifndef TW_NO_LEGACY_PROPS - if (DataManager::GetIntValue("tw_enable_legacy_props") != 0) { - /* Set legacy properties */ - if (switch_to_legacy_properties() != 0) { - LOGERR("Legacy property environment did not initialize successfully. Properties may not be detected.\n"); - } else { - LOGINFO("Legacy property environment initialized.\n"); - } + if (!update_binary_has_legacy_properties(TMP_UPDATER_BINARY_PATH)) { + LOGINFO("Legacy property environment not used in updater.\n"); + } else if (switch_to_legacy_properties() != 0) { /* Set legacy properties */ + LOGERR("Legacy property environment did not initialize successfully. Properties may not be detected.\n"); + } else { + LOGINFO("Legacy property environment initialized.\n"); } #endif @@ -260,14 +298,12 @@ static int Run_Update_Binary(const char *path, ZipWrap *Zip, int* wipe_cache, zi int waitrc = TWFunc::Wait_For_Child(pid, &status, "Updater"); #ifndef TW_NO_LEGACY_PROPS - if (DataManager::GetIntValue("tw_enable_legacy_props") != 0) { - /* Unset legacy properties */ - if (legacy_props_path_modified) { - if (switch_to_new_properties() != 0) { - LOGERR("Legacy property environment did not disable successfully. Legacy properties may still be in use.\n"); - } else { - LOGINFO("Legacy property environment disabled.\n"); - } + /* Unset legacy properties */ + if (legacy_props_path_modified) { + if (switch_to_new_properties() != 0) { + LOGERR("Legacy property environment did not disable successfully. Legacy properties may still be in use.\n"); + } else { + LOGINFO("Legacy property environment disabled.\n"); } } #endif -- cgit v1.2.3