Fix bugs in zlib wrapper. Use ReleaseWithoutAsm instead.
This commit is contained in:
parent
fe87f9a31b
commit
cf517691bd
BIN
lib/zlibwapi.lib
BIN
lib/zlibwapi.lib
Binary file not shown.
|
@ -2,98 +2,91 @@
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <list>
|
||||||
|
#include <queue>
|
||||||
|
#include <vector>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
/// From CSDN
|
/// Block size.
|
||||||
/* Uncompress gzip data */
|
#define BLOCKSZ 4096
|
||||||
static int _gz_decompress_real(Byte *zdata, uLong nzdata,
|
|
||||||
Byte *data, uLong *ndata)
|
class Decompress
|
||||||
{
|
{
|
||||||
int err = 0;
|
public:
|
||||||
z_stream d_stream = {0}; /* decompression stream */
|
Decompress()
|
||||||
static char dummy_head[2] =
|
|
||||||
{
|
{
|
||||||
0x8 + 0x7 * 0x10,
|
memset(&_z,0,sizeof(_z));
|
||||||
(((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
|
_status=-1;
|
||||||
};
|
}
|
||||||
d_stream.zalloc = (alloc_func)0;
|
|
||||||
d_stream.zfree = (free_func)0;
|
|
||||||
d_stream.opaque = (voidpf)0;
|
|
||||||
d_stream.next_in = zdata;
|
|
||||||
d_stream.avail_in = 0;
|
|
||||||
d_stream.next_out = data;
|
|
||||||
if(inflateInit2(&d_stream, MAX_WBITS+32) != Z_OK) return -1;
|
|
||||||
|
|
||||||
/// Decompress Input Data by byte. (There must be some faster methods)
|
~Decompress()
|
||||||
while (d_stream.total_out < *ndata && d_stream.total_in < nzdata) {
|
{
|
||||||
d_stream.avail_in = d_stream.avail_out = 1;
|
destroy();
|
||||||
if((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END) break;
|
}
|
||||||
if(err != Z_OK )
|
|
||||||
|
Decompress(const Decompress& )=delete;
|
||||||
|
Decompress& operator = (const Decompress&)=delete;
|
||||||
|
|
||||||
|
Decompress(Decompress&& d)=delete;
|
||||||
|
Decompress& operator = (Decompress&&)=delete;
|
||||||
|
|
||||||
|
void setIn(Bytef* ptr,uInt sz)
|
||||||
|
{
|
||||||
|
_z.next_in=ptr;
|
||||||
|
_z.avail_in=sz;
|
||||||
|
}
|
||||||
|
void setOut(Bytef* ptr,uInt sz)
|
||||||
|
{
|
||||||
|
_z.next_out=ptr;
|
||||||
|
_z.avail_out=sz;
|
||||||
|
}
|
||||||
|
|
||||||
|
int init(int window_size)
|
||||||
|
{
|
||||||
|
/// Cannot initialize used stream block
|
||||||
|
if(_status!=-1) return -101;
|
||||||
|
|
||||||
|
int ret=inflateInit2(&_z,window_size);
|
||||||
|
if(ret==Z_OK)
|
||||||
{
|
{
|
||||||
if(err == Z_DATA_ERROR)
|
_status=1;
|
||||||
{
|
|
||||||
d_stream.next_in = (Bytef*) dummy_head;
|
|
||||||
d_stream.avail_in = sizeof(dummy_head);
|
|
||||||
if((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK)
|
|
||||||
{
|
|
||||||
/// Clean up.
|
|
||||||
if(inflateEnd(&d_stream)!=Z_OK)
|
|
||||||
return -2;
|
|
||||||
else
|
|
||||||
return -3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(err==Z_BUF_ERROR)
|
|
||||||
{
|
|
||||||
/// Clean up.
|
|
||||||
if(inflateEnd(&d_stream)!=Z_OK)
|
|
||||||
return 1;
|
|
||||||
else
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/// Clean up.
|
|
||||||
if(inflateEnd(&d_stream)!=Z_OK)
|
|
||||||
return -4;
|
|
||||||
else
|
|
||||||
return -5;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
err=inflate(&d_stream,Z_FINISH);
|
int run(int flush_parameter)
|
||||||
if(err==Z_BUF_ERROR)
|
|
||||||
{
|
{
|
||||||
/// Clean up.
|
return inflate(&_z,flush_parameter);
|
||||||
if(inflateEnd(&d_stream) != Z_OK)
|
|
||||||
return 11;
|
|
||||||
else
|
|
||||||
return 12;
|
|
||||||
}
|
}
|
||||||
else if(err!=Z_OK&&err!=Z_STREAM_END)
|
|
||||||
|
int destroy()
|
||||||
{
|
{
|
||||||
/// Clean up.
|
if(_status<0) return -101;
|
||||||
if(inflateEnd(&d_stream) != Z_OK)
|
|
||||||
return -15;
|
int ret=inflateEnd(&_z);
|
||||||
else
|
if(ret==Z_OK)
|
||||||
return -16;
|
{
|
||||||
|
_status=-2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
uLong total_out=d_stream.total_out;
|
/// For experiment use.
|
||||||
|
z_stream& get()
|
||||||
/// Clean up.
|
{
|
||||||
if(inflateEnd(&d_stream) != Z_OK) return -10;
|
return _z;
|
||||||
|
}
|
||||||
*ndata = total_out;
|
private:
|
||||||
return 0;
|
z_stream _z;
|
||||||
}
|
int _status;
|
||||||
|
};
|
||||||
|
|
||||||
std::string GZDecompress(const std::string& InputStr)
|
std::string GZDecompress(const std::string& InputStr)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
int inputSz=InputStr.size();
|
int inputSz=InputStr.size();
|
||||||
|
|
||||||
char* holder=(char*)malloc(inputSz+32);
|
unsigned char* holder=(unsigned char*)malloc(inputSz+32);
|
||||||
if(!holder)
|
if(!holder)
|
||||||
{
|
{
|
||||||
dprintf("Failed to malloc holder.\n");
|
dprintf("Failed to malloc holder.\n");
|
||||||
|
@ -102,46 +95,38 @@ std::string GZDecompress(const std::string& InputStr)
|
||||||
memset(holder,0,inputSz+32);
|
memset(holder,0,inputSz+32);
|
||||||
memcpy(holder,InputStr.data(),inputSz);
|
memcpy(holder,InputStr.data(),inputSz);
|
||||||
|
|
||||||
std::shared_ptr<char> sp;
|
std::shared_ptr<unsigned char> sp;
|
||||||
sp.reset(holder,free);
|
sp.reset(holder,free);
|
||||||
|
|
||||||
int rate=2;
|
Decompress d;
|
||||||
|
if(d.init(MAX_WBITS+16)!=Z_OK)
|
||||||
|
{
|
||||||
|
dprintf("Failed to init zlib\n");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
d.setIn(holder,inputSz);
|
||||||
|
|
||||||
|
unsigned char buffer[BLOCKSZ];
|
||||||
|
|
||||||
|
string result;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
uLong outSz=inputSz*rate+32;
|
d.setOut(buffer,BLOCKSZ);
|
||||||
dprintf("Try decompress with BufferLength: %d\n",(int)outSz);
|
int ret=d.run(Z_NO_FLUSH);
|
||||||
|
switch(ret)
|
||||||
char* buffer=(char*)malloc(outSz);
|
|
||||||
if(!buffer)
|
|
||||||
{
|
{
|
||||||
dprintf("Failed to malloc buffer with size=%d\n",(int)outSz);
|
case Z_NEED_DICT:
|
||||||
|
case Z_DATA_ERROR:
|
||||||
|
case Z_MEM_ERROR:
|
||||||
|
dprintf("Failed to decode. ret=%d\n",ret);
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
memset(buffer,0,outSz);
|
|
||||||
|
|
||||||
std::shared_ptr<char> xp;
|
int realsz=BLOCKSZ-d.get().avail_out;
|
||||||
xp.reset(buffer,free);
|
result.append(string((char*)buffer,realsz));
|
||||||
|
} while (d.get().avail_out==0);
|
||||||
|
|
||||||
if((ret=_gz_decompress_real((Byte*)holder,inputSz,(Byte*)buffer,&outSz))!=0)
|
return result;
|
||||||
{
|
|
||||||
if(ret>0)
|
|
||||||
{
|
|
||||||
dprintf("Decompress Failed. Continue with ret %d\n",ret);
|
|
||||||
rate++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dprintf("Decompress Failed: ret=%d\n",ret);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return std::string(buffer,outSz);
|
|
||||||
}
|
|
||||||
|
|
||||||
}while(true);
|
|
||||||
|
|
||||||
dprintf("Warning: Program should never reaches here.\n");
|
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
|
|
BIN
zlibwapi.dll
BIN
zlibwapi.dll
Binary file not shown.
Reference in New Issue
Block a user