From 2f8c39257152a40e800cc7871ed3fac81ba8e4de Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 28 Apr 2025 09:52:26 +0530 Subject: [PATCH] Cleanup reading of argv from files --- kitty/launcher/cmdline.c | 18 +++++++++--------- kitty/launcher/main.c | 2 +- kitty_tests/datatypes.py | 6 +++++- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/kitty/launcher/cmdline.c b/kitty/launcher/cmdline.c index 81719a228..d2584fe19 100644 --- a/kitty/launcher/cmdline.c +++ b/kitty/launcher/cmdline.c @@ -12,7 +12,6 @@ #include #endif - void free_argv_array(argv_array *a) { if (a && a->needs_free) { @@ -61,10 +60,10 @@ get_argv_from(const char *filename, const char *argv0, argv_array *final_ans) { argv_array ans = {0}; bool ok = false; ans.buf = malloc(src_sz + strlen(argv0) + 64); - if (!ans.buf) { errno = ENOMEM; goto end; } + if (!ans.buf) goto oom; ans.needs_free = true; - if (!add_to_argv(&ans, argv0, strlen(argv0))) goto end; - if (!alloc_shlex_state(&s, src, src_sz, false)) { errno = ENOMEM; goto end; } + if (!add_to_argv(&ans, argv0, strlen(argv0))) goto oom; + if (!alloc_shlex_state(&s, src, src_sz, false)) goto oom; bool keep_going = true; while (keep_going) { ssize_t q = next_word(&s); @@ -73,18 +72,19 @@ get_argv_from(const char *filename, const char *argv0, argv_array *final_ans) { case -2: keep_going = false; break; default: if (ans.count == 1 && strcmp(s.buf, "kitty") == 0) continue; - if (!add_to_argv(&ans, s.buf, q)) { goto end; } + if (!add_to_argv(&ans, s.buf, q)) goto oom; break; } } ok = true; +oom: + if (!ok) { + errno = ENOMEM; + fprintf(stderr, "Failed to read from %s ", filename); perror("with error"); + } end: free(src); dealloc_shlex_state(&s); if (ok) *final_ans = ans; - else { - free_argv_array(&ans); - fprintf(stderr, "Failed to read from %s ", filename); perror("with error"); - } return ok; } diff --git a/kitty/launcher/main.c b/kitty/launcher/main.c index 543857efc..08180281b 100644 --- a/kitty/launcher/main.c +++ b/kitty/launcher/main.c @@ -513,7 +513,6 @@ main(int argc_, char *argv_[], char* envp[]) { RAII_CLISpec(cli_spec); bool handle_fast_commandline_called = delegate_to_kitten_if_possible(argva.count, argva.argv, exe_dir); bool ok = parse_and_check_kitty_cli(&cli_spec, argva.count, argva.argv); - free_argv_array(&argva); if (!ok) return 1; if (!handle_fast_commandline_called) handle_fast_commandline(&cli_spec, NULL, -1); int ret=0; @@ -529,6 +528,7 @@ main(int argc_, char *argv_[], char* envp[]) { }; if (being_tested) output_test_data(&run_data); else ret = run_embedded(&run_data); + free_argv_array(&argva); single_instance_main(-1, NULL, NULL); if (!being_tested) Py_FinalizeEx(); return ret; diff --git a/kitty_tests/datatypes.py b/kitty_tests/datatypes.py index d0fc02890..ef01cac6b 100644 --- a/kitty_tests/datatypes.py +++ b/kitty_tests/datatypes.py @@ -502,7 +502,11 @@ class TestDataTypes(BaseTest): env = os.environ.copy() env['KITTY_CONFIG_DIRECTORY'] = tdir env['KITTY_LAUNCHED_BY_LAUNCH_SERVICES'] = '1' - actual = subprocess.check_output([kitty_exe(), '+runpy', 'import json, sys; print(json.dumps(sys.argv))'], env=env).strip().decode() + cp = subprocess.run([kitty_exe(), '+runpy', 'import json, sys; print(json.dumps(sys.argv))'], env=env, stdout=subprocess.PIPE) + actual = cp.stdout.strip().decode() + if cp.returncode != 0: + print(actual) + raise AssertionError(f'kitty +runpy failed with return code: {cp.returncode}') self.ae('next-line', actual) os.makedirs(tdir + '/good/kitty') open(tdir + '/good/kitty/kitty.conf', 'w').close()