cocos2d-2.1beta3-x-2.1.0, addImageAsync Crash Bug

Hi guys

I can’t speak English very well. Pardon me.

I found addImageAsync Crash Bug for android device.(ios ok)

I created test project.

test android

********** Crash dump: **********
Build fingerprint: 'LGE/batman_lgu/batman_lgu:4.0.4/IMM76D/LG-F100L-V29j.1c1b3e6c95:user/release-keys'
pid: 17045, tid: 17068  >>> com.abluewind.AsyncTest <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00001921
Stack frame #00  pc 0010b7b4  /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d18unzReadCurrentFileEPvS0_j): Routine unzReadCurrentFile in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/support/zip_support/unzip.cpp:1813
Stack frame #01  pc 00109fca  /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d7ZipFile11getFileDataERKSsPm): Routine getFileData in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/support/zip_support/ZipUtils.cpp:422
Stack frame #02  pc 000fd514  /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d11CCFileUtils11getFileDataEPKcS2_Pm): Routine getFileData in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/platform/android/CCFileUtils.cpp:99
Stack frame #03  pc 000ff1c6  /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d7CCImage27initWithImageFileThreadSafeEPKcNS0_12EImageFormatE): Routine initWithImageFileThreadSafe in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/platform/CCImageCommon_cpp.h:110
Stack frame #04  pc 0010f394  /data/data/com.abluewind.AsyncTest/lib/libgame.so: Routine loadImage in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/textures/CCTextureCache.cpp:162
Stack frame #05  pc 0001337c  /system/lib/libc.so (__thread_entry)
Stack frame #06  pc 00012ed0  /system/lib/libc.so (pthread_create)
Crash dump is completed

********** Crash dump: **********
Build fingerprint: 'LGE/batman_lgu/batman_lgu:4.0.4/IMM76D/LG-F100L-V29j.1c1b3e6c95:user/release-keys'
pid: 17099, tid: 17118  >>> com.abluewind.AsyncTest <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 6572a352
Stack frame #00  pc 0010b7b6  /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d18unzReadCurrentFileEPvS0_j): Routine unzReadCurrentFile in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/support/zip_support/unzip.cpp:1813
Stack frame #01  pc 00109fca  /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d7ZipFile11getFileDataERKSsPm): Routine getFileData in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/support/zip_support/ZipUtils.cpp:422
Stack frame #02  pc 000fd514  /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d11CCFileUtils11getFileDataEPKcS2_Pm): Routine getFileData in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/platform/android/CCFileUtils.cpp:99
Stack frame #03  pc 000ff1c6  /data/data/com.abluewind.AsyncTest/lib/libgame.so (_ZN7cocos2d7CCImage27initWithImageFileThreadSafeEPKcNS0_12EImageFormatE): Routine initWithImageFileThreadSafe in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/platform/CCImageCommon_cpp.h:110
Stack frame #04  pc 0010f394  /data/data/com.abluewind.AsyncTest/lib/libgame.so: Routine loadImage in /Users/dunkhoon/Dropbox/Work_Mac/cocos2d-2.1beta3-x-2.1.0/AsyncTest/android/../../cocos2dx/textures/CCTextureCache.cpp:162
Stack frame #05  pc 0001337c  /system/lib/libc.so (__thread_entry)
Stack frame #06  pc 00012ed0  /system/lib/libc.so (pthread_create)

So, I modified source code.(ZipUtils.cpp)

use mutex lock.

ZipFile::ZipFile(const std::string &zipFile, const std::string &filter)
    : m_data(new ZipFilePrivate)
{
    pthread_mutex_init(&s_asynctt, NULL);

    m_data->zipFile = unzOpen(zipFile.c_str());
    if (m_data->zipFile)
    {
        setFilter(filter);
    }
}

ZipFile::~ZipFile()
{
    if (m_data && m_data->zipFile)
    {
        unzClose(m_data->zipFile);
    }
    CC_SAFE_DELETE(m_data);

    pthread_mutex_destroy(&s_asynctt);
}

unsigned char *ZipFile::getFileData(const std::string &fileName, unsigned long *pSize)
{
    unsigned char * pBuffer = NULL;
    if (pSize)
    {
        *pSize = 0;
    }

    pthread_mutex_lock(&s_asynctt);
    do
    {
        CC_BREAK_IF(!m_data->zipFile);
        CC_BREAK_IF(fileName.empty());

        ZipFilePrivate::FileListContainer::const_iterator it = m_data->fileList.find(fileName);
        CC_BREAK_IF(it ==  m_data->fileList.end());

        ZipEntryInfo fileInfo = it->second;

        int nRet = unzGoToFilePos(m_data->zipFile, &fileInfo.pos);
        CC_BREAK_IF(UNZ_OK != nRet);

        nRet = unzOpenCurrentFile(m_data->zipFile);
        CC_BREAK_IF(UNZ_OK != nRet);

        pBuffer = new unsigned char[fileInfo.uncompressed_size];
        int nSize = 0;
        nSize = unzReadCurrentFile(m_data->zipFile, pBuffer, fileInfo.uncompressed_size);
        char test[256] = {0};
        sprintf(test, "fileName : %s, nSize : %d, uncompressed_size : %d", fileName.c_str(), nSize, (int)fileInfo.uncompressed_size);
        CCLog(test);
        CCAssert(nSize == 0 || nSize == (int)fileInfo.uncompressed_size, "the file size is wrong");

        if (pSize)
        {
            *pSize = fileInfo.uncompressed_size;
        }
        unzCloseCurrentFile(m_data->zipFile);
    } while (0);

    pthread_mutex_unlock(&s_asynctt);
    return pBuffer;
}

and, Crash was not generated.

I guess ‘m_data’ as problem.

Thankyou dunkhoon, you saved me SO much time :slight_smile: