# [CVE-REQUESTED] Stop truncating ptrdiff_t to int #304 ## 漏洞概述 该 Pull Request 旨在修复 uriparser 库中多处将 `ptrdiff_t` 类型截断为 `int` 类型的问题。`ptrdiff_t` 是用于表示指针差值的类型,在某些平台或场景下其范围可能超出 `int` 的范围。这种截断可能导致整数溢出或逻辑错误,进而引发潜在的安全问题(如缓冲区溢出或拒绝服务)。 ## 影响范围 - **组件**: `uriparser` 库 - **涉及文件**: - `src/UriCommon.c` - `src/UriNormalize.c` - `src/UriFile.c` - `src/UriQuery.c` - `src/UriRecompose.c` - `tool/uriparse.c` - **严重程度**: 安全相关(标签包含 `Bug` 和 `Security`) ## 修复方案 通过修改代码,确保 `ptrdiff_t` 类型的值被正确传递和处理,避免截断为 `int`。具体修改包括: 1. 在函数签名中使用 `size_t` 或 `ptrdiff_t` 替代 `int`。 2. 添加溢出检查逻辑,确保计算结果不会超出目标类型的范围。 3. 使用 `checked multiplication` 辅助函数避免手动溢出检查的重复。 ### 示例代码 以下是修复后的部分代码片段: ```c // src/UriCommon.c static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(URI) * uri, int maxChars, char *charsWritten, NULL) { size_t charsWrittenInternal; int result = URI_FUNC(ToStringEngine)(NULL, uri, INT_MAX, NULL, &charsWrittenInternal); if (result != URI_SUCCESS) { return result; } // We're passing INT_MAX as maxChars, thus the required chars must fit an [int]. assert(charsWrittenInternal malloc(memory, alloc_size); ``` ## 其他信息 - **状态**: Open - **里程碑**: 1.0.2 - **参与者**: hartwork, iliaal, TimWolla - **相关 Issue**: #302, #307