LZ4_decompress_safe的文档显示:
/*!LZ4_decompress_safe():compressedSize :是压缩块的精确大小。maxDecompressedSize :是目标缓冲区的大小,必须已经分配。返回:将字节数解压缩到目标缓冲区(必然是<= maxDecompressedSize),如果目标缓冲区不够大,解码将停止并输出错误代码(<0)。如果检测到源流格式错误,则该函数将停止解码并返回一个负面结果。此功能可防止缓冲区溢出攻击,包括恶意数据包。它从不写入外部输出缓冲区,也不读取外部输入缓冲区。*/ LZ4LIB_API int LZ4_decompress_safe (const *LZ4_decompress_safe,char* dest,int compressedSize,int maxDecompressedSize);
但没有具体说明如何区分该问题是否存在于太小的目标缓冲区,还是与格式错误的输入/参数/.
在不知道目标解压缩大小的情况下,如何知道是否应该使用更大的缓冲区重试?
发布于 2017-02-08 13:42:30
关于这一点有一个发行开始,目前还没有公共API来区分错误。
作为一个启发式,查看代码显示了可能的返回值:
/\* end of decoding \*/ if (endOnInput) return (int) (((char\*)op)-dest); /\* Nb of output bytes decoded \*/ else return (int) (((const char\*)ip)-source); /\* Nb of input bytes read \*/ /\* Overflow error detected \*/ \_output\_error: return (int) (-(((const char\*)ip)-source))-1;
因此,只有两宗个案:
在负结果的情况下,值为-(position_in_input + 1)。
这意味着,猜测目标缓冲区是否太小,可以通过使用(更大的)更大的缓冲区重试并检查故障是否发生在同一位置,从而很有可能成功:
或者其他的说法,只要结果不同,再试一次,否则,就是你的结果。
限制
输入指针不一定一次前进一个字节,它可以在从输入和无界读取length的两个位置提前length字节。
如果由于输出缓冲区太小而导致解码失败,而新的输出缓冲区对于length来说仍然太小,那么即使输入(不一定)格式错误,解码也会以相同的位置失败。
如果假阳性是一个问题,那么人们可以尝试:
length,255 * <input size> - 2526分配马克·阿德勒的回答,这对于小输入是合理的。https://stackoverflow.com/questions/42114762
复制相似问题