diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/SuHandler.kt b/app/src/main/java/com/topjohnwu/magisk/utils/SuHandler.kt index 58c22bb42..c009b2445 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/SuHandler.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/SuHandler.kt @@ -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?) { diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 2ed94706b..7ec7cd11d 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -8,23 +8,26 @@ Registro Configurações Instalar + Versão não suportada do Magisk + 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. Magisk não está instalado - Verificando por atualizações… - Canal de Atualização Inválido - Verificar SafetyNet - Verificando status de SafetyNet… - SafetyNet Verificado Com Sucesso - Erro de SafetyNet API + Procurando por atualizações… + Canal de Atualizações Inválido + Toque para iniciar a verificação do SafetyNet + Verificando o status do SafetyNet… + SafetyNet verificado com sucesso + Erro na API do SafetyNet A resposta é inválida - Magisk atualizado - Gerenciador Magisk atualizado + Magisk está atualizado + Magisk Manager está atualizado Configurações Avançadas Manter encriptação forçada Manter AVB 2.0/dm-verity + Modo Recuperação Instalado: %1$s - Último: %1$s + Mais recente: %1$s Desinstalar Desinstalar o Magisk 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. @@ -62,45 +65,70 @@ Registro de mudanças + + Atualizações do Magisk + Notificações de Progresso + Download completo + Erro ao baixar o aquivo + Mostrar na pasta + Mostrar arquivo + Atualização do Magisk Disponível! + Atualização do Magisk Manager Disponível! + + + Toque para baixar e instalar + Apenas baixar o zip + Instalação direta (Recomendado) + Instalar no Slot Inativo (Após o OTA) + 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? + Selecione o Método + Configuração Adicional + Selecionar e Patchear um Arquivo + Selecione uma imagem raw (*.img) ou um arquivo tar do ODIN (*.tar) + Reiniciando em 5 segundos… + Instalar %1$s - Instalar %1$s agora? + Você quer instalar %1$s agora? Baixar Reiniciar - Nova Atualização do Magisk Disponível! - Reinicie para aplicar as configurações + Reinicie para aplicar as mudanças Notas de lançamento - Cache de repositório limpo - Nova Atualização do Magisk Manager Disponível! - Toque para baixar e instalar - DTBO foi emendado! - Magisk Manager emendou dtbo.img, reinicie - Atualizações do Magisk - Flasheando - Ocultando Magisk Manager… - Falha ao ocultar Magisk Manager… - Baixar Zip Apenas - Instalação Direta (Recomendado) - Instalar no Slot Inativo (Após OTA) - Selecionar Método + Cache do repositório limpo + DTBO foi patcheado! + Magisk Manager foi patcheado para o dtbo.img. Por favor, reinicie. + Flasheando… + Pronto! + Falha + Ocultando o Magisk Manager… + Falha ao ocultar o Magisk Manager. + Nenhum aplicativo encontrado para abrir o link + Aviso Completar Desinstalação Restaurar Imagens - Restauração concluída! - Backup original não existe! + Restaurando… + Restauração completa! + Backup stock não existe! Baixar Código Proprietário - 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? - Erro ao baixar arquivo + 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? + Configuração falhou + Requer configuração adicional + 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? + Executando a configuração do ambiente… + Autenticar Geral Tema Escuro - Ativar tema escuro - Limpar Cache de Repositório - Limpar as informações no cache para repositórios onlines, força o app a reatualizar online + Ativar o tema escuro + Caminho de download + Arquivos serão salvos em %1$s + Limpar cache do repositório + Limpar as informações em cache para repositórios online. Isso força o aplicativo a atualizar online Ocultar Magisk Manager - Reempacotar Magisk Manager com nome de pacote aleatório + Reempacotar o Magisk Manager com nome de pacote e nome do app aleatórios Restaurar Magisk Manager - Restaurar Magisk Manager com pacote original + Restaurar o Magisk Manager com o nome de pacote e nome do app originais Idioma (Padrão do Sistema) Configurações de Atualizações @@ -117,9 +145,13 @@ Hosts sem sistema Suporte de hosts sem sistema para apps de Adblock - Apps e ADB - Apps apenas - ADB apenas + Digite o nome do app desejado + Novo nome + O aplicativo será reempacotado para esse nome + Formato inválido + Aplicativos e ADB + Somente aplicativos + Somente ADB Desativado 10 segundos 15 segundos @@ -132,8 +164,11 @@ Tempo Limite de Solicitação Notificação de Superusuário %1$d segundos - Reautenticar após atualizar - Reautenticar permissões de superusuário após um app atualizar + Reautenticar após uma atualização + Reautenticar permissões de superusuário após a atualização de um aplicativo + Habilitar autenticação biométrica + Usar autenticação biométrica para permitir solicitações de superusuário + Dispositivo não suportado ou nenhuma configuração biométrica está ativada Modo de Multiusuário Proprietário do Dispositivo Apenas @@ -143,18 +178,19 @@ Apenas proprietário pode gerenciar acesso root e receber expedições de solicitações Cada usuário tem suas próprias regras root separadas - Montar Modo de Espaço de Nome - Espaço de Nome Global - Espaço de Nome Herdado - Espaço de Nome Isolado - Todas as sessões root usam montagem de espaço de nome global - As sessões root herdarão espaço de nome de seu solicitante - Cada sessão root terá seu próprio espaço de nome isolado + Modo de montar o namespace + Namespace Global + Herdar Namespace + Namespace isolado + Todas as sessões de root usam a montagem de namespace global + As sessões de root herdarão o namespace do seu solicitante + Cada sessão root terá seu próprio namespace isolado + Erro ao criar pasta. Ele deve estar acessível no diretório raiz do armazenamento e não deve ser um arquivo. Solicitação de Superusuário Negar - Solicitar + Perguntar Conceder Concede acesso total ao seu dispositivo.\nNegue se você não tem certeza! Sempre diff --git a/native/jni/core/daemon.cpp b/native/jni/core/daemon.cpp index 49a22a419..d923b1671 100644 --- a/native/jni/core/daemon.cpp +++ b/native/jni/core/daemon.cpp @@ -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 diff --git a/native/jni/core/db.cpp b/native/jni/core/db.cpp index ce3479f7b..c644e0b7e 100644 --- a/native/jni/core/db.cpp +++ b/native/jni/core/db.cpp @@ -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; diff --git a/native/jni/init/init.cpp b/native/jni/init/init.cpp index e6f632a2b..90d38cd32 100644 --- a/native/jni/init/init.cpp +++ b/native/jni/init/init.cpp @@ -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); diff --git a/native/jni/magiskboot/bootimg.cpp b/native/jni/magiskboot/bootimg.cpp index 1e8d3bffe..93745bb88 100644 --- a/native/jni/magiskboot/bootimg.cpp +++ b/native/jni/magiskboot/bootimg.cpp @@ -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 ptr(get_decoder(type, open_stream(fd))); + auto ptr = get_decoder(type, make_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 ptr(get_encoder(type, open_stream(fd))); - ptr->write(in, size); - ptr->close(); + { + auto strm = get_encoder(type, make_stream(fd)); + strm->write(in, size); + } auto now = lseek(fd, 0, SEEK_CUR); return now - prev; } diff --git a/native/jni/magiskboot/compress.cpp b/native/jni/magiskboot/compress.cpp index 0694766ba..8059aa3d1 100644 --- a/native/jni/magiskboot/compress.cpp +++ b/native/jni/magiskboot/compress.cpp @@ -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(std::move(fp)); case LZMA: - return new lzma_encoder(fp); + return make_unique(std::move(fp)); case BZIP2: - return new bz_encoder(fp); + return make_unique(std::move(fp)); case LZ4: - return new LZ4F_encoder(fp); + return make_unique(std::move(fp)); case LZ4_LEGACY: - return new LZ4_encoder(fp); + return make_unique(std::move(fp)); case GZIP: default: - return new gz_encoder(fp); + return make_unique(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(std::move(fp)); case BZIP2: - return new bz_decoder(fp); + return make_unique(std::move(fp)); case LZ4: - return new LZ4F_decoder(fp); + return make_unique(std::move(fp)); case LZ4_LEGACY: - return new LZ4_decoder(fp); + return make_unique(std::move(fp)); case GZIP: default: - return new gz_decoder(fp); + return make_unique(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 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 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) diff --git a/native/jni/magiskboot/compress.h b/native/jni/magiskboot/compress.h index d3c92e999..bb162455f 100644 --- a/native/jni/magiskboot/compress.h +++ b/native/jni/magiskboot/compress.h @@ -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); diff --git a/native/jni/magiskboot/ramdisk.cpp b/native/jni/magiskboot/ramdisk.cpp index faabde059..798292409 100644 --- a/native/jni/magiskboot/ramdisk.cpp +++ b/native/jni/magiskboot/ramdisk.cpp @@ -244,8 +244,8 @@ void magisk_cpio::compress() { uint8_t *data; size_t len; - FILE *fp = open_stream(get_encoder(XZ, open_stream(data, len))); - dump(fp); + auto strm = make_stream(get_encoder(XZ, make_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(data, len)); - strm->write(it->second->data, it->second->filesize); - delete strm; + { + auto strm = get_decoder(XZ, make_stream(data, len)); + strm->write(it->second->data, it->second->filesize); + } entries.erase(it); load_cpio(data, len); diff --git a/native/jni/magiskpolicy/policydb.cpp b/native/jni/magiskpolicy/policydb.cpp index 717ddf5c3..723fd3876 100644 --- a/native/jni/magiskpolicy/policydb.cpp +++ b/native/jni/magiskpolicy/policydb.cpp @@ -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(data, len); - if (policydb_write(magisk_policydb, &pf)) { - LOGE("Fail to create policy image\n"); - return 1; + { + auto fp = make_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) diff --git a/native/jni/magiskpolicy/rules.cpp b/native/jni/magiskpolicy/rules.cpp index 6ea22e408..ffbc83bfc 100644 --- a/native/jni/magiskpolicy/rules.cpp +++ b/native/jni/magiskpolicy/rules.cpp @@ -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 diff --git a/native/jni/utils/cpio.cpp b/native/jni/utils/cpio.cpp index 76e4ccb5e..a62754f58 100644 --- a/native/jni/utils/cpio.cpp +++ b/native/jni/utils/cpio.cpp @@ -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(); diff --git a/native/jni/utils/files.h b/native/jni/utils/files.h index e23fba6b1..26880258b 100644 --- a/native/jni/utils/files.h +++ b/native/jni/utils/files.h @@ -1,11 +1,17 @@ #pragma once +#include #include #include #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; +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 excl = std::initializer_list()); void clone_dir(int src, int dest, bool overwrite = true); -void parse_mnt(const char *file, const std::function &fn); +void parse_mnt(const char *file, const std::function &fn); template void full_read(const char *filename, T &buf, size_t &size) { diff --git a/native/jni/utils/include/stream.h b/native/jni/utils/include/stream.h index eaed8a144..a07097fce 100644 --- a/native/jni/utils/include/stream.h +++ b/native/jni/utils/include/stream.h @@ -1,18 +1,19 @@ #pragma once -#include #include #include -// #include +#include "../files.h" class stream; -FILE *open_stream(stream *strm); +using stream_ptr = std::unique_ptr; + +sFILE make_stream(stream_ptr &&strm); template -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)...))); } 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 void set_base(Args&&... args) { - set_base(open_stream(args...)); + set_base(make_stream(std::forward(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 diff --git a/native/jni/utils/stream.cpp b/native/jni/utils/stream.cpp index 607b4d026..a0b687578 100644 --- a/native/jni/utils/stream.cpp +++ b/native/jni/utils/stream.cpp @@ -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(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) { diff --git a/shared/src/main/java/com/topjohnwu/magisk/FileProvider.java b/shared/src/main/java/com/topjohnwu/magisk/FileProvider.java index 45c123b9d..820dcad22 100644 --- a/shared/src/main/java/com/topjohnwu/magisk/FileProvider.java +++ b/shared/src/main/java/com/topjohnwu/magisk/FileProvider.java @@ -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