vconsole: reject empty layout during keymap conversion with error

A leading-dash console keymap or leading-comma X11 layout can produce an
empty layout while converting between the two formats. find_converted_keymap()
then asserts on it, allowing malformed input to abort callers such as localed.

Return EINVAL for an empty derived layout instead.

Follow-up for 6d0f502736
This commit is contained in:
Luca Boccassi
2026-07-10 17:59:24 +01:00
parent fea9a64432
commit 57db794b9d
2 changed files with 13 additions and 1 deletions

View File

@@ -79,6 +79,11 @@ TEST(vconsole_convert_to_x11) {
ASSERT_OK(vconsole_convert_to_x11(&vc, x11_context_verify, &xc));
ASSERT_TRUE(x11_context_isempty(&xc));
log_info("/* test leading-dash keymap */");
ASSERT_OK(free_and_strdup(&vc.keymap, "-foo"));
ASSERT_ERROR(vconsole_convert_to_x11(&vc, x11_context_verify, &xc), EINVAL);
ASSERT_TRUE(x11_context_isempty(&xc));
log_info("/* test without variant, new mapping (es:) */");
ASSERT_OK(free_and_strdup(&vc.keymap, "es"));
ASSERT_OK(vconsole_convert_to_x11(&vc, x11_context_verify, &xc));
@@ -148,6 +153,11 @@ TEST(x11_convert_to_vconsole) {
ASSERT_OK(x11_convert_to_vconsole(&xc, &vc));
ASSERT_TRUE(vc_context_isempty(&vc));
log_info("/* test leading-comma layout */");
ASSERT_OK(free_and_strdup(&xc.layout, ",us"));
ASSERT_ERROR(x11_convert_to_vconsole(&xc, &vc), EINVAL);
ASSERT_TRUE(vc_context_isempty(&vc));
log_info("/* test without variant, new mapping (es:) */");
ASSERT_OK(free_and_strdup(&xc.layout, "es"));
ASSERT_OK(x11_convert_to_vconsole(&xc, &vc));

View File

@@ -352,9 +352,11 @@ int find_converted_keymap(const X11Context *xc, char **ret) {
int r;
assert(xc);
assert(!isempty(xc->layout));
assert(ret);
if (isempty(xc->layout))
return -EINVAL;
if (xc->variant)
n = strjoin(xc->layout, "-", xc->variant);
else