mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-08-14 09:57:29 +00:00
Compare commits
7 Commits
manager-v8
...
manager-v8
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a27e30cf54 | ||
![]() |
79140c7636 | ||
![]() |
1f4c595cd3 | ||
![]() |
b5b62e03af | ||
![]() |
67e2a4720e | ||
![]() |
f5c2d72429 | ||
![]() |
2f5331ab48 |
@@ -15,11 +15,11 @@ Here are some feature highlights:
|
||||
|
||||
## Downloads
|
||||
|
||||
[](https://github.com/topjohnwu/Magisk/releases/download/manager-v8.0.5/MagiskManager-v8.0.5.apk)
|
||||
[](https://github.com/topjohnwu/Magisk/releases/download/manager-v8.0.6/MagiskManager-v8.0.6.apk)
|
||||
[](https://raw.githubusercontent.com/topjohnwu/magisk_files/canary/app-debug.apk)
|
||||
<br>
|
||||
[](https://github.com/topjohnwu/Magisk/releases/tag/v21.2)
|
||||
[](https://github.com/topjohnwu/Magisk/releases/tag/v21.2)
|
||||
[](https://github.com/topjohnwu/Magisk/releases/tag/v21.3)
|
||||
[](https://github.com/topjohnwu/Magisk/releases/tag/v21.3)
|
||||
|
||||
## Useful Links
|
||||
|
||||
|
@@ -361,9 +361,10 @@ abstract class MagiskInstallImpl : KoinComponent {
|
||||
}
|
||||
|
||||
private fun copySepolicyRules(): Boolean {
|
||||
if (Info.remote.magisk.versionCode >= 21100) return true
|
||||
// Copy existing rules for migration
|
||||
"copy_sepolicy_rules".sh()
|
||||
if (Info.remote.magisk.versionCode >= 21100) {
|
||||
// Copy existing rules for migration
|
||||
"copy_sepolicy_rules".sh()
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
|
@@ -1,8 +1,8 @@
|
||||
## v8.0.7
|
||||
|
||||
- Fix sepolicy rule migration when upgrading
|
||||
|
||||
## v8.0.6
|
||||
|
||||
- Minor UI changes
|
||||
- Update internal scripts
|
||||
|
||||
## v8.0.5
|
||||
|
||||
- Fix sepolicy rule copying
|
||||
|
@@ -1,5 +1,4 @@
|
||||
# Magisk Documentation
|
||||
(Updated on 2020.11.13)
|
||||
|
||||
- [Installation Instructions](install.md)
|
||||
- [Frequently Asked Questions](faq.md)
|
||||
|
@@ -1,10 +1,18 @@
|
||||
# Magisk Manager Changelog
|
||||
|
||||
### v8.0.5
|
||||
### v8.0.7
|
||||
|
||||
- Fix sepolicy rule migration when upgrading
|
||||
|
||||
### v8.0.6
|
||||
|
||||
- Minor UI changes
|
||||
- Update internal scripts
|
||||
|
||||
### v8.0.5
|
||||
|
||||
- Fix sepolicy rule copying
|
||||
|
||||
### v8.0.4
|
||||
|
||||
- A lot of stability changes and minor bug fixes
|
||||
|
@@ -1,5 +1,10 @@
|
||||
# Magisk Changelog
|
||||
|
||||
### v21.4
|
||||
|
||||
- [MagiskSU] Fix `su -c` behavior that broke many root apps
|
||||
- [General] Properly handle read/write over sockets (the `broken pipe` issue)
|
||||
|
||||
### v21.3
|
||||
|
||||
- [MagiskInit] Avoid mounting `f2fs` userdata as it may result in kernel crashes. This shall fix a lot of bootloops
|
||||
|
@@ -1,7 +1,14 @@
|
||||
## 2021.1.16 Magisk v21.3
|
||||
## 2021.1.17 Magisk v21.4
|
||||
|
||||
**Update**: v21.4 adds more regression hot fixes.
|
||||
|
||||
Happy 2021! v21.3 adds a workaround for devices with buggy F2FS Linux kernel drivers. This F2FS bug may cause bootloops on many devices. Checkout the full [v21.0 release notes](https://topjohnwu.github.io/Magisk/releases/21000.html) if coming from older releases.
|
||||
|
||||
### v21.4
|
||||
|
||||
- [MagiskSU] Fix `su -c` behavior that broke many root apps
|
||||
- [General] Properly handle read/write over sockets (the `broken pipe` issue)
|
||||
|
||||
### v21.3
|
||||
|
||||
- [MagiskInit] Avoid mounting `f2fs` userdata as it may result in kernel crashes. This shall fix a lot of bootloops
|
@@ -27,6 +27,6 @@ android.injected.testOnly=false
|
||||
kapt.incremental.apt=true
|
||||
|
||||
# Magisk
|
||||
magisk.versionCode=21202
|
||||
magisk.versionCode=21400
|
||||
magisk.ndkVersion=21d
|
||||
magisk.fullNdkVersion=21.3.6528147
|
||||
|
@@ -207,7 +207,7 @@ static int magisk_log(int prio, const char *fmt, va_list ap) {
|
||||
localtime_r(&tv.tv_sec, &tm);
|
||||
size_t len = strftime(buf, sizeof(buf), "%m-%d %T", &tm);
|
||||
int ms = tv.tv_usec / 1000;
|
||||
len += sprintf(buf + len, ".%03d %c : ", ms, type);
|
||||
len += sprintf(buf + len, ".%03d %*d %*d %c : ", ms, 5, getpid(), 5, gettid(), type);
|
||||
strcpy(buf + len, fmt);
|
||||
return vfprintf(local_log_file.get(), buf, args);
|
||||
}
|
||||
|
@@ -105,9 +105,7 @@ int su_client_main(int argc, char *argv[]) {
|
||||
for (int i = optind - 1; i < argc; ++i) {
|
||||
if (!su_req.command.empty())
|
||||
su_req.command += ' ';
|
||||
su_req.command += '\'';
|
||||
su_req.command += argv[i];
|
||||
su_req.command += '\'';
|
||||
}
|
||||
optind = argc;
|
||||
break;
|
||||
|
@@ -1,7 +1,5 @@
|
||||
#include <sched.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
@@ -63,12 +61,24 @@ int xopenat(int dirfd, const char *pathname, int flags, mode_t mode) {
|
||||
return fd;
|
||||
}
|
||||
|
||||
// Write exact same size as count
|
||||
ssize_t xwrite(int fd, const void *buf, size_t count) {
|
||||
int ret = write(fd, buf, count);
|
||||
if (count != ret) {
|
||||
PLOGE("write");
|
||||
size_t write_sz = 0;
|
||||
ssize_t ret;
|
||||
do {
|
||||
ret = write(fd, (byte *) buf + write_sz, count - write_sz);
|
||||
if (ret < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
PLOGE("write");
|
||||
return ret;
|
||||
}
|
||||
write_sz += ret;
|
||||
} while (write_sz != count && ret != 0);
|
||||
if (write_sz != count) {
|
||||
PLOGE("write (%zu != %zu)", count, write_sz);
|
||||
}
|
||||
return ret;
|
||||
return write_sz;
|
||||
}
|
||||
|
||||
// Read error other than EOF
|
||||
@@ -82,11 +92,22 @@ ssize_t xread(int fd, void *buf, size_t count) {
|
||||
|
||||
// Read exact same size as count
|
||||
ssize_t xxread(int fd, void *buf, size_t count) {
|
||||
int ret = read(fd, buf, count);
|
||||
if (count != ret) {
|
||||
PLOGE("read (%zu != %d)", count, ret);
|
||||
size_t read_sz = 0;
|
||||
ssize_t ret;
|
||||
do {
|
||||
ret = read(fd, (byte *) buf + read_sz, count - read_sz);
|
||||
if (ret < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
PLOGE("read");
|
||||
return ret;
|
||||
}
|
||||
read_sz += ret;
|
||||
} while (read_sz != count && ret != 0);
|
||||
if (read_sz != count) {
|
||||
PLOGE("read (%zu != %zu)", count, read_sz);
|
||||
}
|
||||
return ret;
|
||||
return read_sz;
|
||||
}
|
||||
|
||||
int xpipe2(int pipefd[2], int flags) {
|
||||
@@ -242,7 +263,7 @@ ssize_t xrecvmsg(int sockfd, struct msghdr *msg, int flags) {
|
||||
return rec;
|
||||
}
|
||||
|
||||
int xpthread_create(pthread_t *thread, const pthread_attr_t *attr,
|
||||
int xpthread_create(pthread_t *thread, const pthread_attr_t *attr,
|
||||
void *(*start_routine) (void *), void *arg) {
|
||||
errno = pthread_create(thread, attr, start_routine, arg);
|
||||
if (errno) {
|
||||
|
Reference in New Issue
Block a user