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? {
invoke(context.wrap(), method, extras)
return null
return Bundle.EMPTY
}
operator fun invoke(context: Context, action: String?, data: Bundle?) {

View File

@ -8,23 +8,26 @@
<string name="log">Registro</string>
<string name="settings">Configurações</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-->
<string name="magisk_version_error">Magisk não está instalado</string>
<string name="checking_for_updates">Verificando por atualizações…</string>
<string name="invalid_update_channel">Canal de Atualização Inválido</string>
<string name="safetyNet_check_text">Verificar SafetyNet</string>
<string name="checking_safetyNet_status">Verificando status de SafetyNet…</string>
<string name="safetyNet_check_success">SafetyNet Verificado Com Sucesso</string>
<string name="safetyNet_api_error">Erro de SafetyNet API</string>
<string name="checking_for_updates">Procurando por atualizações…</string>
<string name="invalid_update_channel">Canal de Atualizações Inválido</string>
<string name="safetyNet_check_text">Toque para iniciar a verificação do 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_api_error">Erro na API do SafetyNet</string>
<string name="safetyNet_res_invalid">A resposta é inválida</string>
<string name="magisk_up_to_date">Magisk atualizado</string>
<string name="manager_up_to_date">Gerenciador Magisk atualizado</string>
<string name="magisk_up_to_date">Magisk está 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="keep_force_encryption">Manter encriptação forçada</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="latest_version">Último: %1$s</string>
<string name="latest_version">Mais recente: %1$s</string>
<string name="uninstall">Desinstalar</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>
@ -62,45 +65,70 @@
<!--About Activity-->
<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-->
<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="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 configurações</string>
<string name="settings_reboot_toast">Reinicie para aplicar as mudanças</string>
<string name="release_notes">Notas de lançamento</string>
<string name="repo_cache_cleared">Cache de repositório limpo</string>
<string name="manager_update_title">Nova Atualização do Magisk Manager Disponível!</string>
<string name="manager_download_install">Toque para baixar e instalar</string>
<string name="dtbo_patched_title">DTBO foi emendado!</string>
<string name="dtbo_patched_reboot">Magisk Manager emendou dtbo.img, reinicie</string>
<string name="update_channel">Atualizações do Magisk</string>
<string name="flashing">Flasheando</string>
<string name="hide_manager_title">Ocultando Magisk Manager…</string>
<string name="hide_manager_fail_toast">Falha ao ocultar Magisk Manager…</string>
<string name="download_zip_only">Baixar Zip Apenas</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="repo_cache_cleared">Cache do repositório limpo</string>
<string name="dtbo_patched_title">DTBO foi patcheado!</string>
<string name="dtbo_patched_reboot">Magisk Manager foi patcheado para o dtbo.img. Por favor, reinicie.</string>
<string name="flashing">Flasheando…</string>
<string name="done">Pronto!</string>
<string name="failure">Falha</string>
<string name="hide_manager_title">Ocultando o Magisk Manager…</string>
<string name="hide_manager_fail_toast">Falha ao ocultar o Magisk Manager.</string>
<string name="open_link_failed_toast">Nenhum aplicativo encontrado para abrir o link</string>
<string name="warning">Aviso</string>
<string name="complete_uninstall">Completar Desinstalação</string>
<string name="restore_img">Restaurar Imagens</string>
<string name="restore_done">Restauração concluída!</string>
<string name="restore_fail">Backup original não existe!</string>
<string name="restore_img_msg">Restaurando…</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_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="download_file_error">Erro ao baixar arquivo</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="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 -->
<string name="settings_general_category">Geral</string>
<string name="settings_dark_theme_title">Tema Escuro</string>
<string name="settings_dark_theme_summary">Ativar tema escuro</string>
<string name="settings_clear_cache_title">Limpar Cache de Repositório</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_dark_theme_summary">Ativar o tema escuro</string>
<string name="settings_download_path_title">Caminho de download</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_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_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="system_default">(Padrão do Sistema)</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_summary">Suporte de hosts sem sistema para apps de Adblock</string>
<string name="settings_su_app_adb">Apps e ADB</string>
<string name="settings_su_app">Apps apenas</string>
<string name="settings_su_adb">ADB apenas</string>
<string name="settings_app_name">Digite o nome do app desejado</string>
<string name="settings_app_name_hint">Novo nome</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_request_10">10 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="superuser_notification">Notificação de Superusuário</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_summary">Reautenticar permissões de superusuário após um app 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 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="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="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="settings_ns_global">Espaço de Nome Global</string>
<string name="settings_ns_requester">Espaço de Nome Herdado</string>
<string name="settings_ns_isolate">Espaço de Nome Isolado</string>
<string name="global_summary">Todas as sessões root usam montagem de espaço de nome global</string>
<string name="requester_summary">As sessões root herdarão espaço de nome de seu solicitante</string>
<string name="isolate_summary">Cada sessão root terá seu próprio espaço de nome isolado</string>
<string name="mount_namespace_mode">Modo de montar o namespace</string>
<string name="settings_ns_global">Namespace Global</string>
<string name="settings_ns_requester">Herdar Namespace</string>
<string name="settings_ns_isolate">Namespace isolado</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 de root herdarão o namespace do seu solicitante</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-->
<string name="su_request_title">Solicitação de Superusuário</string>
<string name="deny">Negar</string>
<string name="prompt">Solicitar</string>
<string name="prompt">Perguntar</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="forever">Sempre</string>

View File

@ -100,6 +100,18 @@ static void *request_handler(void *args) {
static void main_daemon() {
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();
setcon("u:r:" SEPOL_PROC_DOMAIN ":s0");
restore_rootcon();
@ -112,14 +124,6 @@ static void main_daemon() {
}, 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");
// Get server stat

View File

@ -138,7 +138,7 @@ static char *open_and_init_db(sqlite3 *&db) {
upgrade = true;
}
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);
ver = 10;
upgrade = true;

View File

@ -38,23 +38,22 @@ static int vprintk(const char *fmt, va_list ap) {
}
void setup_klog() {
// Shut down first 3 fds
int null;
int fd;
if (access("/dev/null", W_OK) == 0) {
null = xopen("/dev/null", O_RDWR | O_CLOEXEC);
fd = xopen("/dev/null", O_RDWR | O_CLOEXEC);
} else {
mknod("/null", S_IFCHR | 0666, makedev(1, 3));
null = xopen("/null", O_RDWR | O_CLOEXEC);
fd = xopen("/null", O_RDWR | O_CLOEXEC);
unlink("/null");
}
xdup3(null, STDIN_FILENO, O_CLOEXEC);
xdup3(null, STDOUT_FILENO, O_CLOEXEC);
xdup3(null, STDERR_FILENO, O_CLOEXEC);
if (null > STDERR_FILENO)
close(null);
xdup3(fd, STDIN_FILENO, O_CLOEXEC);
xdup3(fd, STDOUT_FILENO, O_CLOEXEC);
xdup3(fd, STDERR_FILENO, O_CLOEXEC);
if (fd > STDERR_FILENO)
close(fd);
int fd;
if (access("/proc/kmsg", W_OK) == 0) {
fd = xopen("/proc/kmsg", O_WRONLY | O_CLOEXEC);
if (access("/dev/kmsg", W_OK) == 0) {
fd = xopen("/dev/kmsg", O_WRONLY | O_CLOEXEC);
} else {
mknod("/kmsg", S_IFCHR | 0666, makedev(1, 11));
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;
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);
}
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);
unique_ptr<stream> ptr(get_encoder(type, open_stream<fd_stream>(fd)));
ptr->write(in, size);
ptr->close();
{
auto strm = get_encoder(type, make_stream<fd_stream>(fd));
strm->write(in, size);
}
auto now = lseek(fd, 0, SEEK_CUR);
return now - prev;
}

View File

@ -22,7 +22,6 @@
using namespace std;
#define bwrite filter_stream::write
#define bclose filter_stream::close
constexpr size_t CHUNK = 0x40000;
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 {
public:
explicit cpr_stream(FILE *fp) : filter_stream(fp) {}
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(); }
using filter_stream::filter_stream;
using stream::read;
};
class gz_strm : public cpr_stream {
public:
~gz_strm() override { destroy(); }
int write(const void *buf, size_t len) override {
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:
enum mode_t {
DECODE,
ENCODE
} 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) {
case DECODE:
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:
z_stream strm;
uint8_t outbuf[CHUNK];
@ -115,29 +99,39 @@ private:
class gz_decoder : public gz_strm {
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 {
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 {
public:
~bz_strm() override { destroy(); }
int write(const void *buf, size_t len) override {
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:
enum mode_t {
DECODE,
ENCODE
} 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) {
case DECODE:
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:
bz_stream strm;
char outbuf[CHUNK];
@ -191,22 +173,25 @@ private:
class bz_decoder : public bz_strm {
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 {
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 {
public:
~lzma_strm() override { destroy(); }
int write(const void *buf, size_t len) override {
return len ? write(buf, len, LZMA_RUN) : 0;
}
~lzma_strm() override {
write(nullptr, 0, LZMA_FINISH);
lzma_end(&strm);
}
protected:
enum mode_t {
DECODE,
@ -214,7 +199,8 @@ protected:
ENCODE_LZMA
} 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;
// Initialize preset
@ -238,11 +224,6 @@ protected:
}
}
void finish() override {
write(nullptr, 0, LZMA_FINISH);
lzma_end(&strm);
}
private:
lzma_stream strm;
uint8_t outbuf[CHUNK];
@ -266,22 +247,22 @@ private:
class lzma_decoder : public lzma_strm {
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 {
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 {
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 {
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);
}
@ -336,16 +317,11 @@ private:
class LZ4F_encoder : public cpr_stream {
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_encoder() override {
destroy();
LZ4F_freeCompressionContext(ctx);
delete[] outbuf;
}
int write(const void *buf, size_t len) override {
auto ret = len;
if (!outbuf)
@ -368,10 +344,11 @@ public:
return ret;
}
protected:
void finish() override {
~LZ4F_encoder() override {
size_t len = LZ4F_compressEnd(ctx, outbuf, outCapacity, nullptr);
bwrite(outbuf, len);
LZ4F_freeCompressionContext(ctx);
delete[] outbuf;
}
private:
@ -401,9 +378,9 @@ private:
class LZ4_decoder : public cpr_stream {
public:
explicit LZ4_decoder(FILE *fp)
: cpr_stream(fp), out_buf(new char[LZ4_UNCOMPRESSED]), buffer(new char[LZ4_COMPRESSED]),
init(false), block_sz(0), buf_off(0) {}
explicit LZ4_decoder(sFILE &&fp)
: cpr_stream(std::move(fp)), out_buf(new char[LZ4_UNCOMPRESSED]),
buffer(new char[LZ4_COMPRESSED]), init(false), block_sz(0), buf_off(0) {}
~LZ4_decoder() override {
delete[] out_buf;
@ -462,16 +439,10 @@ private:
class LZ4_encoder : public cpr_stream {
public:
explicit LZ4_encoder(FILE *fp)
: cpr_stream(fp), outbuf(new char[LZ4_COMPRESSED]), buf(new char[LZ4_UNCOMPRESSED]),
explicit LZ4_encoder(sFILE &&fp)
: cpr_stream(std::move(fp)), outbuf(new char[LZ4_COMPRESSED]), buf(new char[LZ4_UNCOMPRESSED]),
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 {
if (!init) {
bwrite("\x02\x21\x4c\x18", 4);
@ -510,14 +481,15 @@ public:
return true;
}
protected:
void finish() override {
~LZ4_encoder() override {
if (buf_off) {
int write = LZ4_compress_HC(buf, outbuf, buf_off, LZ4_COMPRESSED, 9);
bwrite(&write, sizeof(write));
bwrite(outbuf, write);
}
bwrite(&in_total, sizeof(in_total));
delete[] outbuf;
delete[] buf;
}
private:
@ -528,38 +500,38 @@ private:
unsigned in_total;
};
filter_stream *get_encoder(format_t type, FILE *fp) {
stream_ptr get_encoder(format_t type, sFILE &&fp) {
switch (type) {
case XZ:
return new xz_encoder(fp);
return make_unique<xz_encoder>(std::move(fp));
case LZMA:
return new lzma_encoder(fp);
return make_unique<lzma_encoder>(std::move(fp));
case BZIP2:
return new bz_encoder(fp);
return make_unique<bz_encoder>(std::move(fp));
case LZ4:
return new LZ4F_encoder(fp);
return make_unique<LZ4F_encoder>(std::move(fp));
case LZ4_LEGACY:
return new LZ4_encoder(fp);
return make_unique<LZ4_encoder>(std::move(fp));
case GZIP:
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) {
case XZ:
case LZMA:
return new lzma_decoder(fp);
return make_unique<lzma_decoder>(std::move(fp));
case BZIP2:
return new bz_decoder(fp);
return make_unique<bz_decoder>(std::move(fp));
case LZ4:
return new LZ4F_decoder(fp);
return make_unique<LZ4F_decoder>(std::move(fp));
case LZ4_LEGACY:
return new LZ4_decoder(fp);
return make_unique<LZ4_decoder>(std::move(fp));
case GZIP:
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;
FILE *in_fp = in_std ? stdin : xfopen(infile, "re");
unique_ptr<stream> strm;
stream_ptr strm;
char buf[4096];
size_t len;
@ -601,14 +573,14 @@ void decompress(char *infile, const char *outfile) {
}
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 (strm->write(buf, len) < 0)
LOGE("Decompression error!\n");
}
strm->close();
strm.reset(nullptr);
fclose(in_fp);
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");
}
unique_ptr<stream> strm(get_encoder(it->second, out_fp));
auto strm = get_encoder(it->second, make_sFILE(out_fp));
char buf[4096];
size_t len;
@ -651,7 +623,7 @@ void compress(const char *method, const char *infile, const char *outfile) {
LOGE("Compression error!\n");
};
strm->close();
strm.reset(nullptr);
fclose(in_fp);
if (rm_in)

View File

@ -4,7 +4,10 @@
#include "format.h"
filter_stream *get_encoder(format_t type, FILE *fp = nullptr);
filter_stream *get_decoder(format_t type, FILE *fp = nullptr);
stream_ptr get_encoder(format_t type, sFILE &&fp);
stream_ptr get_decoder(format_t type, sFILE &&fp);
void compress(const char *method, const 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;
size_t len;
FILE *fp = open_stream(get_encoder(XZ, open_stream<byte_stream>(data, len)));
dump(fp);
auto strm = make_stream(get_encoder(XZ, make_stream<byte_stream>(data, len)));
dump(strm.release());
entries.clear();
entries.insert(std::move(init));
@ -263,9 +263,10 @@ void magisk_cpio::decompress() {
char *data;
size_t len;
auto strm = get_decoder(XZ, open_stream<byte_stream>(data, len));
strm->write(it->second->data, it->second->filesize);
delete strm;
{
auto strm = get_decoder(XZ, make_stream<byte_stream>(data, len));
strm->write(it->second->data, it->second->filesize);
}
entries.erase(it);
load_cpio(data, len);

View File

@ -174,19 +174,20 @@ int compile_split_cil() {
}
int dump_policydb(const char *file) {
struct policy_file pf;
policy_file_init(&pf);
uint8_t *data;
size_t len;
pf.type = PF_USE_STDIO;
pf.fp = open_stream<byte_stream>(data, len);
if (policydb_write(magisk_policydb, &pf)) {
LOGE("Fail to create policy image\n");
return 1;
{
auto fp = make_stream<byte_stream>(data, len);
struct policy_file pf;
policy_file_init(&pf);
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);
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
sepol_permissive("update_engine");
#ifdef MAGISK_DEBUG
#if 0
// Remove all dontaudit in debug mode
strip_dontaudit();
#endif

View File

@ -109,7 +109,7 @@ bool cpio::exists(const char *name) {
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))
void cpio::dump(FILE *out) {
size_t pos = 0;
@ -142,7 +142,7 @@ void cpio::dump(FILE *out) {
}
// Write trailer
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("TRAILER!!!\0", 11);
out_align();

View File

@ -1,11 +1,17 @@
#pragma once
#include <mntent.h>
#include <functional>
#include <string_view>
#define do_align(p, a) (((p) + (a) - 1) / (a) * (a))
#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 stat st;
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 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 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>
void full_read(const char *filename, T &buf, size_t &size) {

View File

@ -1,18 +1,19 @@
#pragma once
#include <unistd.h>
#include <stdio.h>
#include <memory>
// #include <utils.h>
#include "../files.h"
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>
FILE *open_stream(Args &&... args) {
return open_stream(new T(args...));
sFILE make_stream(Args &&... args) {
return make_stream(stream_ptr(new T(std::forward<Args>(args)...)));
}
class stream {
@ -20,28 +21,25 @@ public:
virtual int read(void *buf, size_t len);
virtual int write(const void *buf, size_t len);
virtual off_t seek(off_t off, int whence);
virtual int close();
virtual ~stream() = default;
};
// Delegates all operations to the base FILE pointer
class filter_stream : public stream {
public:
filter_stream(FILE *fp) : fp(fp) {}
~filter_stream() override { if (fp) close(); }
filter_stream(sFILE &&fp = make_sFILE()) : fp(std::move(fp)) {}
int read(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 >
void set_base(Args&&... args) {
set_base(open_stream<T>(args...));
set_base(make_stream<T>(std::forward<Args>(args)...));
}
protected:
FILE *fp;
sFILE fp;
};
// Handy interface for classes that need custom seek logic
@ -69,7 +67,7 @@ private:
size_t _cap = 0;
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

View File

@ -19,15 +19,13 @@ static fpos_t strm_seek(void *v, fpos_t off, int whence) {
static int strm_close(void *v) {
auto strm = reinterpret_cast<stream *>(v);
int ret = strm->close();
delete strm;
return ret;
return 0;
}
FILE *open_stream(stream *strm) {
FILE *fp = funopen(strm, strm_read, strm_write, strm_seek, strm_close);
// Disable buffering
setbuf(fp, nullptr);
sFILE make_stream(stream_ptr &&strm) {
sFILE fp(funopen(strm.release(), strm_read, strm_write, strm_seek, strm_close), fclose);
setbuf(fp.get(), nullptr);
return fp;
}
@ -46,27 +44,16 @@ off_t stream::seek(off_t off, int whence) {
return -1;
}
int stream::close() {
return 0;
}
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) {
return fwrite(buf, len, 1, fp);
return fwrite(buf, 1, len, fp.get());
}
int filter_stream::close() {
int ret = fclose(fp);
fp = nullptr;
return ret;
}
void filter_stream::set_base(FILE *f) {
if (fp) fclose(fp);
fp = f;
void filter_stream::set_base(sFILE &&f) {
fp = std::move(f);
}
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) {
if (callHandler != null)
return callHandler.call(getContext(), method, arg, extras);
return null;
return Bundle.EMPTY;
}
@Override