From 70f32936e931e6a4835d5f293fb16272c8a9af5d Mon Sep 17 00:00:00 2001 From: threedeyes <3dEyes@gmail.com> Date: Fri, 9 Nov 2012 04:15:30 +0000 Subject: [PATCH] ICNSTranslator: Minor fixes * documentIndex not zero-based * more error handling * memory leak --- src/add-ons/translators/icns/ICNSLoader.cpp | 22 +++++++++++++------ .../translators/icns/ICNSTranslator.cpp | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/add-ons/translators/icns/ICNSLoader.cpp b/src/add-ons/translators/icns/ICNSLoader.cpp index 032ef65fd0..49f27e9362 100644 --- a/src/add-ons/translators/icns/ICNSLoader.cpp +++ b/src/add-ons/translators/icns/ICNSLoader.cpp @@ -60,6 +60,9 @@ ICNSLoader::ICNSLoader(BPositionIO *stream) stream->Seek(0, SEEK_END); fStreamSize = stream->Position(); stream->Seek(0, SEEK_SET); + + if (fStreamSize <= 0) + return; uint8* icnsDataBuffer = new uint8[fStreamSize]; size_t readedBytes = stream->Read(icnsDataBuffer,fStreamSize); @@ -67,8 +70,11 @@ ICNSLoader::ICNSLoader(BPositionIO *stream) fIconFamily = NULL; int status = icns_import_family_data(readedBytes, icnsDataBuffer, &fIconFamily); - if (status != 0) + + if (status != 0) { + delete icnsDataBuffer; return; + } icns_byte_t *dataPtr = (icns_byte_t*)fIconFamily; off_t dataOffset = sizeof(icns_type_t) + sizeof(icns_size_t); @@ -89,10 +95,10 @@ ICNSLoader::ICNSLoader(BPositionIO *stream) } dataOffset += iconElement.elementSize; } - + fFormatList.SortItems(compareTypes); - delete icnsDataBuffer; + delete icnsDataBuffer; fLoaded = true; } @@ -275,7 +281,7 @@ ICNSSaver::ICNSSaver(BPositionIO *stream, uint32 rowBytes, icns_type_t type) icns_free_image(&icnsMask); } - if(!fCreated) { + if (!fCreated) { free(fIconFamily); fIconFamily = NULL; } @@ -297,9 +303,11 @@ ICNSSaver::SaveData(BPositionIO *target) icns_size_t dataSize; icns_byte_t *dataPtrOut; icns_export_family_data(fIconFamily, &dataSize, &dataPtrOut); - target->Write(dataPtrOut, dataSize); - - return B_OK; + if (dataSize != 0 && dataPtrOut != NULL) { + if (target->Write(dataPtrOut, dataSize) == dataSize); + return B_OK; + } + return B_ERROR; } diff --git a/src/add-ons/translators/icns/ICNSTranslator.cpp b/src/add-ons/translators/icns/ICNSTranslator.cpp index 843a49c970..c4cf42d868 100644 --- a/src/add-ons/translators/icns/ICNSTranslator.cpp +++ b/src/add-ons/translators/icns/ICNSTranslator.cpp @@ -191,7 +191,7 @@ ICNSTranslator::DerivedTranslate(BPositionIO *source, if (!icnsFile.IsLoaded() || icnsFile.IconsCount() <= 0) return B_NO_TRANSLATOR; - int32 documentIndex = 0; + int32 documentIndex = 1; if (ioExtension) { if (ioExtension->FindInt32(DOCUMENT_INDEX, &documentIndex) != B_OK)