ZEXTERN int ZEXPORT z_inflate OF()

in zlibWrapper/zstd_zlibwrapper.c [733:926]


ZEXTERN int ZEXPORT z_inflate OF((z_streamp strm, int flush))
{
    ZWRAP_DCtx* zwd;

    if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) {
        int const result = inflate(strm, flush);
        LOG_WRAPPERD("- inflate2 flush=%d avail_in=%d avail_out=%d total_in=%d total_out=%d res=%d\n",
                     (int)flush, (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out, result);
        return result;
    }

    if (strm->avail_in <= 0) return Z_OK;

    zwd = (ZWRAP_DCtx*) strm->state;
    LOG_WRAPPERD("- inflate1 flush=%d avail_in=%d avail_out=%d total_in=%d total_out=%d\n",
                 (int)flush, (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out);

    if (zwd == NULL) return Z_STREAM_ERROR;
    if (zwd->decompState == ZWRAP_streamEnd) return Z_STREAM_END;

    if (zwd->totalInBytes < ZLIB_HEADERSIZE) {
        if (zwd->totalInBytes == 0 && strm->avail_in >= ZLIB_HEADERSIZE) {
            if (ZWRAP_readLE32(strm->next_in) != ZSTD_MAGICNUMBER) {
                {   int const initErr = (zwd->windowBits) ?
                                inflateInit2_(strm, zwd->windowBits, zwd->version, zwd->stream_size) :
                                inflateInit_(strm, zwd->version, zwd->stream_size);
                    LOG_WRAPPERD("ZLIB inflateInit errorCode=%d\n", initErr);
                    if (initErr != Z_OK) return ZWRAPD_finishWithError(zwd, strm, initErr);
                }

                strm->reserved = ZWRAP_ZLIB_STREAM;
                { size_t const freeErr = ZWRAP_freeDCtx(zwd);
                  if (ZSTD_isError(freeErr)) goto error; }

                {   int const result = (flush == Z_INFLATE_SYNC) ?
                                        inflateSync(strm) :
                                        inflate(strm, flush);
                    LOG_WRAPPERD("- inflate3 flush=%d avail_in=%d avail_out=%d total_in=%d total_out=%d res=%d\n",
                                 (int)flush, (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out, res);
                    return result;
            }   }
        } else {  /* ! (zwd->totalInBytes == 0 && strm->avail_in >= ZLIB_HEADERSIZE) */
            size_t const srcSize = MIN(strm->avail_in, ZLIB_HEADERSIZE - zwd->totalInBytes);
            memcpy(zwd->headerBuf+zwd->totalInBytes, strm->next_in, srcSize);
            strm->total_in += srcSize;
            zwd->totalInBytes += srcSize;
            strm->next_in += srcSize;
            strm->avail_in -= srcSize;
            if (zwd->totalInBytes < ZLIB_HEADERSIZE) return Z_OK;

            if (ZWRAP_readLE32(zwd->headerBuf) != ZSTD_MAGICNUMBER) {
                z_stream strm2;
                strm2.next_in = strm->next_in;
                strm2.avail_in = strm->avail_in;
                strm2.next_out = strm->next_out;
                strm2.avail_out = strm->avail_out;

                {   int const initErr = (zwd->windowBits) ?
                                inflateInit2_(strm, zwd->windowBits, zwd->version, zwd->stream_size) :
                                inflateInit_(strm, zwd->version, zwd->stream_size);
                    LOG_WRAPPERD("ZLIB inflateInit errorCode=%d\n", initErr);
                    if (initErr != Z_OK) return ZWRAPD_finishWithError(zwd, strm, initErr);
                }

                /* inflate header */
                strm->next_in = (unsigned char*)zwd->headerBuf;
                strm->avail_in = ZLIB_HEADERSIZE;
                strm->avail_out = 0;
                {   int const dErr = inflate(strm, Z_NO_FLUSH);
                    LOG_WRAPPERD("ZLIB inflate errorCode=%d strm->avail_in=%d\n",
                                  dErr, (int)strm->avail_in);
                    if (dErr != Z_OK)
                        return ZWRAPD_finishWithError(zwd, strm, dErr);
                }
                if (strm->avail_in > 0) goto error;

                strm->next_in = strm2.next_in;
                strm->avail_in = strm2.avail_in;
                strm->next_out = strm2.next_out;
                strm->avail_out = strm2.avail_out;

                strm->reserved = ZWRAP_ZLIB_STREAM; /* mark as zlib stream */
                { size_t const freeErr = ZWRAP_freeDCtx(zwd);
                  if (ZSTD_isError(freeErr)) goto error; }

                {   int const result = (flush == Z_INFLATE_SYNC) ?
                                       inflateSync(strm) :
                                       inflate(strm, flush);
                    LOG_WRAPPERD("- inflate2 flush=%d avail_in=%d avail_out=%d total_in=%d total_out=%d res=%d\n",
                                 (int)flush, (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out, res);
                    return result;
        }   }   }  /* if ! (zwd->totalInBytes == 0 && strm->avail_in >= ZLIB_HEADERSIZE) */
    }  /* (zwd->totalInBytes < ZLIB_HEADERSIZE) */

    strm->reserved = ZWRAP_ZSTD_STREAM; /* mark as zstd steam */

    if (flush == Z_INFLATE_SYNC) { strm->msg = "inflateSync is not supported!"; goto error; }

    if (!zwd->zbd) {
        zwd->zbd = ZSTD_createDStream_advanced(zwd->customMem);
        if (zwd->zbd == NULL) { LOG_WRAPPERD("ERROR: ZSTD_createDStream_advanced\n"); goto error; }
        zwd->decompState = ZWRAP_useInit;
    }

    if (zwd->totalInBytes < ZSTD_HEADERSIZE) {
        if (zwd->totalInBytes == 0 && strm->avail_in >= ZSTD_HEADERSIZE) {
            if (zwd->decompState == ZWRAP_useInit) {
                size_t const initErr = ZSTD_initDStream(zwd->zbd);
                if (ZSTD_isError(initErr)) {
                    LOG_WRAPPERD("ERROR: ZSTD_initDStream errorCode=%s\n",
                                 ZSTD_getErrorName(initErr));
                    goto error;
                }
            } else {
                size_t const resetErr = ZSTD_DCtx_reset(zwd->zbd, ZSTD_reset_session_only);
                if (ZSTD_isError(resetErr)) goto error;
            }
        } else {
            size_t const srcSize = MIN(strm->avail_in, ZSTD_HEADERSIZE - zwd->totalInBytes);
            memcpy(zwd->headerBuf+zwd->totalInBytes, strm->next_in, srcSize);
            strm->total_in += srcSize;
            zwd->totalInBytes += srcSize;
            strm->next_in += srcSize;
            strm->avail_in -= srcSize;
            if (zwd->totalInBytes < ZSTD_HEADERSIZE) return Z_OK;

            if (zwd->decompState == ZWRAP_useInit) {
                size_t const initErr = ZSTD_initDStream(zwd->zbd);
                if (ZSTD_isError(initErr)) {
                    LOG_WRAPPERD("ERROR: ZSTD_initDStream errorCode=%s\n",
                                ZSTD_getErrorName(initErr));
                    goto error;
                }
            } else {
                size_t const resetErr = ZSTD_DCtx_reset(zwd->zbd, ZSTD_reset_session_only);
                if (ZSTD_isError(resetErr)) goto error;
            }

            zwd->inBuffer.src = zwd->headerBuf;
            zwd->inBuffer.size = ZSTD_HEADERSIZE;
            zwd->inBuffer.pos = 0;
            zwd->outBuffer.dst = strm->next_out;
            zwd->outBuffer.size = 0;
            zwd->outBuffer.pos = 0;
            {   size_t const dErr = ZSTD_decompressStream(zwd->zbd, &zwd->outBuffer, &zwd->inBuffer);
                LOG_WRAPPERD("inflate ZSTD_decompressStream1 errorCode=%d srcSize=%d dstCapacity=%d\n",
                            (int)dErr, (int)zwd->inBuffer.size, (int)zwd->outBuffer.size);
                if (ZSTD_isError(dErr)) {
                    LOG_WRAPPERD("ERROR: ZSTD_decompressStream1 %s\n", ZSTD_getErrorName(dErr));
                    goto error;
            }   }
            if (zwd->inBuffer.pos != zwd->inBuffer.size) goto error; /* not consumed */
        }
    }   /* (zwd->totalInBytes < ZSTD_HEADERSIZE) */

    zwd->inBuffer.src = strm->next_in;
    zwd->inBuffer.size = strm->avail_in;
    zwd->inBuffer.pos = 0;
    zwd->outBuffer.dst = strm->next_out;
    zwd->outBuffer.size = strm->avail_out;
    zwd->outBuffer.pos = 0;
    {   size_t const dErr = ZSTD_decompressStream(zwd->zbd, &zwd->outBuffer, &zwd->inBuffer);
        LOG_WRAPPERD("inflate ZSTD_decompressStream2 errorCode=%d srcSize=%d dstCapacity=%d\n",
                    (int)dErr, (int)strm->avail_in, (int)strm->avail_out);
        if (ZSTD_isError(dErr)) {
            zwd->errorCount++;
            LOG_WRAPPERD("ERROR: ZSTD_decompressStream2 %s zwd->errorCount=%d\n",
                        ZSTD_getErrorName(dErr), zwd->errorCount);
            if (zwd->errorCount<=1) return Z_NEED_DICT; else goto error;
        }
        LOG_WRAPPERD("inflate inBuffer.pos=%d inBuffer.size=%d outBuffer.pos=%d outBuffer.size=%d o\n",
                    (int)zwd->inBuffer.pos, (int)zwd->inBuffer.size, (int)zwd->outBuffer.pos, (int)zwd->outBuffer.size);
        strm->next_out += zwd->outBuffer.pos;
        strm->total_out += zwd->outBuffer.pos;
        strm->avail_out -= zwd->outBuffer.pos;
        strm->total_in += zwd->inBuffer.pos;
        zwd->totalInBytes += zwd->inBuffer.pos;
        strm->next_in += zwd->inBuffer.pos;
        strm->avail_in -= zwd->inBuffer.pos;
        if (dErr == 0) {
            LOG_WRAPPERD("inflate Z_STREAM_END1 avail_in=%d avail_out=%d total_in=%d total_out=%d\n",
                        (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out);
            zwd->decompState = ZWRAP_streamEnd;
            return Z_STREAM_END;
        }
    }  /* dErr lifetime */

    LOG_WRAPPERD("- inflate2 flush=%d avail_in=%d avail_out=%d total_in=%d total_out=%d res=%d\n",
                (int)flush, (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out, Z_OK);
    return Z_OK;

error:
    return ZWRAPD_finishWithError(zwd, strm, 0);
}