Fix custom checkra1n

This commit is contained in:
Nick Chan committed 2024-05-15 02:00:24 +08:00
1 parent 08fbb60538
commit 0e9cd5e1f6
1 file changed
+40 -49
+40 -49
View File
@@ -40,10 +40,6 @@ int exec_checkra1n(void) {
LOG(LOG_INFO, "About to execute checkra1n"); LOG(LOG_INFO, "About to execute checkra1n");
int fd_checkra1n, fd_pongo, ret; int fd_checkra1n, fd_pongo, ret;
char* checkra1n_path = NULL; char* checkra1n_path = NULL;
if (ext_checkra1n != NULL) {
checkra1n_path = ext_checkra1n;
goto checkra1n_exec;
}
#ifndef NO_CUSTOM_PONGO #ifndef NO_CUSTOM_PONGO
if (pongo_path == NULL) { if (pongo_path == NULL) {
pongo_path = malloc(strlen(tmpdir) + 20); pongo_path = malloc(strlen(tmpdir) + 20);
@@ -69,36 +65,40 @@ int exec_checkra1n(void) {
} }
} else external_pongo = true; } else external_pongo = true;
#endif #endif
checkra1n_path = malloc(strlen(tmpdir) + 20); if (ext_checkra1n != NULL) {
if (checkra1n_path == NULL) { checkra1n_path = ext_checkra1n;
LOG(LOG_FATAL, "memory allocation failed\n"); } else {
return -1; checkra1n_path = malloc(strlen(tmpdir) + 20);
} if (checkra1n_path == NULL) {
snprintf(checkra1n_path, strlen(tmpdir) + 20, "%s/checkra1n.XXXXXX", tmpdir); LOG(LOG_FATAL, "memory allocation failed\n");
fd_checkra1n = mkstemp(checkra1n_path); return -1;
if (fd_checkra1n == -1) { }
LOG(LOG_FATAL, "Cannot open temporary file %s: %d (%s)", checkra1n_path, errno, strerror(errno)); snprintf(checkra1n_path, strlen(tmpdir) + 20, "%s/checkra1n.XXXXXX", tmpdir);
free(checkra1n_path); fd_checkra1n = mkstemp(checkra1n_path);
checkra1n_path = NULL; if (fd_checkra1n == -1) {
return -1; LOG(LOG_FATAL, "Cannot open temporary file %s: %d (%s)", checkra1n_path, errno, strerror(errno));
} free(checkra1n_path);
ssize_t didWrite_checkra1n = write(fd_checkra1n, checkra1n, checkra1n_len); checkra1n_path = NULL;
if (didWrite_checkra1n != (ssize_t)checkra1n_len) { return -1;
LOG(LOG_FATAL, "Size written to %s does not match expected: %zd != %" PRIu32 ": %d (%s)", checkra1n_path, didWrite_checkra1n, checkra1n_len, errno, strerror(errno)); }
ssize_t didWrite_checkra1n = write(fd_checkra1n, checkra1n, checkra1n_len);
if (didWrite_checkra1n != (ssize_t)checkra1n_len) {
LOG(LOG_FATAL, "Size written to %s does not match expected: %zd != %" PRIu32 ": %d (%s)", checkra1n_path, didWrite_checkra1n, checkra1n_len, errno, strerror(errno));
close(fd_checkra1n);
unlink(checkra1n_path);
free(checkra1n_path);
checkra1n_path = NULL;
return -1;
}
close(fd_checkra1n); close(fd_checkra1n);
unlink(checkra1n_path); ret = chmod(checkra1n_path, 0700);
free(checkra1n_path); if (ret) {
checkra1n_path = NULL; LOG(LOG_FATAL, "Cannot chmod %s: %d (%s)", checkra1n_path, errno, strerror(errno));
return -1; unlink(checkra1n_path);
} free(checkra1n_path);
close(fd_checkra1n); checkra1n_path = NULL;
ret = chmod(checkra1n_path, 0700); return -1;
if (ret) { }
LOG(LOG_FATAL, "Cannot chmod %s: %d (%s)", checkra1n_path, errno, strerror(errno));
unlink(checkra1n_path);
free(checkra1n_path);
checkra1n_path = NULL;
return -1;
} }
#if defined(__APPLE__) && defined(__arm64__) && (TARGET_OS_IPHONE || defined(FORCE_HELPER)) #if defined(__APPLE__) && defined(__arm64__) && (TARGET_OS_IPHONE || defined(FORCE_HELPER))
char* libcheckra1nhelper_dylib_path = NULL; char* libcheckra1nhelper_dylib_path = NULL;
@@ -146,7 +146,6 @@ setenv_ra1n:
#endif #endif
} }
#endif #endif
checkra1n_exec: {};
char args[0x10] = "-E"; char args[0x10] = "-E";
if ((palerain_flags & palerain_option_demote)) strncat(args, "d", 0xf); if ((palerain_flags & palerain_option_demote)) strncat(args, "d", 0xf);
if (!(palerain_flags & palerain_option_checkrain_is_clone)) { if (!(palerain_flags & palerain_option_checkrain_is_clone)) {
@@ -168,21 +167,13 @@ checkra1n_exec: {};
posix_spawn_file_actions_addopen(&action, 2, "/dev/null", O_WRONLY, 0); posix_spawn_file_actions_addopen(&action, 2, "/dev/null", O_WRONLY, 0);
} }
#endif #endif
if (pongo_path != NULL) { ret = posix_spawn(&pid, checkra1n_path, &action, NULL, (char* []){
ret = posix_spawn(&pid, checkra1n_path, &action, NULL, (char* []){ checkra1n_path,
checkra1n_path, args,
args, "-k",
"-k", pongo_path,
pongo_path, NULL
NULL }, environ);
}, environ);
} else {
ret = posix_spawn(&pid, checkra1n_path, &action, NULL, (char* []){
checkra1n_path,
args,
NULL
}, environ);
}
posix_spawn_file_actions_destroy(&action); posix_spawn_file_actions_destroy(&action);
if (ret) { if (ret) {
LOG(LOG_FATAL, "Cannot posix spawn %s: %d (%s)", checkra1n_path, errno, strerror(errno)); LOG(LOG_FATAL, "Cannot posix spawn %s: %d (%s)", checkra1n_path, errno, strerror(errno));