diff --git a/native/jni/core/bootstages.c b/native/jni/core/bootstages.c index 986156984..7a74c4cf9 100644 --- a/native/jni/core/bootstages.c +++ b/native/jni/core/bootstages.c @@ -534,8 +534,15 @@ void startup() { // Remove some traits of Magisk unlink("/init.magisk.rc"); + // GSIs will have to override /sbin/adbd with /system/bin/adbd + if (access("/sbin/adbd", F_OK) == 0 && access("/system/bin/adbd", F_OK) == 0) { + umount2("/sbin/adbd", MNT_DETACH); + cp_afc("/system/bin/adbd", "/sbin/adbd"); + } + // Create hardlink mirror of /sbin to /root mkdir("/root", 0750); + clone_attr("/sbin", "/root"); full_read("/sbin/magisk", &magisk, &magisk_size); unlink("/sbin/magisk"); full_read("/sbin/magiskinit", &init, &init_size); diff --git a/native/jni/utils/file.c b/native/jni/utils/file.c index 1e4c8e539..fd3f420e3 100644 --- a/native/jni/utils/file.c +++ b/native/jni/utils/file.c @@ -166,7 +166,6 @@ void cp_afc(const char *source, const char *destination) { xmkdirs(destination, a.st.st_mode & 0777); src = xopen(source, O_RDONLY | O_CLOEXEC); dest = xopen(destination, O_RDONLY | O_CLOEXEC); - fsetattr(dest, &a); clone_dir(src, dest); close(src); close(dest); @@ -176,16 +175,15 @@ void cp_afc(const char *source, const char *destination) { src = xopen(source, O_RDONLY); dest = xopen(destination, O_WRONLY | O_CREAT | O_TRUNC); xsendfile(dest, src, NULL, a.st.st_size); - fsetattr(src, &a); close(src); close(dest); } else if (S_ISLNK(a.st.st_mode)) { char buf[PATH_MAX]; xreadlink(source, buf, sizeof(buf)); xsymlink(buf, destination); - setattr(destination, &a); } } + setattr(destination, &a); } void clone_dir(int src, int dest) {