From b4c1ec891d2bd89e611740f82b030a1917b67a43 Mon Sep 17 00:00:00 2001
From: Eric Daigle <eric.daigle@mailbox.org>
Date: Thu, 8 Feb 2024 23:09:34 -0800
Subject: [PATCH 0301/1160] firstboot: validate keymap entry
As described in #30940, systemd-firstboot currently does not perform
any validation on keymap entry, allowing nonexistent keymaps to be
written to /etc/vconsole.conf. This commit adds validation checks
based on those already performed on locale entry, preventing invalid
keymaps from being set.
Closes #30940
m
(cherry picked from commit 321a8c595e3470a0fe9002014656eee6a50b9553)
src/firstboot/firstboot.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
@@ -456,6 +456,20 @@ static int process_locale(int rfd) {
return 1;
}
+static bool keymap_exists_bool(const char *name) {
+ return keymap_exists(name) > 0;
+}
+
+static typeof(&keymap_is_valid) determine_keymap_validity_func(int rfd) {
+ int r;
+
+ r = dir_fd_is_root(rfd);
+ if (r < 0)
+ log_debug_errno(r, "Unable to determine if operating on host root directory, assuming we are: %m");
+
+ return r != 0 ? keymap_exists_bool : keymap_is_valid;
+}
+
static int prompt_keymap(int rfd) {
_cleanup_strv_free_ char **kmaps = NULL;
int r;
@@ -487,7 +501,7 @@ static int prompt_keymap(int rfd) {
print_welcome(rfd);
return prompt_loop("Please enter system keymap name or number",
- kmaps, 60, keymap_is_valid, &arg_keymap);
+ kmaps, 60, determine_keymap_validity_func(rfd), &arg_keymap);
}
static int process_keymap(int rfd) {
@@ -1694,6 +1708,8 @@ static int run(int argc, char *argv[]) {
/* We check these conditions here instead of in parse_argv() so that we can take the root directory
* into account. */
+ if (arg_keymap && !determine_keymap_validity_func(rfd)(arg_keymap))
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Keymap %s is not installed.", arg_keymap);
if (arg_locale && !locale_is_ok(rfd, arg_locale))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Locale %s is not installed.", arg_locale);
if (arg_locale_messages && !locale_is_ok(rfd, arg_locale_messages))
--
2.33.0