ask-password-api: fix error handling on invalid unicode character v246.11
authorKevin Backhouse <securitylab@github.com>
Fri, 12 Mar 2021 17:00:56 +0000 (18:00 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 12 Mar 2021 17:33:01 +0000 (18:33 +0100)
The integer overflow happens when utf8_encoded_valid_unichar() returns an error
code. The error code is a negative number: -22. This overflows when it is
assigned to `z` (type `size_t`). This can cause an infinite loop if the value
of `q` is 22 or larger.

To reproduce the bug, you need to run `systemd-ask-password` and enter an
invalid unicode character, followed by a backspace character.

GHSL-2021-052

(cherry picked from commit 37ca78a35cd1b9f13e584ccf3d332413c7875e40)
(cherry picked from commit 069525e84a67375e27429cb490e8d28af78e673a)

src/shared/ask-password-api.c

index 7bf64e1cf82793b4ae6be8a50eac99ee0ec8e985..0326361b6b3fe7f7ff2e638405bd474bf245924b 100644 (file)
@@ -617,10 +617,10 @@ int ask_password_tty(
                                  * last one begins */
                                 q = 0;
                                 for (;;) {
-                                        size_t z;
+                                        int z;
 
                                         z = utf8_encoded_valid_unichar(passphrase + q, (size_t) -1);
-                                        if (z == 0) {
+                                        if (z <= 0) {
                                                 q = (size_t) -1; /* Invalid UTF8! */
                                                 break;
                                         }