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 |