wctype: out of bound access in POSIX locale.
The POSIX locale has gLocaleRoster = NULL and relies on the non-wide version of the implementation. However it doesn't check that the characters are actually in range which leads to out of bound access and crashes in __isctype. Fixes #11322.
This commit is contained in:
@@ -23,133 +23,100 @@ using BPrivate::Libroot::gLocaleBackend;
|
|||||||
* function.
|
* function.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
iswctype(wint_t wc, wctype_t charClass)
|
||||||
|
{
|
||||||
|
if (gLocaleBackend == NULL) {
|
||||||
|
if (wc < 0 || wc > 127)
|
||||||
|
return 0;
|
||||||
|
return __isctype(wc, charClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
return gLocaleBackend->IsWCType(wc, charClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iswalnum(wint_t wc)
|
iswalnum(wint_t wc)
|
||||||
{
|
{
|
||||||
if (gLocaleBackend == NULL)
|
return iswctype(wc, _ISalnum);
|
||||||
return __isctype(wc, _ISalnum);
|
|
||||||
|
|
||||||
return gLocaleBackend->IsWCType(wc, _ISalnum);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iswalpha(wint_t wc)
|
iswalpha(wint_t wc)
|
||||||
{
|
{
|
||||||
if (gLocaleBackend == NULL)
|
return iswctype(wc, _ISalpha);
|
||||||
return __isctype(wc, _ISalpha);
|
|
||||||
|
|
||||||
return gLocaleBackend->IsWCType(wc, _ISalpha);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iswblank(wint_t wc)
|
iswblank(wint_t wc)
|
||||||
{
|
{
|
||||||
if (gLocaleBackend == NULL)
|
return iswctype(wc, _ISblank);
|
||||||
return __isctype(wc, _ISblank);
|
|
||||||
|
|
||||||
return gLocaleBackend->IsWCType(wc, _ISblank);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iswcntrl(wint_t wc)
|
iswcntrl(wint_t wc)
|
||||||
{
|
{
|
||||||
if (gLocaleBackend == NULL)
|
return iswctype(wc, _IScntrl);
|
||||||
return __isctype(wc, _IScntrl);
|
|
||||||
|
|
||||||
return gLocaleBackend->IsWCType(wc, _IScntrl);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iswdigit(wint_t wc)
|
iswdigit(wint_t wc)
|
||||||
{
|
{
|
||||||
if (gLocaleBackend == NULL)
|
return iswctype(wc, _ISdigit);
|
||||||
return __isctype(wc, _ISdigit);
|
|
||||||
|
|
||||||
return gLocaleBackend->IsWCType(wc, _ISdigit);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iswgraph(wint_t wc)
|
iswgraph(wint_t wc)
|
||||||
{
|
{
|
||||||
if (gLocaleBackend == NULL)
|
return iswctype(wc, _ISgraph);
|
||||||
return __isctype(wc, _ISgraph);
|
|
||||||
|
|
||||||
return gLocaleBackend->IsWCType(wc, _ISgraph);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iswlower(wint_t wc)
|
iswlower(wint_t wc)
|
||||||
{
|
{
|
||||||
if (gLocaleBackend == NULL)
|
return iswctype(wc, _ISlower);
|
||||||
return __isctype(wc, _ISlower);
|
|
||||||
|
|
||||||
return gLocaleBackend->IsWCType(wc, _ISlower);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iswprint(wint_t wc)
|
iswprint(wint_t wc)
|
||||||
{
|
{
|
||||||
if (gLocaleBackend == NULL)
|
return iswctype(wc, _ISprint);
|
||||||
return __isctype(wc, _ISprint);
|
|
||||||
|
|
||||||
return gLocaleBackend->IsWCType(wc, _ISprint);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iswpunct(wint_t wc)
|
iswpunct(wint_t wc)
|
||||||
{
|
{
|
||||||
if (gLocaleBackend == NULL)
|
return iswctype(wc, _ISpunct);
|
||||||
return __isctype(wc, _ISpunct);
|
|
||||||
|
|
||||||
return gLocaleBackend->IsWCType(wc, _ISpunct);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iswspace(wint_t wc)
|
iswspace(wint_t wc)
|
||||||
{
|
{
|
||||||
if (gLocaleBackend == NULL)
|
return iswctype(wc, _ISspace);
|
||||||
return __isctype(wc, _ISspace);
|
|
||||||
|
|
||||||
return gLocaleBackend->IsWCType(wc, _ISspace);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iswupper(wint_t wc)
|
iswupper(wint_t wc)
|
||||||
{
|
{
|
||||||
if (gLocaleBackend == NULL)
|
return iswctype(wc, _ISupper);
|
||||||
return __isctype(wc, _ISupper);
|
|
||||||
|
|
||||||
return gLocaleBackend->IsWCType(wc, _ISupper);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iswxdigit(wint_t wc)
|
iswxdigit(wint_t wc)
|
||||||
{
|
{
|
||||||
if (gLocaleBackend == NULL)
|
return iswctype(wc, _ISxdigit);
|
||||||
return __isctype(wc, _ISxdigit);
|
|
||||||
|
|
||||||
return gLocaleBackend->IsWCType(wc, _ISxdigit);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
iswctype(wint_t wc, wctype_t charClass)
|
|
||||||
{
|
|
||||||
if (gLocaleBackend == NULL)
|
|
||||||
return __isctype(wc, charClass);
|
|
||||||
|
|
||||||
return gLocaleBackend->IsWCType(wc, charClass);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user