Commit ecbd3e8b authored by Ethan Yonker's avatar Ethan Yonker

Merge up to android-8.1.0_r1 and fix conflicts

Change-Id: I2dc060134d15ec9f015a606cb24ef8276f6af1fc
parents ea4efc6d 435a2031
subdirs = [
// "bootloader_message",
// "otautil",
]
...@@ -590,7 +590,7 @@ endif ...@@ -590,7 +590,7 @@ endif
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_SRC_FILES := fuse_sideload.cpp LOCAL_SRC_FILES := fuse_sideload.cpp
LOCAL_CLANG := true LOCAL_CLANG := true
LOCAL_CFLAGS := -O2 -g -DADB_HOST=0 -Wall -Wno-unused-parameter LOCAL_CFLAGS := -Wall -Werror
LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE
LOCAL_MODULE_TAGS := optional LOCAL_MODULE_TAGS := optional
...@@ -605,13 +605,35 @@ else ...@@ -605,13 +605,35 @@ else
endif endif
include $(BUILD_SHARED_LIBRARY) include $(BUILD_SHARED_LIBRARY)
# static libfusesideload
# =============================== (required to fix build errors in 8.1 due to use by tests)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := fuse_sideload.cpp
LOCAL_CLANG := true
LOCAL_CFLAGS := -Wall -Werror
LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libfusesideload
LOCAL_SHARED_LIBRARIES := libcutils libc
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/libmincrypt/includes
LOCAL_STATIC_LIBRARIES += libmincrypttwrp
LOCAL_CFLAGS += -DUSE_MINCRYPT
else
LOCAL_STATIC_LIBRARIES += libcrypto_static
endif
include $(BUILD_STATIC_LIBRARY)
# libmounts (static library) # libmounts (static library)
# =============================== # ===============================
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_SRC_FILES := mounts.cpp LOCAL_SRC_FILES := mounts.cpp
LOCAL_CLANG := true LOCAL_CFLAGS := \
LOCAL_CFLAGS := -Wall -Wno-unused-parameter -Werror -Wall \
-Werror
LOCAL_MODULE := libmounts LOCAL_MODULE := libmounts
LOCAL_STATIC_LIBRARIES := libbase
include $(BUILD_STATIC_LIBRARY) include $(BUILD_STATIC_LIBRARY)
# librecovery (static library) # librecovery (static library)
...@@ -619,7 +641,7 @@ include $(BUILD_STATIC_LIBRARY) ...@@ -619,7 +641,7 @@ include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_SRC_FILES := \ LOCAL_SRC_FILES := \
install.cpp install.cpp
LOCAL_CFLAGS := -Wno-unused-parameter -Werror LOCAL_CFLAGS := -Wall -Werror
LOCAL_CFLAGS += -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION) LOCAL_CFLAGS += -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION)
ifeq ($(AB_OTA_UPDATER),true) ifeq ($(AB_OTA_UPDATER),true)
...@@ -632,7 +654,8 @@ LOCAL_STATIC_LIBRARIES := \ ...@@ -632,7 +654,8 @@ LOCAL_STATIC_LIBRARIES := \
libvintf_recovery \ libvintf_recovery \
libcrypto_utils \ libcrypto_utils \
libcrypto \ libcrypto \
libbase libbase \
libziparchive \
include $(BUILD_STATIC_LIBRARY) include $(BUILD_STATIC_LIBRARY)
...@@ -661,6 +684,7 @@ else ...@@ -661,6 +684,7 @@ else
LOCAL_SHARED_LIBRARIES += libcrypto libbase LOCAL_SHARED_LIBRARIES += libcrypto libbase
LOCAL_SRC_FILES += verifier.cpp asn1_decoder.cpp LOCAL_SRC_FILES += verifier.cpp asn1_decoder.cpp
endif endif
ifeq ($(AB_OTA_UPDATER),true) ifeq ($(AB_OTA_UPDATER),true)
LOCAL_CFLAGS += -DAB_OTA_UPDATER=1 LOCAL_CFLAGS += -DAB_OTA_UPDATER=1
endif endif
...@@ -679,7 +703,6 @@ include $(BUILD_SHARED_LIBRARY) ...@@ -679,7 +703,6 @@ include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_CLANG := true LOCAL_CLANG := true
LOCAL_MODULE := libverifier LOCAL_MODULE := libverifier
LOCAL_MODULE_TAGS := tests
LOCAL_SRC_FILES := \ LOCAL_SRC_FILES := \
asn1_decoder.cpp \ asn1_decoder.cpp \
verifier.cpp \ verifier.cpp \
...@@ -687,16 +710,40 @@ LOCAL_SRC_FILES := \ ...@@ -687,16 +710,40 @@ LOCAL_SRC_FILES := \
LOCAL_STATIC_LIBRARIES := libcrypto_static LOCAL_STATIC_LIBRARIES := libcrypto_static
include $(BUILD_STATIC_LIBRARY) include $(BUILD_STATIC_LIBRARY)
# Wear default device
# ===============================
include $(CLEAR_VARS)
LOCAL_SRC_FILES := wear_device.cpp
# Should match TARGET_RECOVERY_UI_LIB in BoardConfig.mk.
LOCAL_MODULE := librecovery_ui_wear
include $(BUILD_STATIC_LIBRARY)
# vr headset default device
# ===============================
include $(CLEAR_VARS)
LOCAL_SRC_FILES := vr_device.cpp
# should match TARGET_RECOVERY_UI_LIB set in BoardConfig.mk
LOCAL_MODULE := librecovery_ui_vr
include $(BUILD_STATIC_LIBRARY)
commands_recovery_local_path := $(LOCAL_PATH) commands_recovery_local_path := $(LOCAL_PATH)
include $(LOCAL_PATH)/tests/Android.mk \
$(LOCAL_PATH)/tools/Android.mk \ include \
$(LOCAL_PATH)/applypatch/Android.mk \
$(LOCAL_PATH)/boot_control/Android.mk \
$(LOCAL_PATH)/edify/Android.mk \ $(LOCAL_PATH)/edify/Android.mk \
$(LOCAL_PATH)/otafault/Android.mk \ $(LOCAL_PATH)/otafault/Android.mk \
$(LOCAL_PATH)/bootloader_message/Android.mk \ $(LOCAL_PATH)/tests/Android.mk \
$(LOCAL_PATH)/bootloader_message_twrp/Android.mk \ $(LOCAL_PATH)/tools/Android.mk \
$(LOCAL_PATH)/updater/Android.mk \ $(LOCAL_PATH)/updater/Android.mk \
$(LOCAL_PATH)/update_verifier/Android.mk \ $(LOCAL_PATH)/update_verifier/Android.mk \
$(LOCAL_PATH)/applypatch/Android.mk $(LOCAL_PATH)/bootloader_message/Android.mk \
$(LOCAL_PATH)/bootloader_message_twrp/Android.mk
ifeq ($(wildcard system/core/uncrypt/Android.mk),) ifeq ($(wildcard system/core/uncrypt/Android.mk),)
include $(commands_recovery_local_path)/uncrypt/Android.mk include $(commands_recovery_local_path)/uncrypt/Android.mk
......
enh+aosp-gerrit@google.com
tbao@google.com
xunchang@google.com
...@@ -14,24 +14,27 @@ ...@@ -14,24 +14,27 @@
* limitations under the License. * limitations under the License.
*/ */
#include <unistd.h> #include "adb_install.h"
#include <dirent.h> #include <dirent.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <signal.h> #include <signal.h>
#include <fcntl.h> #include <fcntl.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h>
#include "ui.h" #include "ui.h"
#include "cutils/properties.h" #include "cutils/properties.h"
#include "install.h"
#include "common.h" #include "common.h"
#include "adb_install.h"
#include "minadbd/fuse_adb_provider.h"
#include "fuse_sideload.h" #include "fuse_sideload.h"
#ifdef USE_OLD_VERIFIER #ifdef USE_OLD_VERIFIER
#include "verifier24/verifier.h" #include "verifier24/verifier.h"
...@@ -40,86 +43,91 @@ ...@@ -40,86 +43,91 @@
#endif #endif
static void set_usb_driver(bool enabled) { static void set_usb_driver(bool enabled) {
int fd = open("/sys/class/android_usb/android0/enable", O_WRONLY); char configfs[PROPERTY_VALUE_MAX];
if (fd < 0) { property_get("sys.usb.configfs", configfs, "false");
/* These error messages show when built in older Android branches (e.g. Gingerbread) if (strcmp(configfs, "false") == 0 || strcmp(configfs, "0") == 0)
It's not a critical error so we're disabling the error messages. return;
ui->Print("failed to open driver control: %s\n", strerror(errno));
int fd = open("/sys/class/android_usb/android0/enable", O_WRONLY);
if (fd < 0) {
/* These error messages show when built in older Android branches (e.g. Gingerbread)
It's not a critical error so we're disabling the error messages.
ui->Print("failed to open driver control: %s\n", strerror(errno));
*/ */
printf("failed to open driver control: %s\n", strerror(errno)); printf("failed to open driver control: %s\n", strerror(errno));
return; return;
} }
if (TEMP_FAILURE_RETRY(write(fd, enabled ? "1" : "0", 1)) == -1) { if (TEMP_FAILURE_RETRY(write(fd, enabled ? "1" : "0", 1)) == -1) {
/* /*
ui->Print("failed to set driver control: %s\n", strerror(errno)); ui->Print("failed to set driver control: %s\n", strerror(errno));
*/ */
printf("failed to set driver control: %s\n", strerror(errno)); printf("failed to set driver control: %s\n", strerror(errno));
} }
if (close(fd) < 0) { if (close(fd) < 0) {
/* /*
ui->Print("failed to close driver control: %s\n", strerror(errno)); ui->Print("failed to close driver control: %s\n", strerror(errno));
*/ */
printf("failed to close driver control: %s\n", strerror(errno)); printf("failed to close driver control: %s\n", strerror(errno));
} }
} }
// On Android 8.0 for some reason init can't seem to completely stop adbd // On Android 8.0 for some reason init can't seem to completely stop adbd
// so we have to kill it too if it doesn't die on its own. // so we have to kill it too if it doesn't die on its own.
static void kill_adbd() { static void kill_adbd() {
DIR* dir = opendir("/proc"); DIR* dir = opendir("/proc");
if (dir) { if (dir) {
struct dirent* de = 0; struct dirent* de = 0;
while ((de = readdir(dir)) != 0) { while ((de = readdir(dir)) != 0) {
if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
continue; continue;
int pid = -1; int pid = -1;
int ret = sscanf(de->d_name, "%d", &pid); int ret = sscanf(de->d_name, "%d", &pid);
if (ret == 1) { if (ret == 1) {
char cmdpath[PATH_MAX]; char cmdpath[PATH_MAX];
sprintf(cmdpath, "/proc/%d/cmdline", pid); sprintf(cmdpath, "/proc/%d/cmdline", pid);
FILE* file = fopen(cmdpath, "r"); FILE* file = fopen(cmdpath, "r");
size_t task_size = PATH_MAX; size_t task_size = PATH_MAX;
char task[PATH_MAX]; char task[PATH_MAX];
char* p = task; char* p = task;
if (getline(&p, &task_size, file) > 0) { if (getline(&p, &task_size, file) > 0) {
if (strstr(task, "adbd") != 0) { if (strstr(task, "adbd") != 0) {
printf("adbd pid %d found, sending kill.\n", pid); printf("adbd pid %d found, sending kill.\n", pid);
kill(pid, SIGINT); kill(pid, SIGINT);
usleep(5000); usleep(5000);
kill(pid, SIGKILL); kill(pid, SIGKILL);
} }
}
fclose(file);
}
} }
closedir(dir); fclose(file);
}
} }
closedir(dir);
}
} }
static void stop_adbd() { static void stop_adbd() {
printf("Stopping adbd...\n"); printf("Stopping adbd...\n");
property_set("ctl.stop", "adbd"); property_set("ctl.stop", "adbd");
usleep(5000); usleep(5000);
kill_adbd(); kill_adbd();
set_usb_driver(false); set_usb_driver(false);
} }
static bool is_ro_debuggable() { static bool is_ro_debuggable() {
char value[PROPERTY_VALUE_MAX+1]; char value[PROPERTY_VALUE_MAX+1];
return (property_get("ro.debuggable", value, NULL) == 1 && value[0] == '1'); return (property_get("ro.debuggable", value, NULL) == 1 && value[0] == '1');
} }
static void maybe_restart_adbd() { static void maybe_restart_adbd() {
if (is_ro_debuggable()) { if (is_ro_debuggable()) {
printf("Restarting adbd...\n"); printf("Restarting adbd...\n");
set_usb_driver(true); set_usb_driver(true);
property_set("ctl.start", "adbd"); property_set("ctl.start", "adbd");
} }
} }
// How long (in seconds) we wait for the host to start sending us a // How long (in seconds) we wait for the host to start sending us a
...@@ -129,83 +137,83 @@ static void maybe_restart_adbd() { ...@@ -129,83 +137,83 @@ static void maybe_restart_adbd() {
int int
apply_from_adb(const char* install_file, pid_t* child_pid) { apply_from_adb(const char* install_file, pid_t* child_pid) {
stop_adbd(); stop_adbd();
set_usb_driver(true); set_usb_driver(true);
/* /*
int apply_from_adb(RecoveryUI* ui, bool* wipe_cache, const char* install_file) { int apply_from_adb(RecoveryUI* ui, bool* wipe_cache, const char* install_file) {
modified_flash = true; modified_flash = true;
stop_adbd(ui); stop_adbd(ui);
set_usb_driver(ui, true); set_usb_driver(ui, true);
ui->Print("\n\nNow send the package you want to apply\n" ui->Print("\n\nNow send the package you want to apply\n"
"to the device with \"adb sideload <filename>\"...\n"); "to the device with \"adb sideload <filename>\"...\n");
*/ */
pid_t child; pid_t child;
if ((child = fork()) == 0) { if ((child = fork()) == 0) {
execl("/sbin/recovery", "recovery", "--adbd", install_file, NULL); execl("/sbin/recovery", "recovery", "--adbd", install_file, NULL);
_exit(-1); _exit(-1);
} }
*child_pid = child; *child_pid = child;
// caller can now kill the child thread from another thread // caller can now kill the child thread from another thread
// FUSE_SIDELOAD_HOST_PATHNAME will start to exist once the host // FUSE_SIDELOAD_HOST_PATHNAME will start to exist once the host
// connects and starts serving a package. Poll for its // connects and starts serving a package. Poll for its
// appearance. (Note that inotify doesn't work with FUSE.) // appearance. (Note that inotify doesn't work with FUSE.)
int result = INSTALL_ERROR; int result = INSTALL_ERROR;
int status; int status;
bool waited = false; bool waited = false;
struct stat st; struct stat st;
for (int i = 0; i < ADB_INSTALL_TIMEOUT; ++i) { for (int i = 0; i < ADB_INSTALL_TIMEOUT; ++i) {
if (waitpid(child, &status, WNOHANG) != 0) { if (waitpid(child, &status, WNOHANG) != 0) {
result = -1; result = -1;
waited = true; waited = true;
break; break;
}
if (stat(FUSE_SIDELOAD_HOST_PATHNAME, &st) != 0) {
if (errno == ENOENT && i < ADB_INSTALL_TIMEOUT-1) {
sleep(1);
continue;
} else {
printf("\nTimed out waiting for package: %s\n\n", strerror(errno));
result = -1;
kill(child, SIGKILL);
break;
}
}
// Install is handled elsewhere in TWRP
//install_package(FUSE_SIDELOAD_HOST_PATHNAME, wipe_cache, install_file, false);
return 0;
} }
// if we got here, something failed if (stat(FUSE_SIDELOAD_HOST_PATHNAME, &st) != 0) {
*child_pid = 0; if (errno == ENOENT && i < ADB_INSTALL_TIMEOUT-1) {
sleep(1);
if (!waited) { continue;
// Calling stat() on this magic filename signals the minadbd } else {
// subprocess to shut down. printf("\nTimed out waiting for package: %s\n\n", strerror(errno));
stat(FUSE_SIDELOAD_HOST_EXIT_PATHNAME, &st); result = -1;
kill(child, SIGKILL);
// TODO(dougz): there should be a way to cancel waiting for a break;
// package (by pushing some button combo on the device). For now }
// you just have to 'adb sideload' a file that's not a valid
// package, like "/dev/null".
waitpid(child, &status, 0);
} }
// Install is handled elsewhere in TWRP
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { //install_package(FUSE_SIDELOAD_HOST_PATHNAME, wipe_cache, install_file, false);
if (WEXITSTATUS(status) == 3) { return 0;
printf("\nYou need adb 1.0.32 or newer to sideload\nto this device.\n\n"); }
result = -2;
} else if (!WIFSIGNALED(status)) { // if we got here, something failed
printf("status %d\n", WEXITSTATUS(status)); *child_pid = 0;
}
if (!waited) {
// Calling stat() on this magic filename signals the minadbd
// subprocess to shut down.
stat(FUSE_SIDELOAD_HOST_EXIT_PATHNAME, &st);
// TODO(dougz): there should be a way to cancel waiting for a
// package (by pushing some button combo on the device). For now
// you just have to 'adb sideload' a file that's not a valid
// package, like "/dev/null".
waitpid(child, &status, 0);
}
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
if (WEXITSTATUS(status) == 3) {
printf("\nYou need adb 1.0.32 or newer to sideload\nto this device.\n\n");
result = -2;
} else if (!WIFSIGNALED(status)) {
printf("adbd status %d\n", WEXITSTATUS(status));
} }
}
set_usb_driver(false); set_usb_driver(false);
maybe_restart_adbd(); maybe_restart_adbd();
return result; return result;
} }
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
#ifndef _ADB_INSTALL_H #ifndef _ADB_INSTALL_H
#define _ADB_INSTALL_H #define _ADB_INSTALL_H
#include <sys/types.h>
//class RecoveryUI; //class RecoveryUI;
static void set_usb_driver(bool enabled); static void set_usb_driver(bool enabled);
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <functional>
#include <memory> #include <memory>
#include <string> #include <string>
#include <utility> #include <utility>
...@@ -45,7 +46,7 @@ ...@@ -45,7 +46,7 @@
#include "print_sha1.h" #include "print_sha1.h"
static int LoadPartitionContents(const std::string& filename, FileContents* file); static int LoadPartitionContents(const std::string& filename, FileContents* file);
static ssize_t FileSink(const unsigned char* data, ssize_t len, void* token); static size_t FileSink(const unsigned char* data, size_t len, int fd);
static int GenerateTarget(const FileContents& source_file, const std::unique_ptr<Value>& patch, static int GenerateTarget(const FileContents& source_file, const std::unique_ptr<Value>& patch,
const std::string& target_filename, const std::string& target_filename,
const uint8_t target_sha1[SHA_DIGEST_LENGTH], const Value* bonus_data); const uint8_t target_sha1[SHA_DIGEST_LENGTH], const Value* bonus_data);
...@@ -224,8 +225,8 @@ int SaveFileContents(const char* filename, const FileContents* file) { ...@@ -224,8 +225,8 @@ int SaveFileContents(const char* filename, const FileContents* file) {
return -1; return -1;
} }
ssize_t bytes_written = FileSink(file->data.data(), file->data.size(), &fd); size_t bytes_written = FileSink(file->data.data(), file->data.size(), fd);
if (bytes_written != static_cast<ssize_t>(file->data.size())) { if (bytes_written != file->data.size()) {
printf("short write of \"%s\" (%zd bytes of %zu): %s\n", filename, bytes_written, printf("short write of \"%s\" (%zd bytes of %zu): %s\n", filename, bytes_written,
file->data.size(), strerror(errno)); file->data.size(), strerror(errno));
return -1; return -1;
...@@ -531,25 +532,17 @@ int ShowLicenses() { ...@@ -531,25 +532,17 @@ int ShowLicenses() {
return 0; return 0;
} }
ssize_t FileSink(