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
* last one begins */
q = 0;
for (;;) {
- size_t z;
+ int z;
z = utf8_encoded_valid_unichar(passphrase + q, SIZE_MAX);
- if (z == 0) {
+ if (z <= 0) {
q = SIZE_MAX; /* Invalid UTF8! */
break;
}