From 73e44d810471ba64aaa6017b00945f4756e20256 Mon Sep 17 00:00:00 2001 From: Red Bear OS Date: Wed, 8 Jul 2026 21:44:47 +0300 Subject: [PATCH] inputd: apply upstream e8f1b1a8 (control-char filter) and c3789b4e (write assert) - e8f1b1a8 'Do not send TextInputEvent for control characters': set K_ESC, K_BKSP, K_ENTER to '\0' in all keymaps (US, GB, Dvorak, Azerty, Bepo, IT). Control characters are now produced via fbcond's scancode handler (0x1C -> \n, 0x0E -> \x7F) instead of via the character field. This pairs with the fbcond 0x1C Enter fix. - c3789b4e 'only perform a single write and assert the amount written': add assertion in write_event that the kernel returned the full expected byte count. Prevents silent short writes in the input event path. Per Phase 1.1 of local/docs/SYSTEM-STABILITY-AND-UPSTREAM-SYNC-PLAN.md. --- drivers/inputd/src/keymap.rs | 36 ++++++++++++++++++------------------ drivers/inputd/src/lib.rs | 4 +++- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/drivers/inputd/src/keymap.rs b/drivers/inputd/src/keymap.rs index ca69e46e90..ee05fdcd30 100644 --- a/drivers/inputd/src/keymap.rs +++ b/drivers/inputd/src/keymap.rs @@ -4,7 +4,7 @@ use std::str::FromStr; mod keymaps { pub static US: [(u8, [char; 2]); 53] = [ - (orbclient::K_ESC, ['\x1B', '\x1B']), + (orbclient::K_ESC, ['\0', '\0']), (orbclient::K_1, ['1', '!']), (orbclient::K_2, ['2', '@']), (orbclient::K_3, ['3', '#']), @@ -17,7 +17,7 @@ mod keymaps { (orbclient::K_0, ['0', ')']), (orbclient::K_MINUS, ['-', '_']), (orbclient::K_EQUALS, ['=', '+']), - (orbclient::K_BKSP, ['\x7F', '\x7F']), + (orbclient::K_BKSP, ['\0', '\0']), (orbclient::K_TAB, ['\t', '\t']), (orbclient::K_Q, ['q', 'Q']), (orbclient::K_W, ['w', 'W']), @@ -31,7 +31,7 @@ mod keymaps { (orbclient::K_P, ['p', 'P']), (orbclient::K_BRACE_OPEN, ['[', '{']), (orbclient::K_BRACE_CLOSE, [']', '}']), - (orbclient::K_ENTER, ['\n', '\n']), + (orbclient::K_ENTER, ['\0', '\0']), (orbclient::K_CTRL, ['\0', '\0']), (orbclient::K_A, ['a', 'A']), (orbclient::K_S, ['s', 'S']), @@ -60,7 +60,7 @@ mod keymaps { ]; pub static GB: [(u8, [char; 2]); 54] = [ - (orbclient::K_ESC, ['\x1B', '\x1B']), + (orbclient::K_ESC, ['\0', '\0']), (orbclient::K_1, ['1', '!']), (orbclient::K_2, ['2', '"']), (orbclient::K_3, ['3', '£']), @@ -73,7 +73,7 @@ mod keymaps { (orbclient::K_0, ['0', ')']), (orbclient::K_MINUS, ['-', '_']), (orbclient::K_EQUALS, ['=', '+']), - (orbclient::K_BKSP, ['\x7F', '\x7F']), + (orbclient::K_BKSP, ['\0', '\0']), (orbclient::K_TAB, ['\t', '\t']), (orbclient::K_Q, ['q', 'Q']), (orbclient::K_W, ['w', 'W']), @@ -87,7 +87,7 @@ mod keymaps { (orbclient::K_P, ['p', 'P']), (orbclient::K_BRACE_OPEN, ['[', '{']), (orbclient::K_BRACE_CLOSE, [']', '}']), - (orbclient::K_ENTER, ['\n', '\n']), + (orbclient::K_ENTER, ['\0', '\0']), (orbclient::K_CTRL, ['\0', '\0']), (orbclient::K_A, ['a', 'A']), (orbclient::K_S, ['s', 'S']), @@ -118,7 +118,7 @@ mod keymaps { ]; pub static DVORAK: [(u8, [char; 2]); 53] = [ - (orbclient::K_ESC, ['\x1B', '\x1B']), + (orbclient::K_ESC, ['\0', '\0']), (orbclient::K_1, ['1', '!']), (orbclient::K_2, ['2', '@']), (orbclient::K_3, ['3', '#']), @@ -131,7 +131,7 @@ mod keymaps { (orbclient::K_0, ['0', ')']), (orbclient::K_MINUS, ['[', '{']), (orbclient::K_EQUALS, [']', '}']), - (orbclient::K_BKSP, ['\x7F', '\x7F']), + (orbclient::K_BKSP, ['\0', '\0']), (orbclient::K_TAB, ['\t', '\t']), (orbclient::K_Q, ['\'', '"']), (orbclient::K_W, [',', '<']), @@ -145,7 +145,7 @@ mod keymaps { (orbclient::K_P, ['l', 'L']), (orbclient::K_BRACE_OPEN, ['/', '?']), (orbclient::K_BRACE_CLOSE, ['=', '+']), - (orbclient::K_ENTER, ['\n', '\n']), + (orbclient::K_ENTER, ['\0', '\0']), (orbclient::K_CTRL, ['\0', '\0']), (orbclient::K_A, ['a', 'A']), (orbclient::K_S, ['o', 'O']), @@ -174,7 +174,7 @@ mod keymaps { ]; pub static AZERTY: [(u8, [char; 2]); 53] = [ - (orbclient::K_ESC, ['\x1B', '\x1B']), + (orbclient::K_ESC, ['\0', '\0']), (orbclient::K_1, ['&', '1']), (orbclient::K_2, ['é', '2']), (orbclient::K_3, ['"', '3']), @@ -187,7 +187,7 @@ mod keymaps { (orbclient::K_0, ['à', '0']), (orbclient::K_MINUS, [')', '°']), (orbclient::K_EQUALS, ['=', '+']), - (orbclient::K_BKSP, ['\x7F', '\x7F']), + (orbclient::K_BKSP, ['\0', '\0']), (orbclient::K_TAB, ['\t', '\t']), (orbclient::K_Q, ['a', 'A']), (orbclient::K_W, ['z', 'Z']), @@ -201,7 +201,7 @@ mod keymaps { (orbclient::K_P, ['p', 'P']), (orbclient::K_BRACE_OPEN, ['^', '¨']), (orbclient::K_BRACE_CLOSE, ['$', '£']), - (orbclient::K_ENTER, ['\n', '\n']), + (orbclient::K_ENTER, ['\0', '\0']), (orbclient::K_CTRL, ['\0', '\0']), (orbclient::K_A, ['q', 'Q']), (orbclient::K_S, ['s', 'S']), @@ -230,7 +230,7 @@ mod keymaps { ]; pub static BEPO: [(u8, [char; 2]); 53] = [ - (orbclient::K_ESC, ['\x1B', '\x1B']), + (orbclient::K_ESC, ['\0', '\0']), (orbclient::K_1, ['"', '1']), (orbclient::K_2, ['«', '2']), (orbclient::K_3, ['»', '3']), @@ -243,7 +243,7 @@ mod keymaps { (orbclient::K_0, ['*', '0']), (orbclient::K_MINUS, ['=', '°']), (orbclient::K_EQUALS, ['%', '`']), - (orbclient::K_BKSP, ['\x7F', '\x7F']), + (orbclient::K_BKSP, ['\0', '\0']), (orbclient::K_TAB, ['\t', '\t']), (orbclient::K_Q, ['b', 'B']), (orbclient::K_W, ['é', 'É']), @@ -257,7 +257,7 @@ mod keymaps { (orbclient::K_P, ['j', 'J']), (orbclient::K_BRACE_OPEN, ['z', 'Z']), (orbclient::K_BRACE_CLOSE, ['w', 'W']), - (orbclient::K_ENTER, ['\n', '\n']), + (orbclient::K_ENTER, ['\0', '\0']), (orbclient::K_CTRL, ['\0', '\0']), (orbclient::K_A, ['a', 'A']), (orbclient::K_S, ['u', 'U']), @@ -286,7 +286,7 @@ mod keymaps { ]; pub static IT: [(u8, [char; 2]); 53] = [ - (orbclient::K_ESC, ['\x1B', '\x1B']), + (orbclient::K_ESC, ['\0', '\0']), (orbclient::K_1, ['1', '!']), (orbclient::K_2, ['2', '"']), (orbclient::K_3, ['3', '£']), @@ -299,7 +299,7 @@ mod keymaps { (orbclient::K_0, ['0', '=']), (orbclient::K_MINUS, ['?', '\'']), (orbclient::K_EQUALS, ['ì', '^']), - (orbclient::K_BKSP, ['\x7F', '\x7F']), + (orbclient::K_BKSP, ['\0', '\0']), (orbclient::K_TAB, ['\t', '\t']), (orbclient::K_Q, ['q', 'Q']), (orbclient::K_W, ['w', 'W']), @@ -313,7 +313,7 @@ mod keymaps { (orbclient::K_P, ['p', 'P']), (orbclient::K_BRACE_OPEN, ['è', 'é']), (orbclient::K_BRACE_CLOSE, ['+', '*']), - (orbclient::K_ENTER, ['\n', '\n']), + (orbclient::K_ENTER, ['\0', '\0']), (orbclient::K_CTRL, ['\x20', '\x20']), (orbclient::K_A, ['a', 'A']), (orbclient::K_S, ['s', 'S']), diff --git a/drivers/inputd/src/lib.rs b/drivers/inputd/src/lib.rs index b68e8211f5..b65fd2ba85 100644 --- a/drivers/inputd/src/lib.rs +++ b/drivers/inputd/src/lib.rs @@ -205,7 +205,9 @@ impl ProducerHandle { } pub fn write_event(&mut self, event: orbclient::Event) -> io::Result<()> { - self.0.write(&event)?; + let written = self.0.write(&event)?; + assert_eq!(written, std::mem::size_of::() as usize, + "write_event: short write ({} != {})", written, std::mem::size_of::()); Ok(()) } }