如何获取libsolv库solvable_lookup_bin_checksum返回的无符号字符数组长度
解决libsolv中solvable_lookup_bin_checksum返回数组的长度计算问题
你的核心问题是误用了strlen处理非NULL终止的二进制数组——二进制校验和数据中可能包含0字节,strlen会提前终止计算,导致长度错误,甚至读取越界内存。
正确的长度获取方式
libsolv提供了专门的函数solv_checksum_len()来获取对应校验类型的字节长度,无需手动硬编码。步骤如下:
- 确保包含libsolv的checksum头文件:
#include <solv/checksum.h>
- 修改代码,用
solv_checksum_len()获取长度并正确复制:
unsigned char *pszTemp = solvable_lookup_bin_checksum(pSolv, SOLVABLE_CHECKSUM, &checksumtype); if (!pszTemp) { // 处理校验和获取失败的情况 return; // 或其他错误处理逻辑 } // 获取当前校验类型对应的字节长度 size_t checksum_len = solv_checksum_len(checksumtype); // 分配对应大小的内存(无需+1,因为是二进制数据,不需要NULL终止符) unsigned char *pszChecksum = (unsigned char *)malloc(checksum_len); if (pszChecksum) { memcpy(pszChecksum, pszTemp, checksum_len); } // 使用完校验和后记得释放内存 // free(pszChecksum);
补充说明
- 若无法使用
solv_checksum_len(),也可以根据checksumtype的值手动匹配长度:SOLVABLE_CHECKSUM_MD5:16字节SOLVABLE_CHECKSUM_SHA1:20字节SOLVABLE_CHECKSUM_SHA256:32字节SOLVABLE_CHECKSUM_SHA512:64字节
但这种方式不如调用库函数可靠,因为libsolv可能新增校验类型。
- 不要用
calloc初始化内存:二进制校验和本身可能包含0字节,初始化内存为0是多余的,直接用malloc即可。
内容的提问来源于stack exchange,提问作者shivani
相关产品推荐
相关产品推荐

