main/rizin: free RzCore on early-exit paths in rz_main_rizin (#6437)

Co-authored-by: Anton Kochkov <anton.kochkov@gmail.com>
This commit is contained in:
NOT XVilka 2026-05-31 01:44:28 +08:00 committed by GitHub
parent b784b167e0
commit 308d53c9f7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -450,9 +450,13 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
#define LISTS_FREE() \
{ \
rz_list_free(cmds); \
cmds = NULL; \
rz_list_free(evals); \
evals = NULL; \
rz_list_free(files); \
files = NULL; \
rz_list_free(prefiles); \
prefiles = NULL; \
}
bool stderr2stdout = false;
@ -499,6 +503,8 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
if (argc == 2 && !strcmp(argv[1], "-H")) {
main_print_var(r, NULL);
LISTS_FREE();
rz_core_task_sync_end(&r->tasks);
rz_core_free(r);
return 0;
}
@ -565,7 +571,8 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
#else
case 'd':
RZ_LOG_ERROR("Sorry. No debugger backend available.\n");
return 1;
ret = 1;
goto beach;
#endif
case 'D': {
debug = 2;
@ -578,8 +585,8 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
rz_cmd_state_output_print(&state);
rz_cmd_state_output_fini(&state);
rz_cons_flush();
LISTS_FREE();
return 0;
ret = 0;
goto beach;
}
break;
}
@ -629,8 +636,8 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
break;
case 'H':
main_print_var(r, opt.arg);
LISTS_FREE();
return 0;
ret = 0;
goto beach;
case 'i':
if (RZ_STR_ISEMPTY(opt.arg)) {
RZ_LOG_ERROR("Cannot open empty script path\n");
@ -716,16 +723,19 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
LISTS_FREE();
RZ_FREE(debugbackend);
free(customRarunProfile);
return 0;
ret = 0;
goto beach;
} else {
rz_main_version_verify(0);
LISTS_FREE();
RZ_FREE(debugbackend);
free(customRarunProfile);
return rz_main_version_print(r->sys_path, "rizin");
ret = rz_main_version_print(r->sys_path, "rizin");
goto beach;
}
case 'V':
return rz_main_version_verify(1);
ret = rz_main_version_verify(1);
goto beach;
case 'w':
perms |= RZ_PERM_W;
break;
@ -741,14 +751,16 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
RZ_LOG_ERROR("stderr2stdout: Failed to dup2 stderr\n");
LISTS_FREE();
RZ_FREE(debugbackend);
return 1;
ret = 1;
goto beach;
}
if (noStderr) {
if (-1 == close(2)) {
RZ_LOG_ERROR("Failed to close stderr\n");
LISTS_FREE();
RZ_FREE(debugbackend);
return 1;
ret = 1;
goto beach;
}
const char nul[] = RZ_SYS_DEVNULL;
int new_stderr = open(nul, O_RDWR);
@ -756,20 +768,23 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
RZ_LOG_ERROR("Failed to open %s\n", nul);
LISTS_FREE();
RZ_FREE(debugbackend);
return 1;
ret = 1;
goto beach;
}
if (2 != new_stderr) {
if (-1 == dup2(new_stderr, 2)) {
RZ_LOG_ERROR("Failed to dup2 stderr\n");
LISTS_FREE();
RZ_FREE(debugbackend);
return 1;
ret = 1;
goto beach;
}
if (-1 == close(new_stderr)) {
RZ_LOG_ERROR("Failed to close %s\n", nul);
LISTS_FREE();
RZ_FREE(debugbackend);
return 1;
ret = 1;
goto beach;
}
}
}
@ -819,16 +834,18 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
rz_cmd_state_output_fini(&state);
rz_cons_flush();
LISTS_FREE();
free(pfile);
RZ_FREE(pfile);
RZ_FREE(debugbackend);
return 0;
ret = 0;
goto beach;
}
if (help > 0) {
LISTS_FREE();
free(pfile);
RZ_FREE(pfile);
RZ_FREE(debugbackend);
return main_help(r, help > 1 ? 2 : 0);
ret = main_help(r, help > 1 ? 2 : 0);
goto beach;
}
if (customRarunProfile) {
char *tfn = rz_file_temp(".rz-run");
@ -845,7 +862,8 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
RZ_LOG_ERROR("Missing argument for -d\n");
LISTS_FREE();
RZ_FREE(debugbackend);
return 1;
ret = 1;
goto beach;
}
const char *src = haveRarunProfile ? pfile : argv[opt.ind];
if (src && *src) {
@ -892,7 +910,8 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
RZ_LOG_ERROR("Missing URI for -C\n");
LISTS_FREE();
RZ_FREE(debugbackend);
return 1;
ret = 1;
goto beach;
}
if (strstr(uri, "://")) {
rz_core_rtr_add(r, uri);
@ -926,16 +945,18 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
if (debug) {
RZ_LOG_ERROR("Error: Cannot debug directories, yet.\n");
LISTS_FREE();
free(pfile);
RZ_FREE(pfile);
RZ_FREE(debugbackend);
return 1;
ret = 1;
goto beach;
}
if (rz_sys_chdir(argv[opt.ind])) {
RZ_LOG_ERROR("[d] Cannot open directory\n");
LISTS_FREE();
free(pfile);
RZ_FREE(pfile);
RZ_FREE(debugbackend);
return 1;
ret = 1;
goto beach;
}
} else if (argv[opt.ind] && !strcmp(argv[opt.ind], "-")) {
int sz;
@ -943,7 +964,8 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
int result = _setmode(_fileno(stdin), _O_BINARY);
if (result == -1) {
RZ_LOG_ERROR("Cannot set stdin to binary mode\n");
return 1;
ret = 1;
goto beach;
}
#endif
/* stdin/batch mode */
@ -971,7 +993,8 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
RZ_LOG_ERROR("[=] Cannot open '%s'\n", path);
LISTS_FREE();
free(path);
return 1;
ret = 1;
goto beach;
}
rz_io_map_new(r->io, fh->fd, 7, 0LL, mapaddr,
rz_io_fd_size(r->io, fh->fd));
@ -995,8 +1018,8 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
} else {
RZ_LOG_ERROR("Cannot slurp from stdin\n");
free(buf);
LISTS_FREE();
return 1;
ret = 1;
goto beach;
}
} else if (has_file_arg(argc, argv, &opt)) {
if (debug) {
@ -1010,7 +1033,8 @@ RZ_API int rz_main_rizin(int argc, const char **argv) {
RZ_LOG_ERROR("No program given to -d\n");
LISTS_FREE();
RZ_FREE(debugbackend);
return 1;
ret = 1;
goto beach;
}
if (debug == 2) {
// autodetect backend with -D