mbtowc(3C) fails to set errno for incomplete characters
If an incomplete character is passed to mbtowc(3), it fails to set errno to EILSEQ, even though that is unambiguously required by POSIX.
Setting errno in that case makes a lot of sense because having a function that can fail and that sets errno in some failure modes but does not set errno in other failure modes would be a terrible idea. Such a function would be ridiculously complicated to use. To detect the reason for failure, you would have to:
- save errno
- reset errno to zero
- call the function
- inspect the return value to detect failure
- inspect errno to decide about the reason for failure
- if errno is zero, restore the saved errno
That is completely unreasonable, in particular for a seemingly innocous function like mbtowc(3). Next to no programmer would get that right in any real-world program.
Note that this bug is very widespread, it also affects FreeBSD and glibc, and also OpenBSD until i fixed it today. I will also send a note around to the other systems.
The OpenBSD patch is here:
The attachment contains a patch against illumos-gate -current, mainly to make it even clearer what exactly i mean. Note that i did not test the patch since i don't have an illumos system - so please test before commit! Thanks.
Updated by Yuri Pankov about 4 years ago
- Subject changed from mbtowc(3) fails to set errno for incomplete characters to mbtowc(3C) fails to set errno for incomplete characters
- Status changed from New to In Progress
- Assignee set to Yuri Pankov
- % Done changed from 0 to 50
- Difficulty changed from Medium to Bite-size
- Tags deleted (
Updated by Electric Monk about 4 years ago
- Status changed from In Progress to Closed
- % Done changed from 50 to 100
commit 440578c35af1ea0360a52ee814488a4d0bbbc160 Author: Ingo Schwarze <email@example.com> Date: 2017-03-28T04:15:46.000Z 6689 mbtowc(3C) fails to set errno for incomplete characters Reviewed by: Robert Mustacchi <firstname.lastname@example.org> Reviewed by: Yuri Pankov <email@example.com> Approved by: Dan McDonald <firstname.lastname@example.org>