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:
Adrien Destugues
2014-10-06 16:54:31 +02:00
parent aa1e906441
commit 7554bc9a19
+25 -58
View File
@@ -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);
} }