From a688e5fefd91859af1f5e847b6d83634eaf79063 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Wed, 8 May 2024 18:12:35 +0800 Subject: [PATCH 1/6] ssh-generator: fix pointer cast type --- src/ssh-generator/ssh-generator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ssh-generator/ssh-generator.c b/src/ssh-generator/ssh-generator.c index 3b9987b581..c671b41703 100644 --- a/src/ssh-generator/ssh-generator.c +++ b/src/ssh-generator/ssh-generator.c @@ -400,7 +400,7 @@ static int parse_credentials(void) { size_t sz = 0; int r; - r = read_credential_with_decryption("ssh.listen", (void*) &b, &sz); + r = read_credential_with_decryption("ssh.listen", (void**) &b, &sz); if (r <= 0) return r; From b5636a8f83ec5b181760da7e3ab7cabc4dc4f7f8 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Wed, 8 May 2024 17:57:28 +0800 Subject: [PATCH 2/6] debug-generator: enclose function call in if statement when retval is not used --- src/debug-generator/debug-generator.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/debug-generator/debug-generator.c b/src/debug-generator/debug-generator.c index 3526b84dee..fdc2afed3a 100644 --- a/src/debug-generator/debug-generator.c +++ b/src/debug-generator/debug-generator.c @@ -49,8 +49,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat if (r < 0) return log_error_errno(r, "Failed to glob unit name: %m"); - r = strv_consume(&arg_mask, n); - if (r < 0) + if (strv_consume(&arg_mask, n) < 0) return log_oom(); } else if (streq(key, "systemd.wants")) { @@ -63,11 +62,11 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat if (r < 0) return log_error_errno(r, "Failed to glob unit name: %m"); - r = strv_consume(&arg_wants, n); - if (r < 0) + if (strv_consume(&arg_wants, n) < 0) return log_oom(); } else if (proc_cmdline_key_streq(key, "systemd.debug_shell")) { + r = value ? parse_boolean(value) : 1; arg_debug_shell = r != 0; if (r >= 0) @@ -76,6 +75,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat return free_and_strdup_warn(&arg_debug_tty, skip_dev_prefix(value)); } else if (proc_cmdline_key_streq(key, "systemd.default_debug_tty")) { + if (proc_cmdline_value_missing(key, value)) return 0; @@ -239,8 +239,7 @@ static int run(const char *dest, const char *dest_early, const char *dest_late) log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m"); if (arg_debug_shell) { - r = strv_extend(&arg_wants, "debug-shell.service"); - if (r < 0) + if (strv_extend(&arg_wants, "debug-shell.service") < 0) return log_oom(); install_debug_shell_dropin(); From 221bad60078cd217e1235eea315ba82622903342 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Wed, 8 May 2024 18:05:15 +0800 Subject: [PATCH 3/6] debug-generator: use RET_GATHER where appropriate --- src/debug-generator/debug-generator.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/debug-generator/debug-generator.c b/src/debug-generator/debug-generator.c index fdc2afed3a..c39eb63394 100644 --- a/src/debug-generator/debug-generator.c +++ b/src/debug-generator/debug-generator.c @@ -110,9 +110,7 @@ static int generate_mask_symlinks(void) { return log_oom(); if (symlink("/dev/null", p) < 0) - r = log_error_errno(errno, - "Failed to create mask symlink %s: %m", - p); + RET_GATHER(r, log_error_errno(errno, "Failed to create mask symlink '%s': %m", p)); } return r; @@ -137,9 +135,7 @@ static int generate_wants_symlinks(void) { if (!f) return log_oom(); - r = generator_add_symlink(arg_dest, target, "wants", f); - if (r < 0) - return r; + RET_GATHER(r, generator_add_symlink(arg_dest, target, "wants", f)); } return r; From 2997df97778acfb99995611de1073ccc205dd921 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Wed, 8 May 2024 18:41:54 +0800 Subject: [PATCH 4/6] debug-generator: drop unneeded empty_to_root --- src/debug-generator/debug-generator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/debug-generator/debug-generator.c b/src/debug-generator/debug-generator.c index c39eb63394..5a18068e26 100644 --- a/src/debug-generator/debug-generator.c +++ b/src/debug-generator/debug-generator.c @@ -105,7 +105,7 @@ static int generate_mask_symlinks(void) { STRV_FOREACH(u, arg_mask) { _cleanup_free_ char *p = NULL; - p = path_join(empty_to_root(arg_dest), *u); + p = path_join(arg_dest, *u); if (!p) return log_oom(); From a3816ea4278d8d57dc62a1c12f20da71add73732 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Wed, 8 May 2024 18:13:29 +0800 Subject: [PATCH 5/6] debug-generator: don't eat up error if we can't write drop-in While at it, prepend the drop-in text with our usual "Automatically generated by ...". --- src/debug-generator/debug-generator.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/debug-generator/debug-generator.c b/src/debug-generator/debug-generator.c index 5a18068e26..eeefed0eef 100644 --- a/src/debug-generator/debug-generator.c +++ b/src/debug-generator/debug-generator.c @@ -141,22 +141,25 @@ static int generate_wants_symlinks(void) { return r; } -static void install_debug_shell_dropin(void) { +static int install_debug_shell_dropin(void) { const char *tty = arg_debug_tty ?: arg_default_debug_tty; int r; if (!tty || path_equal(tty, skip_dev_prefix(DEBUGTTY))) - return; + return 0; r = write_drop_in_format(arg_dest, "debug-shell.service", 50, "tty", - "[Unit]\n" - "Description=Early root shell on /dev/%s FOR DEBUGGING ONLY\n" - "ConditionPathExists=\n" - "[Service]\n" - "TTYPath=/dev/%s", - tty, tty); + "# Automatically generated by systemd-debug-generator\n\n" + "[Unit]\n" + "Description=Early root shell on /dev/%s FOR DEBUGGING ONLY\n" + "ConditionPathExists=\n" + "\n[Service]\n" + "TTYPath=/dev/%s\n", + tty, tty); if (r < 0) - log_warning_errno(r, "Failed to write drop-in for debug-shell.service, ignoring: %m"); + return log_warning_errno(r, "Failed to write drop-in for debug-shell.service: %m"); + + return 1; } static int process_unit_credentials(const char *credentials_dir) { @@ -226,7 +229,7 @@ static int process_unit_credentials(const char *credentials_dir) { static int run(const char *dest, const char *dest_early, const char *dest_late) { const char *credentials_dir; - int r = 0; + int r; assert_se(arg_dest = dest_early); @@ -238,7 +241,7 @@ static int run(const char *dest, const char *dest_early, const char *dest_late) if (strv_extend(&arg_wants, "debug-shell.service") < 0) return log_oom(); - install_debug_shell_dropin(); + RET_GATHER(r, install_debug_shell_dropin()); } if (get_credentials_dir(&credentials_dir) >= 0) From f9e2b42b16b97e1a60a58a49310a86768e45d79f Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Wed, 8 May 2024 18:18:33 +0800 Subject: [PATCH 6/6] debug-generator: clean up logging and such for units passed from creds --- src/debug-generator/debug-generator.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/debug-generator/debug-generator.c b/src/debug-generator/debug-generator.c index eeefed0eef..1b14f1222a 100644 --- a/src/debug-generator/debug-generator.c +++ b/src/debug-generator/debug-generator.c @@ -163,17 +163,16 @@ static int install_debug_shell_dropin(void) { } static int process_unit_credentials(const char *credentials_dir) { + _cleanup_free_ DirectoryEntries *des = NULL; int r; assert(credentials_dir); - _cleanup_free_ DirectoryEntries *des = NULL; r = readdir_all_at(AT_FDCWD, credentials_dir, RECURSE_DIR_SORT|RECURSE_DIR_IGNORE_DOT|RECURSE_DIR_ENSURE_TYPE, &des); if (r < 0) return log_error_errno(r, "Failed to enumerate credentials from credentials directory '%s': %m", credentials_dir); FOREACH_ARRAY(i, des->entries, des->n_entries) { - _cleanup_free_ void *d = NULL; struct dirent *de = *i; const char *unit, *dropin; @@ -192,9 +191,13 @@ static int process_unit_credentials(const char *credentials_dir) { continue; } - r = read_credential_with_decryption(de->d_name, &d, NULL); - if (r < 0) + _cleanup_free_ char *d = NULL; + + r = read_credential_with_decryption(de->d_name, (void**) &d, NULL); + if (r < 0) { + log_warning_errno(r, "Failed to read credential '%s', ignoring: %m", de->d_name); continue; + } if (unit) { _cleanup_free_ char *p = NULL; @@ -212,7 +215,7 @@ static int process_unit_credentials(const char *credentials_dir) { log_debug("Wrote unit file '%s' from credential '%s'", unit, de->d_name); - } else { + } else if (dropin) { r = write_drop_in(arg_dest, dropin, 50, "credential", d); if (r < 0) { log_warning_errno(r, "Failed to write drop-in for unit '%s' from credential '%s', ignoring: %m", @@ -221,7 +224,8 @@ static int process_unit_credentials(const char *credentials_dir) { } log_debug("Wrote drop-in for unit '%s' from credential '%s'", dropin, de->d_name); - } + } else + assert_not_reached(); } return 0;