LiteSetup 中的压缩解压代码。

zlib 只是对内存段进行压缩解压。对于文件,可以分段读取到内存后再操作。

compressBound 的 BUG

注意:compressBound 存在 BUG。当压缩后的大小大于原大小时,该函数返回的是压缩后的最大值,会导致内存溢出。

这个 BUG 在 LiteSetup 项目中被发现——例如压缩一个已经经过 rar 压缩的文件,就可能触发溢出。


                UnCompressBlock*	Core::UnCompressBuffer(char*buffer, unsigned int len, unsigned int len_orign)
                {
                	UnCompressBlock *ret = new UnCompressBlock;
                
                	char *dest = new char[len_orign + 10];
                
                
                	if (0 == uncompress((Bytef*)dest, (uLongf*)&len_orign, (Bytef*)buffer, len))
                	{
                		ret->buffer = dest;
                		ret->_size = len_orign;
                
                		return ret;
                	}
                
                	delete[] dest;
                    delete ret;
                	return nullptr;
                }
                
                
                CompressBlock* Core::CompressBuffer(char * buffer, unsigned int _size)
                {
                	CompressBlock *ret = new CompressBlock;
                
                	unsigned int len = compressBound((uLong)_size);
                
                	char * dest = new char[len+1024*1024];
                
                	if (compress((Bytef*)dest, (uLongf*)&len, (Bytef*)buffer, _size) == 0)
                	{
                		ret->buffer = dest;
                		ret->_size = len;
                		ret->_size_orign = _size;
                
                		return ret;
                	}
                    delete ret;
                	delete[]dest;
                	return nullptr;
                }