| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 The Android Open Source Project | 2 * Copyright 2011 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkFontConfigParser_android.h" | 8 #include "SkFontConfigParser_android.h" |
| 9 #include "SkFontMgr_android.h" | 9 #include "SkFontMgr_android.h" |
| 10 #include "SkStream.h" | 10 #include "SkStream.h" |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 442 | 442 |
| 443 // Disable entity processing, to inhibit internal entity expansion. See expa
t CVE-2013-0340 | 443 // Disable entity processing, to inhibit internal entity expansion. See expa
t CVE-2013-0340 |
| 444 XML_SetEntityDeclHandler(parser, xml_entity_decl_handler); | 444 XML_SetEntityDeclHandler(parser, xml_entity_decl_handler); |
| 445 | 445 |
| 446 // Start parsing oldschool; switch these in flight if we detect a newer vers
ion of the file. | 446 // Start parsing oldschool; switch these in flight if we detect a newer vers
ion of the file. |
| 447 XML_SetElementHandler(parser, jbParser::start_element_handler, jbParser::end
_element_handler); | 447 XML_SetElementHandler(parser, jbParser::start_element_handler, jbParser::end
_element_handler); |
| 448 | 448 |
| 449 // One would assume it would be faster to have a buffer on the stack and cal
l XML_Parse. | 449 // One would assume it would be faster to have a buffer on the stack and cal
l XML_Parse. |
| 450 // But XML_Parse will call XML_GetBuffer anyway and memmove the passed buffe
r into it. | 450 // But XML_Parse will call XML_GetBuffer anyway and memmove the passed buffe
r into it. |
| 451 // (Unless XML_CONTEXT_BYTES is undefined, but all users define it.) | 451 // (Unless XML_CONTEXT_BYTES is undefined, but all users define it.) |
| 452 static const int bufferSize = 512; | 452 // In debug, buffer a small odd number of bytes to detect slicing in XML_Cha
racterDataHandler. |
| 453 static const int bufferSize = 512 SkDEBUGCODE( - 507); |
| 453 bool done = false; | 454 bool done = false; |
| 454 while (!done) { | 455 while (!done) { |
| 455 void* buffer = XML_GetBuffer(parser, bufferSize); | 456 void* buffer = XML_GetBuffer(parser, bufferSize); |
| 456 if (!buffer) { | 457 if (!buffer) { |
| 457 SkDebugf("Could not buffer enough to continue.\n"); | 458 SkDebugf("Could not buffer enough to continue.\n"); |
| 458 return -1; | 459 return -1; |
| 459 } | 460 } |
| 460 size_t len = file.read(buffer, bufferSize); | 461 size_t len = file.read(buffer, bufferSize); |
| 461 done = file.isAtEnd(); | 462 done = file.isAtEnd(); |
| 462 XML_Status status = XML_ParseBuffer(parser, len, done); | 463 XML_Status status = XML_ParseBuffer(parser, len, done); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 // The framework is beyond Android 4.2 and can therefore skip this function | 502 // The framework is beyond Android 4.2 and can therefore skip this function |
| 502 return; | 503 return; |
| 503 #endif | 504 #endif |
| 504 | 505 |
| 505 SkAutoTCallIProc<DIR, closedir> fontDirectory(opendir(dir)); | 506 SkAutoTCallIProc<DIR, closedir> fontDirectory(opendir(dir)); |
| 506 if (NULL == fontDirectory) { | 507 if (NULL == fontDirectory) { |
| 507 return; | 508 return; |
| 508 } | 509 } |
| 509 | 510 |
| 510 for (struct dirent* dirEntry; (dirEntry = readdir(fontDirectory));) { | 511 for (struct dirent* dirEntry; (dirEntry = readdir(fontDirectory));) { |
| 511 // The size of both the prefix, suffix, and a minimum valid language cod
e | 512 // The size of the prefix and suffix. |
| 512 static const size_t minSize = sizeof(LOCALE_FALLBACK_FONTS_PREFIX) - 1 | 513 static const size_t fixedLen = sizeof(LOCALE_FALLBACK_FONTS_PREFIX) - 1 |
| 513 + sizeof(LOCALE_FALLBACK_FONTS_SUFFIX) - 1 | 514 + sizeof(LOCALE_FALLBACK_FONTS_SUFFIX) - 1; |
| 514 + 2; | 515 |
| 516 // The size of the prefix, suffix, and a minimum valid language code |
| 517 static const size_t minSize = fixedLen + 2; |
| 515 | 518 |
| 516 SkString fileName(dirEntry->d_name); | 519 SkString fileName(dirEntry->d_name); |
| 517 if (fileName.size() < minSize || | 520 if (fileName.size() < minSize || |
| 518 !fileName.startsWith(LOCALE_FALLBACK_FONTS_PREFIX) || | 521 !fileName.startsWith(LOCALE_FALLBACK_FONTS_PREFIX) || |
| 519 !fileName.endsWith(LOCALE_FALLBACK_FONTS_SUFFIX)) | 522 !fileName.endsWith(LOCALE_FALLBACK_FONTS_SUFFIX)) |
| 520 { | 523 { |
| 521 continue; | 524 continue; |
| 522 } | 525 } |
| 523 | 526 |
| 524 static const size_t fixedLen = sizeof(LOCALE_FALLBACK_FONTS_PREFIX) - 1 | |
| 525 + sizeof(LOCALE_FALLBACK_FONTS_SUFFIX) - 1; | |
| 526 | |
| 527 SkString locale(fileName.c_str() + sizeof(LOCALE_FALLBACK_FONTS_PREFIX)
- 1, | 527 SkString locale(fileName.c_str() + sizeof(LOCALE_FALLBACK_FONTS_PREFIX)
- 1, |
| 528 fileName.size() - fixedLen); | 528 fileName.size() - fixedLen); |
| 529 | 529 |
| 530 SkString absoluteFilename; | 530 SkString absoluteFilename; |
| 531 absoluteFilename.printf("%s/%s", dir, fileName.c_str()); | 531 absoluteFilename.printf("%s/%s", dir, fileName.c_str()); |
| 532 | 532 |
| 533 SkTDArray<FontFamily*> langSpecificFonts; | 533 SkTDArray<FontFamily*> langSpecificFonts; |
| 534 parse_config_file(absoluteFilename.c_str(), langSpecificFonts, basePath,
true); | 534 parse_config_file(absoluteFilename.c_str(), langSpecificFonts, basePath,
true); |
| 535 | 535 |
| 536 for (int i = 0; i < langSpecificFonts.count(); ++i) { | 536 for (int i = 0; i < langSpecificFonts.count(); ++i) { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 623 const char* tag = fTag.c_str(); | 623 const char* tag = fTag.c_str(); |
| 624 | 624 |
| 625 // strip off the rightmost "-.*" | 625 // strip off the rightmost "-.*" |
| 626 const char* parentTagEnd = strrchr(tag, '-'); | 626 const char* parentTagEnd = strrchr(tag, '-'); |
| 627 if (parentTagEnd == NULL) { | 627 if (parentTagEnd == NULL) { |
| 628 return SkLanguage(); | 628 return SkLanguage(); |
| 629 } | 629 } |
| 630 size_t parentTagLen = parentTagEnd - tag; | 630 size_t parentTagLen = parentTagEnd - tag; |
| 631 return SkLanguage(tag, parentTagLen); | 631 return SkLanguage(tag, parentTagLen); |
| 632 } | 632 } |
| OLD | NEW |