首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用LZ4解压缩时,如何知道输出缓冲区太小?

当使用LZ4解压缩时,如何知道输出缓冲区太小?
EN

Stack Overflow用户
提问于 2017-02-08 13:42:30
回答 1查看 2.4K关注 0票数 4

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);

但没有具体说明如何区分该问题是否存在于太小的目标缓冲区,还是与格式错误的输入/参数/.

在不知道目标解压缩大小的情况下,如何知道是否应该使用更大的缓冲区重试?

EN

回答 1

Stack Overflow用户

发布于 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分配马克·阿德勒的回答,这对于小输入是合理的。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42114762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档