libzip从内存缓冲区写入Zip归档是否可靠?数据损坏排查
使用libzip通过内存缓冲区写入Zip归档时数据损坏问题
我在动态创建Zip归档时,需要将二进制数据作为文件条目写入,同时使用extra_field API添加元数据。但使用内存缓冲区方式创建zip_source时,写入的数据会出现损坏。
相关代码如下:
const std::string diff; // 从外部函数传入并初始化 zip_t z_; // 类成员,已提前初始化 const std::string f; // 虚拟文件名,由函数传入 // 使用unique_ptr管理zip_source_t的生命周期 std::unique_ptr<zip_source_t, void (*)(zip_source_t*)> p_zf( zip_source_buffer_create((const void*)diff.data(), diff.size(), 0, 0), [](zip_source_t* p) { if(p) zip_source_free(p); } ); if (!p_zf) throw exception ...; // 将文件写入归档并初始化字段 const zip_int64_t idx = zip_file_add(z_, f.c_str(), p_zf.get(), ZIP_FL_ENC_GUESS); if(-1 == idx) throw exception ...; // 写入额外字段 if(zip_file_extra_field_set(z_, idx, FS_ZIP_EXTRA_FIELD_ID, 0, (const zip_uint8_t*)&metadata, sizeof(metadata), ZIP_FL_LOCAL)) throw exception ...;
执行上述代码后,读取归档中的虚拟文件f时内容乱码,但256字节的元数据保存正常。
如果把zip_source_buffer_create替换为:
zip_source_buffer(z_, (const void*)diff.data(), diff.size(), 0)
仍会出现相同的数据损坏问题——文件大小符合预期,但内容被污染。只有通过文件系统API(zip_source_file_create)从临时文件初始化zip_source_t时,所有数据才能正常保存:
std::unique_ptr<zip_source_t, void (*)(zip_source_t*)> p_zf( zip_source_file_create(tmp_filename, 0, -1, 0), [](zip_source_t* p) { if(p) zip_source_close(p); } );
我的代码是否存在错误?diff在zip_source_buffer_create、zip_source_buffer和zip_file_add的作用域内均为const。这会不会是libzip的潜在Bug?我使用的是Ubuntu 22.04 64位系统上的libzip 1.7.3版本。
内容的提问来源于stack exchange,提问作者Emanuele
相关产品推荐
相关产品推荐

