You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取libsolv库solvable_lookup_bin_checksum返回的无符号字符数组长度

解决libsolv中solvable_lookup_bin_checksum返回数组的长度计算问题

你的核心问题是误用了strlen处理非NULL终止的二进制数组——二进制校验和数据中可能包含0字节,strlen会提前终止计算,导致长度错误,甚至读取越界内存。

正确的长度获取方式

libsolv提供了专门的函数solv_checksum_len()来获取对应校验类型的字节长度,无需手动硬编码。步骤如下:

  1. 确保包含libsolv的checksum头文件:
#include <solv/checksum.h>
  1. 修改代码,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:32:13