diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-04-04 18:14:39 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-04-04 18:14:39 +0000 |
commit | 31db71dd59b18ae0f36ca2686fba5fdcc6fe9439 (patch) | |
tree | c73df09205484c80fdfa1eb943f4aac0a39b954e /src | |
parent | cf2f00872c559c892bb4b466bf678c7667490cce (diff) |
Prevent potential leaking of memory by using SkString and SkTArray.
R=bungeman@google.com, mtklein@google.com
Author: djsollen@google.com
Review URL: https://codereview.chromium.org/226183002
git-svn-id: http://skia.googlecode.com/svn/trunk@14064 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/ports/SkFontConfigInterface_android.cpp | 14 | ||||
-rw-r--r-- | src/ports/SkFontConfigParser_android.cpp | 21 | ||||
-rw-r--r-- | src/ports/SkFontConfigParser_android.h | 8 |
3 files changed, 18 insertions, 25 deletions
diff --git a/src/ports/SkFontConfigInterface_android.cpp b/src/ports/SkFontConfigInterface_android.cpp index 14be93457f..20e6c5eb84 100644 --- a/src/ports/SkFontConfigInterface_android.cpp +++ b/src/ports/SkFontConfigInterface_android.cpp @@ -174,7 +174,7 @@ static bool has_font(const SkTArray<FontRec>& array, const SkString& filename) { #define SK_FONT_FILE_PREFIX "/fonts/" #endif -static void get_path_for_sys_fonts(SkString* full, const char name[]) { +static void get_path_for_sys_fonts(SkString* full, const SkString& name) { if (gTestFontFilePrefix) { full->set(gTestFontFilePrefix); } else { @@ -220,7 +220,7 @@ SkFontConfigInterfaceAndroid::SkFontConfigInterfaceAndroid(SkTDArray<FontFamily* for (int j = 0; j < family->fFontFiles.count(); ++j) { SkString filename; - get_path_for_sys_fonts(&filename, family->fFontFiles[j]->fFileName); + get_path_for_sys_fonts(&filename, family->fFontFiles[j].fFileName); if (has_font(fFonts, filename)) { SkDebugf("---- system font and fallback font files specify a duplicate " @@ -265,9 +265,9 @@ SkFontConfigInterfaceAndroid::SkFontConfigInterfaceAndroid(SkTDArray<FontFamily* fontRec.fFamilyRecID = familyRecID; familyRec->fIsFallbackFont = family->fIsFallbackFont; - familyRec->fPaintOptions = family->fFontFiles[j]->fPaintOptions; + familyRec->fPaintOptions = family->fFontFiles[j].fPaintOptions; - } else if (familyRec->fPaintOptions != family->fFontFiles[j]->fPaintOptions) { + } else if (familyRec->fPaintOptions != family->fFontFiles[j].fPaintOptions) { SkDebugf("Every font file within a family must have identical" "language and variant attributes"); sk_throw(); @@ -289,14 +289,14 @@ SkFontConfigInterfaceAndroid::SkFontConfigInterfaceAndroid(SkTDArray<FontFamily* addFallbackFamily(familyRecID); } else { // add the names that map to this family to the dictionary for easy lookup - const SkTDArray<const char*>& names = family->fNames; - if (names.isEmpty()) { + const SkTArray<SkString>& names = family->fNames; + if (names.empty()) { SkDEBUGFAIL("ERROR: non-fallback font with no name"); continue; } for (int i = 0; i < names.count(); i++) { - insert_into_name_dict(fFamilyNameDict, names[i], familyRecID); + insert_into_name_dict(fFamilyNameDict, names[i].c_str(), familyRecID); } } } diff --git a/src/ports/SkFontConfigParser_android.cpp b/src/ports/SkFontConfigParser_android.cpp index 73de73bb54..38a6ee6520 100644 --- a/src/ports/SkFontConfigParser_android.cpp +++ b/src/ports/SkFontConfigParser_android.cpp @@ -52,18 +52,13 @@ static void textHandler(void *data, const char *s, int len) { // Make sure we're in the right state to store this name information if (familyData->currentFamily && (familyData->currentTag == NAMESET_TAG || familyData->currentTag == FILESET_TAG)) { - // Malloc new buffer to store the string - char *buff; - buff = (char*) malloc((len + 1) * sizeof(char)); - strncpy(buff, s, len); - buff[len] = '\0'; switch (familyData->currentTag) { case NAMESET_TAG: - *(familyData->currentFamily->fNames.append()) = buff; + familyData->currentFamily->fNames.push_back().set(s, len); break; case FILESET_TAG: if (familyData->currentFontInfo) { - familyData->currentFontInfo->fFileName = buff; + familyData->currentFontInfo->fFileName.set(s, len); } break; default: @@ -78,7 +73,8 @@ static void textHandler(void *data, const char *s, int len) { * variants then lets textHandler handle the actual file name */ static void fontFileElementHandler(FamilyData *familyData, const char **attributes) { - FontFileInfo* newFileInfo = new FontFileInfo(); + + FontFileInfo& newFileInfo = familyData->currentFamily->fFontFiles.push_back(); if (attributes) { int currentAttributeIndex = 0; while (attributes[currentAttributeIndex]) { @@ -88,19 +84,18 @@ static void fontFileElementHandler(FamilyData *familyData, const char **attribut int valueLength = strlen(attributeValue); if (strncmp(attributeName, "variant", nameLength) == 0) { if (strncmp(attributeValue, "elegant", valueLength) == 0) { - newFileInfo->fPaintOptions.setFontVariant(SkPaintOptionsAndroid::kElegant_Variant); + newFileInfo.fPaintOptions.setFontVariant(SkPaintOptionsAndroid::kElegant_Variant); } else if (strncmp(attributeValue, "compact", valueLength) == 0) { - newFileInfo->fPaintOptions.setFontVariant(SkPaintOptionsAndroid::kCompact_Variant); + newFileInfo.fPaintOptions.setFontVariant(SkPaintOptionsAndroid::kCompact_Variant); } } else if (strncmp(attributeName, "lang", nameLength) == 0) { - newFileInfo->fPaintOptions.setLanguage(attributeValue); + newFileInfo.fPaintOptions.setLanguage(attributeValue); } //each element is a pair of attributeName/attributeValue string pairs currentAttributeIndex += 2; } } - *(familyData->currentFamily->fFontFiles.append()) = newFileInfo; - familyData->currentFontInfo = newFileInfo; + familyData->currentFontInfo = &newFileInfo; XML_SetCharacterDataHandler(*familyData->parser, textHandler); } diff --git a/src/ports/SkFontConfigParser_android.h b/src/ports/SkFontConfigParser_android.h index fd64496f77..e2247efb0a 100644 --- a/src/ports/SkFontConfigParser_android.h +++ b/src/ports/SkFontConfigParser_android.h @@ -15,9 +15,7 @@ #include "SkTDArray.h" struct FontFileInfo { - FontFileInfo() : fFileName(NULL) {} - - const char* fFileName; + SkString fFileName; SkPaintOptionsAndroid fPaintOptions; }; @@ -32,8 +30,8 @@ struct FontFileInfo { struct FontFamily { FontFamily() : fIsFallbackFont(false), order(-1) {} - SkTDArray<const char*> fNames; - SkTDArray<FontFileInfo*> fFontFiles; + SkTArray<SkString> fNames; + SkTArray<FontFileInfo> fFontFiles; bool fIsFallbackFont; int order; // only used internally by SkFontConfigParser }; |