NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
lib/54414: wcsrtombs(3) doesn't update the source argument on conversion error
>Number: 54414
>Category: lib
>Synopsis: wcsrtombs(3) doesn't update the source argument on conversion error
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: lib-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sat Jul 27 23:00:00 +0000 2019
>Originator: Valery Ushakov
>Release: NetBSD-8
>Organization:
>Environment:
>Description:
wcsrtombs(3) definition in C99 says:
[#3] If dst is not a null pointer, the pointer object
pointed to by src is assigned either a null pointer (if
conversion stopped due to reaching a terminating null wide
character) or the address just past the last wide character
converted (if any).
Our wcsrtombs(3) does NOT update its src (pwcs) parameter if it
encounters a conversion error.
>How-To-Repeat:
#include <wchar.h>
#include <string.h>
#include <stdio.h>
#if !defined(__arraycount)
#define __arraycount(a) (sizeof(a)/sizeof(a[0]))
#endif
int
main()
{
wchar_t label[] = L"L" L"\u0403" L"bel";
char lbuf[128] = { 0 };
mbstate_t mbstate;
size_t n;
memset(&mbstate, 0, sizeof(mbstate));
const wchar_t *wp = label;
n = wcsrtombs(lbuf, &wp, sizeof(lbuf), &mbstate);
if (n == (size_t)-1) {
printf("%p %p\n", label, wp);
}
memset(&mbstate, 0, sizeof(mbstate));
char *dst = lbuf;
for (int i = 0; i < __arraycount(label); ++i) {
wchar_t wc = label[i];
n = wcrtomb(dst, wc, &mbstate);
if (n == (size_t)-1) {
printf("failed to convert \\x%x at %d\n", wc, i);
break;
}
dst += n;
}
return 0;
}
On Linux I get, e.g.:
0x7fff71f762e0 0x7fff71f762e4
failed to convert \x403 at 1
on NetBSD
0xffffe148 0xffffe148
failed to convert \x403 at 1
>Fix:
Home |
Main Index |
Thread Index |
Old Index