sisong / HDiffPatch

a C\C++ library and command-line tools for Diff & Patch between binary files or directories(folder); cross-platform; runs fast; create small delta/differential; support large files and limit memory requires when diff & patch.
Other
1.56k stars 287 forks source link

_zlib_decompress存在UB行为 #310

Closed Pippinrao closed 2 years ago

Pippinrao commented 2 years ago

_zlib_decompress_open_by分配内存_mem_buf,对其进行对齐操作后赋值给self(_mem_buf可能不等于self)返回,该内存试图在_zlib_decompress_close时free,但是调用的是free(self),若self != _mem_buf(malloc的内存没有对齐时),这是未定义的行为,可能会导致进程coredump.

sisong commented 2 years ago

这里做了一个不太好的约定:malloc返回地址必须8字节对齐 (大多数手册里的声明确实保证这个或至少支持内部类型); 所以实际代码还是安全的。

_zlib_decompress_open_by支持随便什么内存区都可以给它用,不必是malloc申请的;和它配对的是 _zlib_decompress_close_by,并不释放内存。

sisong commented 2 years ago

@Pippinrao 修复这个不必要和危险的耦合的代码已经提交,*by的2个配对函数也放到了一起,减少误用几率。
你看看提交。

Pippinrao commented 2 years ago

@sisong 约定总是不安全的,特别是嵌入式的情况下分配没对齐的内存还是有可能出现的

Ps: 修复的速度也太快了,我还准备自己提交修改一下~

sisong commented 2 years ago

谢谢 反馈的问题

“我还准备自己提交修改一下”
欢迎继续提交代码上来