Skip to content

Commit 0d60dc0

Browse files
committed
fix: ReZygiskd sending data to closed fd
This commit fixes an issue where ReZygiskd would use, in a forked child, the fd that was meant for the parent to use, and vice-versa, causing issues.
1 parent d696160 commit 0d60dc0

1 file changed

Lines changed: 49 additions & 35 deletions

File tree

zygiskd/src/utils.c

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -729,70 +729,81 @@ int save_mns_fd(int pid, enum MountNamespaceState mns_state, struct root_impl im
729729
return -1;
730730
}
731731

732-
int reader = sockets[0];
733-
int writer = sockets[1];
732+
int socket_parent = sockets[0];
733+
int socket_child = sockets[1];
734734

735735
pid_t fork_pid = fork();
736736
if (fork_pid < 0) {
737737
LOGE("fork: %s\n", strerror(errno));
738738

739-
if (close(reader) == -1) {
740-
LOGE("Failed to close reader: %s\n", strerror(errno));
741-
}
739+
if (close(socket_parent) == -1)
740+
LOGE("Failed to close socket_parent: %s\n", strerror(errno));
742741

743-
if (close(writer) == -1) {
744-
LOGE("Failed to close writer: %s\n", strerror(errno));
745-
}
742+
if (close(socket_child) == -1)
743+
LOGE("Failed to close socket_child: %s\n", strerror(errno));
746744

747745
return -1;
748746
}
749747

750748
if (fork_pid == 0) {
751-
close(reader);
749+
close(socket_parent);
752750

753751
if (switch_mount_namespace(pid) == false) {
754752
LOGE("Failed to switch mount namespace\n");
755753

756-
write_uint8_t(writer, (uint8_t)false);
754+
if (write_uint8_t(socket_child, 0) == -1)
755+
LOGE("Failed to write to socket_child: %s\n", strerror(errno));
757756

758-
close(writer);
759-
760-
_exit(1);
757+
goto finalize_mns_fork;
761758
}
762759

763760
if (mns_state == Clean) {
764761
unshare(CLONE_NEWNS);
765762

766763
if (!umount_root(impl)) {
767-
LOGE("Failed to umount root");
764+
LOGE("Failed to umount root\n");
768765

769-
write_uint8_t(writer, false);
766+
if (write_uint8_t(socket_child, 0) == -1)
767+
LOGE("Failed to write to socket_child: %s\n", strerror(errno));
770768

771-
close(writer);
772-
773-
_exit(1);
769+
goto finalize_mns_fork;
774770
}
775771
}
776772

777-
write_uint8_t(writer, true);
773+
if (write_uint8_t(socket_child, 1) == -1) {
774+
LOGE("Failed to write to socket_child: %s\n", strerror(errno));
775+
776+
close(socket_child);
777+
778+
_exit(1);
779+
}
778780

779-
/* INFO: Just a delay for the original process to open ns mnt */
780781
uint8_t has_opened = 0;
781-
read_uint8_t(reader, &has_opened);
782+
if (read_uint8_t(socket_child, &has_opened) == -1)
783+
LOGE("Failed to read from socket_child: %s\n", strerror(errno));
782784

783-
close(writer);
785+
finalize_mns_fork:
786+
if (close(socket_child) == -1)
787+
LOGE("Failed to close socket_child: %s\n", strerror(errno));
784788

785-
_exit(0);
789+
_exit(0);
786790
}
787791

788-
bool has_succeeded = true;
789-
read_uint8_t(reader, (uint8_t *)&has_succeeded);
792+
close(socket_child);
793+
794+
uint8_t has_succeeded = 0;
795+
if (read_uint8_t(socket_parent, &has_succeeded) == -1) {
796+
LOGE("Failed to read from socket_parent: %s\n", strerror(errno));
797+
798+
close(socket_parent);
799+
800+
return -1;
801+
}
790802

791803
if (!has_succeeded) {
792-
LOGE("Failed to unmount root\n");
804+
LOGE("Failed to umount root\n");
793805

794-
close(reader);
795-
close(writer);
806+
close(socket_parent);
796807

797808
return -1;
798809
}
@@ -804,22 +815,25 @@ int save_mns_fd(int pid, enum MountNamespaceState mns_state, struct root_impl im
804815
if (ns_fd == -1) {
805816
LOGE("open: %s\n", strerror(errno));
806817

807-
close(reader);
808-
close(writer);
818+
close(socket_parent);
809819

810820
return -1;
811821
}
812822

813-
write_uint8_t(writer, has_succeeded);
823+
uint8_t opened_signal = 1;
824+
if (write_uint8_t(socket_parent, opened_signal) == -1) {
825+
LOGE("Failed to write to socket_parent: %s\n", strerror(errno));
814826

815-
if (close(reader) == -1) {
816-
LOGE("Failed to close reader: %s\n", strerror(errno));
827+
close(ns_fd);
828+
close(socket_parent);
817829

818830
return -1;
819831
}
820832

821-
if (close(writer) == -1) {
822-
LOGE("Failed to close writer: %s\n", strerror(errno));
833+
if (close(socket_parent) == -1) {
834+
LOGE("Failed to close socket_parent: %s\n", strerror(errno));
835+
836+
close(ns_fd);
823837

824838
return -1;
825839
}

0 commit comments

Comments
 (0)