Make extension string parsing robust.
Review URL: https://codereview.chromium.org/12564003 git-svn-id: http://skia.googlecode.com/svn/trunk@8040 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
9cd1ef54a6
commit
a224072836
@ -51,27 +51,20 @@ bool GrGLExtensions::init(GrGLBinding binding,
|
||||
if (NULL == extensions) {
|
||||
return false;
|
||||
}
|
||||
// First count the extensions so that we don't cause the array to malloc multiple times.
|
||||
int extensionCnt = 1;
|
||||
const char* e = (const char*) extensions;
|
||||
while (NULL != (e = strchr(e+1, ' '))) {
|
||||
e += 1;
|
||||
++extensionCnt;
|
||||
}
|
||||
fStrings.push_back_n(extensionCnt);
|
||||
|
||||
int i = 0;
|
||||
while (true) {
|
||||
size_t length = strcspn(extensions, " ");
|
||||
GrAssert(i < extensionCnt);
|
||||
fStrings[i].set(extensions, length);
|
||||
++i;
|
||||
if ('\0' == extensions[length]) {
|
||||
// skip over multiple spaces between extensions
|
||||
while (' ' == *extensions) {
|
||||
++extensions;
|
||||
}
|
||||
// quit once we reach the end of the string.
|
||||
if ('\0' == *extensions) {
|
||||
break;
|
||||
}
|
||||
extensions += length + 1;
|
||||
// we found an extension
|
||||
size_t length = strcspn(extensions, " ");
|
||||
fStrings.push_back().set(extensions, length);
|
||||
extensions += length;
|
||||
}
|
||||
GrAssert(i == extensionCnt);
|
||||
}
|
||||
SkTSearchCompareLTFunctor<SkString, extension_compare> cmp;
|
||||
SkTQSort(&fStrings.front(), &fStrings.back(), cmp);
|
||||
|
Loading…
Reference in New Issue
Block a user