Merge remote-tracking branch 'john/master' into feature/redesign

This commit is contained in:
Viktor De Pasquale 2019-11-26 14:34:38 +01:00
commit 78d7c45be3
16 changed files with 238 additions and 230 deletions

View File

@ -28,7 +28,7 @@ object SuHandler : ProviderCallHandler {
override fun call(context: Context, method: String, arg: String?, extras: Bundle?): Bundle? { override fun call(context: Context, method: String, arg: String?, extras: Bundle?): Bundle? {
invoke(context.wrap(), method, extras) invoke(context.wrap(), method, extras)
return null return Bundle.EMPTY
} }
operator fun invoke(context: Context, action: String?, data: Bundle?) { operator fun invoke(context: Context, action: String?, data: Bundle?) {

View File

@ -8,23 +8,26 @@
<string name="log">Registro</string> <string name="log">Registro</string>
<string name="settings">Configurações</string> <string name="settings">Configurações</string>
<string name="install">Instalar</string> <string name="install">Instalar</string>
<string name="unsupport_magisk_title">Versão não suportada do Magisk</string>
<string name="unsupport_magisk_msg">Esta versão do Magisk Manager não suporta versões do Magisk menores que %1$s.\n\nO aplicativo se comportará como se nenhum Magisk estivesse instalado, por favor, atualize o Magisk o mais rápido possível.</string>
<!--Status Fragment--> <!--Status Fragment-->
<string name="magisk_version_error">Magisk não está instalado</string> <string name="magisk_version_error">Magisk não está instalado</string>
<string name="checking_for_updates">Verificando por atualizações…</string> <string name="checking_for_updates">Procurando por atualizações…</string>
<string name="invalid_update_channel">Canal de Atualização Inválido</string> <string name="invalid_update_channel">Canal de Atualizações Inválido</string>
<string name="safetyNet_check_text">Verificar SafetyNet</string> <string name="safetyNet_check_text">Toque para iniciar a verificação do SafetyNet</string>
<string name="checking_safetyNet_status">Verificando status de SafetyNet…</string> <string name="checking_safetyNet_status">Verificando o status do SafetyNet…</string>
<string name="safetyNet_check_success">SafetyNet Verificado Com Sucesso</string> <string name="safetyNet_check_success">SafetyNet verificado com sucesso</string>
<string name="safetyNet_api_error">Erro de SafetyNet API</string> <string name="safetyNet_api_error">Erro na API do SafetyNet</string>
<string name="safetyNet_res_invalid">A resposta é inválida</string> <string name="safetyNet_res_invalid">A resposta é inválida</string>
<string name="magisk_up_to_date">Magisk atualizado</string> <string name="magisk_up_to_date">Magisk está atualizado</string>
<string name="manager_up_to_date">Gerenciador Magisk atualizado</string> <string name="manager_up_to_date">Magisk Manager está atualizado</string>
<string name="advanced_settings_title">Configurações Avançadas</string> <string name="advanced_settings_title">Configurações Avançadas</string>
<string name="keep_force_encryption">Manter encriptação forçada</string> <string name="keep_force_encryption">Manter encriptação forçada</string>
<string name="keep_dm_verity">Manter AVB 2.0/dm-verity</string> <string name="keep_dm_verity">Manter AVB 2.0/dm-verity</string>
<string name="recovery_mode">Modo Recuperação</string>
<string name="current_installed">Instalado: %1$s</string> <string name="current_installed">Instalado: %1$s</string>
<string name="latest_version">Último: %1$s</string> <string name="latest_version">Mais recente: %1$s</string>
<string name="uninstall">Desinstalar</string> <string name="uninstall">Desinstalar</string>
<string name="uninstall_magisk_title">Desinstalar o Magisk</string> <string name="uninstall_magisk_title">Desinstalar o Magisk</string>
<string name="uninstall_magisk_msg">Todos os módulos serão desativados/removidos. O acesso Root será removido, e seus dados provavelmente serão criptografados se já não estiverem.</string> <string name="uninstall_magisk_msg">Todos os módulos serão desativados/removidos. O acesso Root será removido, e seus dados provavelmente serão criptografados se já não estiverem.</string>
@ -62,45 +65,70 @@
<!--About Activity--> <!--About Activity-->
<string name="app_changelog">Registro de mudanças</string> <string name="app_changelog">Registro de mudanças</string>
<!-- System Components, Notifications -->
<string name="update_channel">Atualizações do Magisk</string>
<string name="progress_channel">Notificações de Progresso</string>
<string name="download_complete">Download completo</string>
<string name="download_file_error">Erro ao baixar o aquivo</string>
<string name="download_open_parent">Mostrar na pasta</string>
<string name="download_open_self">Mostrar arquivo</string>
<string name="magisk_update_title">Atualização do Magisk Disponível!</string>
<string name="manager_update_title">Atualização do Magisk Manager Disponível!</string>
<!-- Installation -->
<string name="manager_download_install">Toque para baixar e instalar</string>
<string name="download_zip_only">Apenas baixar o zip</string>
<string name="direct_install">Instalação direta (Recomendado)</string>
<string name="install_inactive_slot">Instalar no Slot Inativo (Após o OTA)</string>
<string name="install_inactive_slot_msg">Seu dispositivo será FORÇADO a inicializar no slot inativo atual após uma reinicialização!\nSó use esta opção após a conclusão do OTA.\nContinuar?</string>
<string name="select_method">Selecione o Método</string>
<string name="setup_title">Configuração Adicional</string>
<string name="select_patch_file">Selecionar e Patchear um Arquivo</string>
<string name="patch_file_msg">Selecione uma imagem raw (*.img) ou um arquivo tar do ODIN (*.tar)</string>
<string name="reboot_delay_toast">Reiniciando em 5 segundos…</string>
<!--Toasts, Dialogs--> <!--Toasts, Dialogs-->
<string name="repo_install_title">Instalar %1$s</string> <string name="repo_install_title">Instalar %1$s</string>
<string name="repo_install_msg">Instalar %1$s agora?</string> <string name="repo_install_msg">Você quer instalar %1$s agora?</string>
<string name="download">Baixar</string> <string name="download">Baixar</string>
<string name="reboot">Reiniciar</string> <string name="reboot">Reiniciar</string>
<string name="magisk_update_title">Nova Atualização do Magisk Disponível!</string> <string name="settings_reboot_toast">Reinicie para aplicar as mudanças</string>
<string name="settings_reboot_toast">Reinicie para aplicar as configurações</string>
<string name="release_notes">Notas de lançamento</string> <string name="release_notes">Notas de lançamento</string>
<string name="repo_cache_cleared">Cache de repositório limpo</string> <string name="repo_cache_cleared">Cache do repositório limpo</string>
<string name="manager_update_title">Nova Atualização do Magisk Manager Disponível!</string> <string name="dtbo_patched_title">DTBO foi patcheado!</string>
<string name="manager_download_install">Toque para baixar e instalar</string> <string name="dtbo_patched_reboot">Magisk Manager foi patcheado para o dtbo.img. Por favor, reinicie.</string>
<string name="dtbo_patched_title">DTBO foi emendado!</string> <string name="flashing">Flasheando…</string>
<string name="dtbo_patched_reboot">Magisk Manager emendou dtbo.img, reinicie</string> <string name="done">Pronto!</string>
<string name="update_channel">Atualizações do Magisk</string> <string name="failure">Falha</string>
<string name="flashing">Flasheando</string> <string name="hide_manager_title">Ocultando o Magisk Manager…</string>
<string name="hide_manager_title">Ocultando Magisk Manager…</string> <string name="hide_manager_fail_toast">Falha ao ocultar o Magisk Manager.</string>
<string name="hide_manager_fail_toast">Falha ao ocultar Magisk Manager…</string> <string name="open_link_failed_toast">Nenhum aplicativo encontrado para abrir o link</string>
<string name="download_zip_only">Baixar Zip Apenas</string> <string name="warning">Aviso</string>
<string name="direct_install">Instalação Direta (Recomendado)</string>
<string name="install_inactive_slot">Instalar no Slot Inativo (Após OTA)</string>
<string name="select_method">Selecionar Método</string>
<string name="complete_uninstall">Completar Desinstalação</string> <string name="complete_uninstall">Completar Desinstalação</string>
<string name="restore_img">Restaurar Imagens</string> <string name="restore_img">Restaurar Imagens</string>
<string name="restore_done">Restauração concluída!</string> <string name="restore_img_msg">Restaurando…</string>
<string name="restore_fail">Backup original não existe!</string> <string name="restore_done">Restauração completa!</string>
<string name="restore_fail">Backup stock não existe!</string>
<string name="proprietary_title">Baixar Código Proprietário</string> <string name="proprietary_title">Baixar Código Proprietário</string>
<string name="proprietary_notice">Magisk Manager é FOSS, que não contém o código proprietário da API SafetyNet da Google.\n\nPermitir ao Magisk Manager baixar uma extensão (que contém a GoogleApiClient) para a verificação SafetyNet?</string> <string name="proprietary_notice">Magisk Manager é um software livre e de código aberto (FOSS) e não contém código proprietário da API SafetyNet do Google.\n\Permitir o Magisk Manager baixar uma extensão (contém GoogleApiClient) para verificações do SafetyNet?</string>
<string name="download_file_error">Erro ao baixar arquivo</string> <string name="setup_fail">Configuração falhou</string>
<string name="env_fix_title">Requer configuração adicional</string>
<string name="env_fix_msg">Seu dispositivo precisa de uma configuração adicional para que o Magisk funcione corretamente. Ele fará o download do zip de instalação do Magisk. Deseja continuar agora?</string>
<string name="setup_msg">Executando a configuração do ambiente…</string>
<string name="authenticate">Autenticar</string>
<!--Settings Activity --> <!--Settings Activity -->
<string name="settings_general_category">Geral</string> <string name="settings_general_category">Geral</string>
<string name="settings_dark_theme_title">Tema Escuro</string> <string name="settings_dark_theme_title">Tema Escuro</string>
<string name="settings_dark_theme_summary">Ativar tema escuro</string> <string name="settings_dark_theme_summary">Ativar o tema escuro</string>
<string name="settings_clear_cache_title">Limpar Cache de Repositório</string> <string name="settings_download_path_title">Caminho de download</string>
<string name="settings_clear_cache_summary">Limpar as informações no cache para repositórios onlines, força o app a reatualizar online</string> <string name="settings_download_path_message">Arquivos serão salvos em %1$s</string>
<string name="settings_clear_cache_title">Limpar cache do repositório</string>
<string name="settings_clear_cache_summary">Limpar as informações em cache para repositórios online. Isso força o aplicativo a atualizar online</string>
<string name="settings_hide_manager_title">Ocultar Magisk Manager</string> <string name="settings_hide_manager_title">Ocultar Magisk Manager</string>
<string name="settings_hide_manager_summary">Reempacotar Magisk Manager com nome de pacote aleatório</string> <string name="settings_hide_manager_summary">Reempacotar o Magisk Manager com nome de pacote e nome do app aleatórios</string>
<string name="settings_restore_manager_title">Restaurar Magisk Manager</string> <string name="settings_restore_manager_title">Restaurar Magisk Manager</string>
<string name="settings_restore_manager_summary">Restaurar Magisk Manager com pacote original</string> <string name="settings_restore_manager_summary">Restaurar o Magisk Manager com o nome de pacote e nome do app originais</string>
<string name="language">Idioma</string> <string name="language">Idioma</string>
<string name="system_default">(Padrão do Sistema)</string> <string name="system_default">(Padrão do Sistema)</string>
<string name="settings_update">Configurações de Atualizações</string> <string name="settings_update">Configurações de Atualizações</string>
@ -117,9 +145,13 @@
<string name="settings_hosts_title">Hosts sem sistema</string> <string name="settings_hosts_title">Hosts sem sistema</string>
<string name="settings_hosts_summary">Suporte de hosts sem sistema para apps de Adblock</string> <string name="settings_hosts_summary">Suporte de hosts sem sistema para apps de Adblock</string>
<string name="settings_su_app_adb">Apps e ADB</string> <string name="settings_app_name">Digite o nome do app desejado</string>
<string name="settings_su_app">Apps apenas</string> <string name="settings_app_name_hint">Novo nome</string>
<string name="settings_su_adb">ADB apenas</string> <string name="settings_app_name_helper">O aplicativo será reempacotado para esse nome</string>
<string name="settings_app_name_error">Formato inválido</string>
<string name="settings_su_app_adb">Aplicativos e ADB</string>
<string name="settings_su_app">Somente aplicativos</string>
<string name="settings_su_adb">Somente ADB</string>
<string name="settings_su_disable">Desativado</string> <string name="settings_su_disable">Desativado</string>
<string name="settings_su_request_10">10 segundos</string> <string name="settings_su_request_10">10 segundos</string>
<string name="settings_su_request_15">15 segundos</string> <string name="settings_su_request_15">15 segundos</string>
@ -132,8 +164,11 @@
<string name="request_timeout">Tempo Limite de Solicitação</string> <string name="request_timeout">Tempo Limite de Solicitação</string>
<string name="superuser_notification">Notificação de Superusuário</string> <string name="superuser_notification">Notificação de Superusuário</string>
<string name="request_timeout_summary">%1$d segundos</string> <string name="request_timeout_summary">%1$d segundos</string>
<string name="settings_su_reauth_title">Reautenticar após atualizar</string> <string name="settings_su_reauth_title">Reautenticar após uma atualização</string>
<string name="settings_su_reauth_summary">Reautenticar permissões de superusuário após um app atualizar</string> <string name="settings_su_reauth_summary">Reautenticar permissões de superusuário após a atualização de um aplicativo</string>
<string name="settings_su_biometric_title">Habilitar autenticação biométrica</string>
<string name="settings_su_biometric_summary">Usar autenticação biométrica para permitir solicitações de superusuário</string>
<string name="no_biometric">Dispositivo não suportado ou nenhuma configuração biométrica está ativada</string>
<string name="multiuser_mode">Modo de Multiusuário</string> <string name="multiuser_mode">Modo de Multiusuário</string>
<string name="settings_owner_only">Proprietário do Dispositivo Apenas</string> <string name="settings_owner_only">Proprietário do Dispositivo Apenas</string>
@ -143,18 +178,19 @@
<string name="owner_manage_summary">Apenas proprietário pode gerenciar acesso root e receber expedições de solicitações</string> <string name="owner_manage_summary">Apenas proprietário pode gerenciar acesso root e receber expedições de solicitações</string>
<string name="user_indepenent_summary">Cada usuário tem suas próprias regras root separadas</string> <string name="user_indepenent_summary">Cada usuário tem suas próprias regras root separadas</string>
<string name="mount_namespace_mode">Montar Modo de Espaço de Nome</string> <string name="mount_namespace_mode">Modo de montar o namespace</string>
<string name="settings_ns_global">Espaço de Nome Global</string> <string name="settings_ns_global">Namespace Global</string>
<string name="settings_ns_requester">Espaço de Nome Herdado</string> <string name="settings_ns_requester">Herdar Namespace</string>
<string name="settings_ns_isolate">Espaço de Nome Isolado</string> <string name="settings_ns_isolate">Namespace isolado</string>
<string name="global_summary">Todas as sessões root usam montagem de espaço de nome global</string> <string name="global_summary">Todas as sessões de root usam a montagem de namespace global</string>
<string name="requester_summary">As sessões root herdarão espaço de nome de seu solicitante</string> <string name="requester_summary">As sessões de root herdarão o namespace do seu solicitante</string>
<string name="isolate_summary">Cada sessão root terá seu próprio espaço de nome isolado</string> <string name="isolate_summary">Cada sessão root terá seu próprio namespace isolado</string>
<string name="settings_download_path_error">Erro ao criar pasta. Ele deve estar acessível no diretório raiz do armazenamento e não deve ser um arquivo.</string>
<!--Superuser--> <!--Superuser-->
<string name="su_request_title">Solicitação de Superusuário</string> <string name="su_request_title">Solicitação de Superusuário</string>
<string name="deny">Negar</string> <string name="deny">Negar</string>
<string name="prompt">Solicitar</string> <string name="prompt">Perguntar</string>
<string name="grant">Conceder</string> <string name="grant">Conceder</string>
<string name="su_warning">Concede acesso total ao seu dispositivo.\nNegue se você não tem certeza!</string> <string name="su_warning">Concede acesso total ao seu dispositivo.\nNegue se você não tem certeza!</string>
<string name="forever">Sempre</string> <string name="forever">Sempre</string>

View File

@ -100,6 +100,18 @@ static void *request_handler(void *args) {
static void main_daemon() { static void main_daemon() {
android_logging(); android_logging();
int fd = xopen("/dev/null", O_WRONLY);
xdup2(fd, STDOUT_FILENO);
xdup2(fd, STDERR_FILENO);
if (fd > STDERR_FILENO)
close(fd);
fd = xopen("/dev/zero", O_RDONLY);
xdup2(fd, STDIN_FILENO);
if (fd > STDERR_FILENO)
close(fd);
close(fd);
setsid(); setsid();
setcon("u:r:" SEPOL_PROC_DOMAIN ":s0"); setcon("u:r:" SEPOL_PROC_DOMAIN ":s0");
restore_rootcon(); restore_rootcon();
@ -112,14 +124,6 @@ static void main_daemon() {
}, true); }, true);
} }
int fd = xopen("/dev/null", O_RDWR | O_CLOEXEC);
xdup2(fd, STDOUT_FILENO);
xdup2(fd, STDERR_FILENO);
close(fd);
fd = xopen("/dev/zero", O_RDWR | O_CLOEXEC);
xdup2(fd, STDIN_FILENO);
close(fd);
LOGI(SHOW_VER(Magisk) " daemon started\n"); LOGI(SHOW_VER(Magisk) " daemon started\n");
// Get server stat // Get server stat

View File

@ -138,7 +138,7 @@ static char *open_and_init_db(sqlite3 *&db) {
upgrade = true; upgrade = true;
} }
if (ver < 10) { if (ver < 10) {
sqlite3_exec(db, "DROP TABLE logs", nullptr, nullptr, &err); sqlite3_exec(db, "DROP TABLE IF EXISTS logs", nullptr, nullptr, &err);
err_ret(err); err_ret(err);
ver = 10; ver = 10;
upgrade = true; upgrade = true;

View File

@ -38,23 +38,22 @@ static int vprintk(const char *fmt, va_list ap) {
} }
void setup_klog() { void setup_klog() {
// Shut down first 3 fds // Shut down first 3 fds
int null; int fd;
if (access("/dev/null", W_OK) == 0) { if (access("/dev/null", W_OK) == 0) {
null = xopen("/dev/null", O_RDWR | O_CLOEXEC); fd = xopen("/dev/null", O_RDWR | O_CLOEXEC);
} else { } else {
mknod("/null", S_IFCHR | 0666, makedev(1, 3)); mknod("/null", S_IFCHR | 0666, makedev(1, 3));
null = xopen("/null", O_RDWR | O_CLOEXEC); fd = xopen("/null", O_RDWR | O_CLOEXEC);
unlink("/null"); unlink("/null");
} }
xdup3(null, STDIN_FILENO, O_CLOEXEC); xdup3(fd, STDIN_FILENO, O_CLOEXEC);
xdup3(null, STDOUT_FILENO, O_CLOEXEC); xdup3(fd, STDOUT_FILENO, O_CLOEXEC);
xdup3(null, STDERR_FILENO, O_CLOEXEC); xdup3(fd, STDERR_FILENO, O_CLOEXEC);
if (null > STDERR_FILENO) if (fd > STDERR_FILENO)
close(null); close(fd);
int fd; if (access("/dev/kmsg", W_OK) == 0) {
if (access("/proc/kmsg", W_OK) == 0) { fd = xopen("/dev/kmsg", O_WRONLY | O_CLOEXEC);
fd = xopen("/proc/kmsg", O_WRONLY | O_CLOEXEC);
} else { } else {
mknod("/kmsg", S_IFCHR | 0666, makedev(1, 11)); mknod("/kmsg", S_IFCHR | 0666, makedev(1, 11));
fd = xopen("/kmsg", O_WRONLY | O_CLOEXEC); fd = xopen("/kmsg", O_WRONLY | O_CLOEXEC);

View File

@ -22,15 +22,16 @@ uint32_t dyn_img_hdr::j32 = 0;
uint64_t dyn_img_hdr::j64 = 0; uint64_t dyn_img_hdr::j64 = 0;
static void decompress(format_t type, int fd, const void *in, size_t size) { static void decompress(format_t type, int fd, const void *in, size_t size) {
unique_ptr<stream> ptr(get_decoder(type, open_stream<fd_stream>(fd))); auto ptr = get_decoder(type, make_stream<fd_stream>(fd));
ptr->write(in, size); ptr->write(in, size);
} }
static int64_t compress(format_t type, int fd, const void *in, size_t size) { static off_t compress(format_t type, int fd, const void *in, size_t size) {
auto prev = lseek(fd, 0, SEEK_CUR); auto prev = lseek(fd, 0, SEEK_CUR);
unique_ptr<stream> ptr(get_encoder(type, open_stream<fd_stream>(fd))); {
ptr->write(in, size); auto strm = get_encoder(type, make_stream<fd_stream>(fd));
ptr->close(); strm->write(in, size);
}
auto now = lseek(fd, 0, SEEK_CUR); auto now = lseek(fd, 0, SEEK_CUR);
return now - prev; return now - prev;
} }

View File

@ -22,7 +22,6 @@
using namespace std; using namespace std;
#define bwrite filter_stream::write #define bwrite filter_stream::write
#define bclose filter_stream::close
constexpr size_t CHUNK = 0x40000; constexpr size_t CHUNK = 0x40000;
constexpr size_t LZ4_UNCOMPRESSED = 0x800000; constexpr size_t LZ4_UNCOMPRESSED = 0x800000;
@ -30,38 +29,35 @@ constexpr size_t LZ4_COMPRESSED = LZ4_COMPRESSBOUND(LZ4_UNCOMPRESSED);
class cpr_stream : public filter_stream { class cpr_stream : public filter_stream {
public: public:
explicit cpr_stream(FILE *fp) : filter_stream(fp) {} using filter_stream::filter_stream;
using stream::read;
int read(void *buf, size_t len) final {
return stream::read(buf, len);
}
int close() final {
finish();
return bclose();
}
protected:
// If finish is overridden, destroy should be called in the destructor
virtual void finish() {}
void destroy() { if (fp) finish(); }
}; };
class gz_strm : public cpr_stream { class gz_strm : public cpr_stream {
public: public:
~gz_strm() override { destroy(); }
int write(const void *buf, size_t len) override { int write(const void *buf, size_t len) override {
return len ? write(buf, len, Z_NO_FLUSH) : 0; return len ? write(buf, len, Z_NO_FLUSH) : 0;
} }
~gz_strm() override {
write(nullptr, 0, Z_FINISH);
switch(mode) {
case DECODE:
inflateEnd(&strm);
break;
case ENCODE:
deflateEnd(&strm);
break;
}
}
protected: protected:
enum mode_t { enum mode_t {
DECODE, DECODE,
ENCODE ENCODE
} mode; } mode;
gz_strm(mode_t mode, FILE *fp) : cpr_stream(fp), mode(mode) { gz_strm(mode_t mode, sFILE &&fp) : cpr_stream(std::move(fp)), mode(mode) {
switch(mode) { switch(mode) {
case DECODE: case DECODE:
inflateInit2(&strm, 15 | 16); inflateInit2(&strm, 15 | 16);
@ -72,18 +68,6 @@ protected:
} }
} }
void finish() override {
write(nullptr, 0, Z_FINISH);
switch(mode) {
case DECODE:
inflateEnd(&strm);
break;
case ENCODE:
deflateEnd(&strm);
break;
}
}
private: private:
z_stream strm; z_stream strm;
uint8_t outbuf[CHUNK]; uint8_t outbuf[CHUNK];
@ -115,29 +99,39 @@ private:
class gz_decoder : public gz_strm { class gz_decoder : public gz_strm {
public: public:
explicit gz_decoder(FILE *fp) : gz_strm(DECODE, fp) {}; explicit gz_decoder(sFILE &&fp) : gz_strm(DECODE, std::move(fp)) {};
}; };
class gz_encoder : public gz_strm { class gz_encoder : public gz_strm {
public: public:
explicit gz_encoder(FILE *fp) : gz_strm(ENCODE, fp) {}; explicit gz_encoder(sFILE &&fp) : gz_strm(ENCODE, std::move(fp)) {};
}; };
class bz_strm : public cpr_stream { class bz_strm : public cpr_stream {
public: public:
~bz_strm() override { destroy(); }
int write(const void *buf, size_t len) override { int write(const void *buf, size_t len) override {
return len ? write(buf, len, BZ_RUN) : 0; return len ? write(buf, len, BZ_RUN) : 0;
} }
~bz_strm() override {
switch(mode) {
case DECODE:
BZ2_bzDecompressEnd(&strm);
break;
case ENCODE:
write(nullptr, 0, BZ_FINISH);
BZ2_bzCompressEnd(&strm);
break;
}
}
protected: protected:
enum mode_t { enum mode_t {
DECODE, DECODE,
ENCODE ENCODE
} mode; } mode;
bz_strm(mode_t mode, FILE *fp) : cpr_stream(fp), mode(mode) { bz_strm(mode_t mode, sFILE &&fp) : cpr_stream(std::move(fp)), mode(mode) {
switch(mode) { switch(mode) {
case DECODE: case DECODE:
BZ2_bzDecompressInit(&strm, 0, 0); BZ2_bzDecompressInit(&strm, 0, 0);
@ -148,18 +142,6 @@ protected:
} }
} }
void finish() override {
switch(mode) {
case DECODE:
BZ2_bzDecompressEnd(&strm);
break;
case ENCODE:
write(nullptr, 0, BZ_FINISH);
BZ2_bzCompressEnd(&strm);
break;
}
}
private: private:
bz_stream strm; bz_stream strm;
char outbuf[CHUNK]; char outbuf[CHUNK];
@ -191,22 +173,25 @@ private:
class bz_decoder : public bz_strm { class bz_decoder : public bz_strm {
public: public:
explicit bz_decoder(FILE *fp) : bz_strm(DECODE, fp) {}; explicit bz_decoder(sFILE &&fp) : bz_strm(DECODE, std::move(fp)) {};
}; };
class bz_encoder : public bz_strm { class bz_encoder : public bz_strm {
public: public:
explicit bz_encoder(FILE *fp) : bz_strm(ENCODE, fp) {}; explicit bz_encoder(sFILE &&fp) : bz_strm(ENCODE, std::move(fp)) {};
}; };
class lzma_strm : public cpr_stream { class lzma_strm : public cpr_stream {
public: public:
~lzma_strm() override { destroy(); }
int write(const void *buf, size_t len) override { int write(const void *buf, size_t len) override {
return len ? write(buf, len, LZMA_RUN) : 0; return len ? write(buf, len, LZMA_RUN) : 0;
} }
~lzma_strm() override {
write(nullptr, 0, LZMA_FINISH);
lzma_end(&strm);
}
protected: protected:
enum mode_t { enum mode_t {
DECODE, DECODE,
@ -214,7 +199,8 @@ protected:
ENCODE_LZMA ENCODE_LZMA
} mode; } mode;
lzma_strm(mode_t mode, FILE *fp) : cpr_stream(fp), mode(mode), strm(LZMA_STREAM_INIT) { lzma_strm(mode_t mode, sFILE &&fp)
: cpr_stream(std::move(fp)), mode(mode), strm(LZMA_STREAM_INIT) {
lzma_options_lzma opt; lzma_options_lzma opt;
// Initialize preset // Initialize preset
@ -238,11 +224,6 @@ protected:
} }
} }
void finish() override {
write(nullptr, 0, LZMA_FINISH);
lzma_end(&strm);
}
private: private:
lzma_stream strm; lzma_stream strm;
uint8_t outbuf[CHUNK]; uint8_t outbuf[CHUNK];
@ -266,22 +247,22 @@ private:
class lzma_decoder : public lzma_strm { class lzma_decoder : public lzma_strm {
public: public:
lzma_decoder(FILE *fp) : lzma_strm(DECODE, fp) {} explicit lzma_decoder(sFILE &&fp) : lzma_strm(DECODE, std::move(fp)) {}
}; };
class xz_encoder : public lzma_strm { class xz_encoder : public lzma_strm {
public: public:
xz_encoder(FILE *fp) : lzma_strm(ENCODE_XZ, fp) {} explicit xz_encoder(sFILE &&fp) : lzma_strm(ENCODE_XZ, std::move(fp)) {}
}; };
class lzma_encoder : public lzma_strm { class lzma_encoder : public lzma_strm {
public: public:
lzma_encoder(FILE *fp) : lzma_strm(ENCODE_LZMA, fp) {} explicit lzma_encoder(sFILE &&fp) : lzma_strm(ENCODE_LZMA, std::move(fp)) {}
}; };
class LZ4F_decoder : public cpr_stream { class LZ4F_decoder : public cpr_stream {
public: public:
explicit LZ4F_decoder(FILE *fp) : cpr_stream(fp), outbuf(nullptr) { explicit LZ4F_decoder(sFILE &&fp) : cpr_stream(std::move(fp)), outbuf(nullptr) {
LZ4F_createDecompressionContext(&ctx, LZ4F_VERSION); LZ4F_createDecompressionContext(&ctx, LZ4F_VERSION);
} }
@ -336,16 +317,11 @@ private:
class LZ4F_encoder : public cpr_stream { class LZ4F_encoder : public cpr_stream {
public: public:
explicit LZ4F_encoder(FILE *fp) : cpr_stream(fp), outbuf(nullptr), outCapacity(0) { explicit LZ4F_encoder(sFILE &&fp)
: cpr_stream(std::move(fp)), outbuf(nullptr), outCapacity(0) {
LZ4F_createCompressionContext(&ctx, LZ4F_VERSION); LZ4F_createCompressionContext(&ctx, LZ4F_VERSION);
} }
~LZ4F_encoder() override {
destroy();
LZ4F_freeCompressionContext(ctx);
delete[] outbuf;
}
int write(const void *buf, size_t len) override { int write(const void *buf, size_t len) override {
auto ret = len; auto ret = len;
if (!outbuf) if (!outbuf)
@ -368,10 +344,11 @@ public:
return ret; return ret;
} }
protected: ~LZ4F_encoder() override {
void finish() override {
size_t len = LZ4F_compressEnd(ctx, outbuf, outCapacity, nullptr); size_t len = LZ4F_compressEnd(ctx, outbuf, outCapacity, nullptr);
bwrite(outbuf, len); bwrite(outbuf, len);
LZ4F_freeCompressionContext(ctx);
delete[] outbuf;
} }
private: private:
@ -401,9 +378,9 @@ private:
class LZ4_decoder : public cpr_stream { class LZ4_decoder : public cpr_stream {
public: public:
explicit LZ4_decoder(FILE *fp) explicit LZ4_decoder(sFILE &&fp)
: cpr_stream(fp), out_buf(new char[LZ4_UNCOMPRESSED]), buffer(new char[LZ4_COMPRESSED]), : cpr_stream(std::move(fp)), out_buf(new char[LZ4_UNCOMPRESSED]),
init(false), block_sz(0), buf_off(0) {} buffer(new char[LZ4_COMPRESSED]), init(false), block_sz(0), buf_off(0) {}
~LZ4_decoder() override { ~LZ4_decoder() override {
delete[] out_buf; delete[] out_buf;
@ -462,16 +439,10 @@ private:
class LZ4_encoder : public cpr_stream { class LZ4_encoder : public cpr_stream {
public: public:
explicit LZ4_encoder(FILE *fp) explicit LZ4_encoder(sFILE &&fp)
: cpr_stream(fp), outbuf(new char[LZ4_COMPRESSED]), buf(new char[LZ4_UNCOMPRESSED]), : cpr_stream(std::move(fp)), outbuf(new char[LZ4_COMPRESSED]), buf(new char[LZ4_UNCOMPRESSED]),
init(false), buf_off(0), in_total(0) {} init(false), buf_off(0), in_total(0) {}
~LZ4_encoder() override {
destroy();
delete[] outbuf;
delete[] buf;
}
int write(const void *in, size_t size) override { int write(const void *in, size_t size) override {
if (!init) { if (!init) {
bwrite("\x02\x21\x4c\x18", 4); bwrite("\x02\x21\x4c\x18", 4);
@ -510,14 +481,15 @@ public:
return true; return true;
} }
protected: ~LZ4_encoder() override {
void finish() override {
if (buf_off) { if (buf_off) {
int write = LZ4_compress_HC(buf, outbuf, buf_off, LZ4_COMPRESSED, 9); int write = LZ4_compress_HC(buf, outbuf, buf_off, LZ4_COMPRESSED, 9);
bwrite(&write, sizeof(write)); bwrite(&write, sizeof(write));
bwrite(outbuf, write); bwrite(outbuf, write);
} }
bwrite(&in_total, sizeof(in_total)); bwrite(&in_total, sizeof(in_total));
delete[] outbuf;
delete[] buf;
} }
private: private:
@ -528,38 +500,38 @@ private:
unsigned in_total; unsigned in_total;
}; };
filter_stream *get_encoder(format_t type, FILE *fp) { stream_ptr get_encoder(format_t type, sFILE &&fp) {
switch (type) { switch (type) {
case XZ: case XZ:
return new xz_encoder(fp); return make_unique<xz_encoder>(std::move(fp));
case LZMA: case LZMA:
return new lzma_encoder(fp); return make_unique<lzma_encoder>(std::move(fp));
case BZIP2: case BZIP2:
return new bz_encoder(fp); return make_unique<bz_encoder>(std::move(fp));
case LZ4: case LZ4:
return new LZ4F_encoder(fp); return make_unique<LZ4F_encoder>(std::move(fp));
case LZ4_LEGACY: case LZ4_LEGACY:
return new LZ4_encoder(fp); return make_unique<LZ4_encoder>(std::move(fp));
case GZIP: case GZIP:
default: default:
return new gz_encoder(fp); return make_unique<gz_encoder>(std::move(fp));
} }
} }
filter_stream *get_decoder(format_t type, FILE *fp) { stream_ptr get_decoder(format_t type, sFILE &&fp) {
switch (type) { switch (type) {
case XZ: case XZ:
case LZMA: case LZMA:
return new lzma_decoder(fp); return make_unique<lzma_decoder>(std::move(fp));
case BZIP2: case BZIP2:
return new bz_decoder(fp); return make_unique<bz_decoder>(std::move(fp));
case LZ4: case LZ4:
return new LZ4F_decoder(fp); return make_unique<LZ4F_decoder>(std::move(fp));
case LZ4_LEGACY: case LZ4_LEGACY:
return new LZ4_decoder(fp); return make_unique<LZ4_decoder>(std::move(fp));
case GZIP: case GZIP:
default: default:
return new gz_decoder(fp); return make_unique<gz_decoder>(std::move(fp));
} }
} }
@ -568,7 +540,7 @@ void decompress(char *infile, const char *outfile) {
bool rm_in = false; bool rm_in = false;
FILE *in_fp = in_std ? stdin : xfopen(infile, "re"); FILE *in_fp = in_std ? stdin : xfopen(infile, "re");
unique_ptr<stream> strm; stream_ptr strm;
char buf[4096]; char buf[4096];
size_t len; size_t len;
@ -601,14 +573,14 @@ void decompress(char *infile, const char *outfile) {
} }
FILE *out_fp = outfile == "-"sv ? stdout : xfopen(outfile, "we"); FILE *out_fp = outfile == "-"sv ? stdout : xfopen(outfile, "we");
strm.reset(get_decoder(type, out_fp)); strm = get_decoder(type, make_sFILE(out_fp));
if (ext) *ext = '.'; if (ext) *ext = '.';
} }
if (strm->write(buf, len) < 0) if (strm->write(buf, len) < 0)
LOGE("Decompression error!\n"); LOGE("Decompression error!\n");
} }
strm->close(); strm.reset(nullptr);
fclose(in_fp); fclose(in_fp);
if (rm_in) if (rm_in)
@ -642,7 +614,7 @@ void compress(const char *method, const char *infile, const char *outfile) {
out_fp = outfile == "-"sv ? stdout : xfopen(outfile, "we"); out_fp = outfile == "-"sv ? stdout : xfopen(outfile, "we");
} }
unique_ptr<stream> strm(get_encoder(it->second, out_fp)); auto strm = get_encoder(it->second, make_sFILE(out_fp));
char buf[4096]; char buf[4096];
size_t len; size_t len;
@ -651,7 +623,7 @@ void compress(const char *method, const char *infile, const char *outfile) {
LOGE("Compression error!\n"); LOGE("Compression error!\n");
}; };
strm->close(); strm.reset(nullptr);
fclose(in_fp); fclose(in_fp);
if (rm_in) if (rm_in)

View File

@ -4,7 +4,10 @@
#include "format.h" #include "format.h"
filter_stream *get_encoder(format_t type, FILE *fp = nullptr); stream_ptr get_encoder(format_t type, sFILE &&fp);
filter_stream *get_decoder(format_t type, FILE *fp = nullptr);
stream_ptr get_decoder(format_t type, sFILE &&fp);
void compress(const char *method, const char *infile, const char *outfile); void compress(const char *method, const char *infile, const char *outfile);
void decompress(char *infile, const char *outfile); void decompress(char *infile, const char *outfile);

View File

@ -244,8 +244,8 @@ void magisk_cpio::compress() {
uint8_t *data; uint8_t *data;
size_t len; size_t len;
FILE *fp = open_stream(get_encoder(XZ, open_stream<byte_stream>(data, len))); auto strm = make_stream(get_encoder(XZ, make_stream<byte_stream>(data, len)));
dump(fp); dump(strm.release());
entries.clear(); entries.clear();
entries.insert(std::move(init)); entries.insert(std::move(init));
@ -263,9 +263,10 @@ void magisk_cpio::decompress() {
char *data; char *data;
size_t len; size_t len;
auto strm = get_decoder(XZ, open_stream<byte_stream>(data, len)); {
strm->write(it->second->data, it->second->filesize); auto strm = get_decoder(XZ, make_stream<byte_stream>(data, len));
delete strm; strm->write(it->second->data, it->second->filesize);
}
entries.erase(it); entries.erase(it);
load_cpio(data, len); load_cpio(data, len);

View File

@ -174,19 +174,20 @@ int compile_split_cil() {
} }
int dump_policydb(const char *file) { int dump_policydb(const char *file) {
struct policy_file pf;
policy_file_init(&pf);
uint8_t *data; uint8_t *data;
size_t len; size_t len;
pf.type = PF_USE_STDIO; {
pf.fp = open_stream<byte_stream>(data, len); auto fp = make_stream<byte_stream>(data, len);
if (policydb_write(magisk_policydb, &pf)) { struct policy_file pf;
LOGE("Fail to create policy image\n"); policy_file_init(&pf);
return 1; pf.type = PF_USE_STDIO;
pf.fp = fp.get();
if (policydb_write(magisk_policydb, &pf)) {
LOGE("Fail to create policy image\n");
return 1;
}
} }
fclose(pf.fp);
int fd = xopen(file, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0644); int fd = xopen(file, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0644);
if (fd < 0) if (fd < 0)

View File

@ -196,7 +196,7 @@ void sepol_magisk_rules() {
// Allow update_engine/addon.d-v2 to run permissive on all ROMs // Allow update_engine/addon.d-v2 to run permissive on all ROMs
sepol_permissive("update_engine"); sepol_permissive("update_engine");
#ifdef MAGISK_DEBUG #if 0
// Remove all dontaudit in debug mode // Remove all dontaudit in debug mode
strip_dontaudit(); strip_dontaudit();
#endif #endif

View File

@ -109,7 +109,7 @@ bool cpio::exists(const char *name) {
return entries.count(name) != 0; return entries.count(name) != 0;
} }
#define do_out(buf, len) pos += fwrite(buf, len, 1, out); #define do_out(buf, len) pos += fwrite(buf, 1, len, out);
#define out_align() do_out(zeros, align_off(pos, 4)) #define out_align() do_out(zeros, align_off(pos, 4))
void cpio::dump(FILE *out) { void cpio::dump(FILE *out) {
size_t pos = 0; size_t pos = 0;
@ -142,7 +142,7 @@ void cpio::dump(FILE *out) {
} }
// Write trailer // Write trailer
sprintf(header, "070701%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", sprintf(header, "070701%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
inode++, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 11, 0); inode++, 0755, 0, 0, 1, 0, 0, 0, 0, 0, 0, 11, 0);
do_out(header, 110); do_out(header, 110);
do_out("TRAILER!!!\0", 11); do_out("TRAILER!!!\0", 11);
out_align(); out_align();

View File

@ -1,11 +1,17 @@
#pragma once #pragma once
#include <mntent.h>
#include <functional> #include <functional>
#include <string_view> #include <string_view>
#define do_align(p, a) (((p) + (a) - 1) / (a) * (a)) #define do_align(p, a) (((p) + (a) - 1) / (a) * (a))
#define align_off(p, a) (do_align(p, a) - (p)) #define align_off(p, a) (do_align(p, a) - (p))
using sFILE = std::unique_ptr<FILE, decltype(&fclose)>;
static inline sFILE make_sFILE(FILE *fp = nullptr) {
return sFILE(fp, fclose);
}
struct file_attr { struct file_attr {
struct stat st; struct stat st;
char con[128]; char con[128];
@ -37,7 +43,7 @@ void parse_prop_file(const char *file, const std::function
void *__mmap(const char *filename, size_t *size, bool rw); void *__mmap(const char *filename, size_t *size, bool rw);
void frm_rf(int dirfd, std::initializer_list<const char *> excl = std::initializer_list<const char *>()); void frm_rf(int dirfd, std::initializer_list<const char *> excl = std::initializer_list<const char *>());
void clone_dir(int src, int dest, bool overwrite = true); void clone_dir(int src, int dest, bool overwrite = true);
void parse_mnt(const char *file, const std::function<bool (mntent*)> &fn); void parse_mnt(const char *file, const std::function<bool(mntent*)> &fn);
template <typename T> template <typename T>
void full_read(const char *filename, T &buf, size_t &size) { void full_read(const char *filename, T &buf, size_t &size) {

View File

@ -1,18 +1,19 @@
#pragma once #pragma once
#include <unistd.h>
#include <stdio.h> #include <stdio.h>
#include <memory> #include <memory>
// #include <utils.h> #include "../files.h"
class stream; class stream;
FILE *open_stream(stream *strm); using stream_ptr = std::unique_ptr<stream>;
sFILE make_stream(stream_ptr &&strm);
template <class T, class... Args> template <class T, class... Args>
FILE *open_stream(Args &&... args) { sFILE make_stream(Args &&... args) {
return open_stream(new T(args...)); return make_stream(stream_ptr(new T(std::forward<Args>(args)...)));
} }
class stream { class stream {
@ -20,28 +21,25 @@ public:
virtual int read(void *buf, size_t len); virtual int read(void *buf, size_t len);
virtual int write(const void *buf, size_t len); virtual int write(const void *buf, size_t len);
virtual off_t seek(off_t off, int whence); virtual off_t seek(off_t off, int whence);
virtual int close();
virtual ~stream() = default; virtual ~stream() = default;
}; };
// Delegates all operations to the base FILE pointer // Delegates all operations to the base FILE pointer
class filter_stream : public stream { class filter_stream : public stream {
public: public:
filter_stream(FILE *fp) : fp(fp) {} filter_stream(sFILE &&fp = make_sFILE()) : fp(std::move(fp)) {}
~filter_stream() override { if (fp) close(); }
int read(void *buf, size_t len) override; int read(void *buf, size_t len) override;
int write(const void *buf, size_t len) override; int write(const void *buf, size_t len) override;
int close() override;
void set_base(FILE *f); void set_base(sFILE &&f);
template <class T, class... Args > template <class T, class... Args >
void set_base(Args&&... args) { void set_base(Args&&... args) {
set_base(open_stream<T>(args...)); set_base(make_stream<T>(std::forward<Args>(args)...));
} }
protected: protected:
FILE *fp; sFILE fp;
}; };
// Handy interface for classes that need custom seek logic // Handy interface for classes that need custom seek logic
@ -69,7 +67,7 @@ private:
size_t _cap = 0; size_t _cap = 0;
void resize(size_t new_pos, bool zero = false); void resize(size_t new_pos, bool zero = false);
size_t end_pos() override { return _len; } size_t end_pos() final { return _len; }
}; };
// File stream but does not close the file descriptor at any time // File stream but does not close the file descriptor at any time

View File

@ -19,15 +19,13 @@ static fpos_t strm_seek(void *v, fpos_t off, int whence) {
static int strm_close(void *v) { static int strm_close(void *v) {
auto strm = reinterpret_cast<stream *>(v); auto strm = reinterpret_cast<stream *>(v);
int ret = strm->close();
delete strm; delete strm;
return ret; return 0;
} }
FILE *open_stream(stream *strm) { sFILE make_stream(stream_ptr &&strm) {
FILE *fp = funopen(strm, strm_read, strm_write, strm_seek, strm_close); sFILE fp(funopen(strm.release(), strm_read, strm_write, strm_seek, strm_close), fclose);
// Disable buffering setbuf(fp.get(), nullptr);
setbuf(fp, nullptr);
return fp; return fp;
} }
@ -46,27 +44,16 @@ off_t stream::seek(off_t off, int whence) {
return -1; return -1;
} }
int stream::close() {
return 0;
}
int filter_stream::read(void *buf, size_t len) { int filter_stream::read(void *buf, size_t len) {
return fread(buf, len, 1, fp); return fread(buf, 1, len, fp.get());
} }
int filter_stream::write(const void *buf, size_t len) { int filter_stream::write(const void *buf, size_t len) {
return fwrite(buf, len, 1, fp); return fwrite(buf, 1, len, fp.get());
} }
int filter_stream::close() { void filter_stream::set_base(sFILE &&f) {
int ret = fclose(fp); fp = std::move(f);
fp = nullptr;
return ret;
}
void filter_stream::set_base(FILE *f) {
if (fp) fclose(fp);
fp = f;
} }
off_t seekable_stream::seek_pos(off_t off, int whence) { off_t seekable_stream::seek_pos(off_t off, int whence) {

View File

@ -154,7 +154,7 @@ public class FileProvider extends ContentProvider {
public Bundle call(String method, String arg, Bundle extras) { public Bundle call(String method, String arg, Bundle extras) {
if (callHandler != null) if (callHandler != null)
return callHandler.call(getContext(), method, arg, extras); return callHandler.call(getContext(), method, arg, extras);
return null; return Bundle.EMPTY;
} }
@Override @Override