libarchive项目中的内存处理问题分析与修复
2025-06-25 17:35:21作者:史锋燃Gardner
问题概述
在libarchive项目的bsdtar工具中发现了一个内存处理问题,该问题存在于处理GNU长链接名称(header_gnu_longlink)的功能中。当处理特殊构造的tar归档文件时,可能导致内存异常访问,进而引发程序异常或潜在的风险。
技术背景
libarchive是一个广泛使用的多格式存档和压缩库,支持多种常见存档格式如tar、zip、cpio等。bsdtar是基于libarchive构建的命令行工具,用于创建和提取存档文件。
在GNU tar格式中,'K'类型头用于存储长链接名称。当处理这类头信息时,bsdtar会调用header_gnu_longlink函数来读取并设置链接路径。
问题详情
问题的根本原因在于header_gnu_longlink函数中缺少对read_body_to_string函数返回值的完整性检查。当读取长链接名称出现异常时,代码会直接尝试使用可能无效的字符串缓冲区,导致内存访问异常。
具体来说,问题出现在以下代码流程中:
- 初始化archive_string结构体
- 调用read_body_to_string读取链接名称
- 如果读取异常,函数会直接使用linkpath.s的内容
- 最终调用archive_entry_set_link设置链接路径
问题影响
该问题可能导致:
- 内存访问异常
- 资源释放问题
- 处理特殊构造的tar文件时程序异常
修复方案
修复方案主要包括两个关键修改:
- 添加对read_body_to_string返回值的检查
- 在异常路径中正确释放已分配的字符串资源
修复后的header_gnu_longlink函数逻辑如下:
- 初始化archive_string结构体
- 调用read_body_to_string读取链接名称
- 如果读取异常,释放字符串资源并返回错误
- 如果读取成功,设置链接路径并释放资源
验证与测试
验证该修复需要以下步骤:
- 构建带有内存检查工具的libarchive
- 使用特殊构造的测试文件触发问题
- 确认修复后程序正确处理异常情况而不发生内存访问问题
测试结果表明,修复后的版本能够正确检测到不完整的归档文件并妥善处理异常,不再出现内存访问异常或资源释放问题。
安全建议
对于使用libarchive的开发者和用户,建议:
- 及时更新到包含此修复的版本
- 在处理不可信的归档文件时保持谨慎
- 考虑在关键应用中启用内存检查工具进行额外保护
该问题的发现和修复过程展示了开源社区协作解决技术问题的典型流程,从问题报告到验证修复,最终确保了软件的稳定性和可靠性。
登录后查看全文
热门项目推荐
相关项目推荐
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0172
cann-learning-hubCANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。Jupyter Notebook098
Step-3.7-FlashStep-3.7-Flash是一个拥有 1980 亿参数的稀疏混合专家(MoE)视觉语言模型,由 1960 亿参数的语言主干网络和 18 亿参数的视觉编码器组合而成,具备原生图像理解能力。Python00
BitCPM-CANN-8BBitCPM-CANN 是首个基于华为昇腾 NPU 原生构建的端到端 1.58 位(三值化)大语言模型训练系统。该系统将量化感知训练(QAT)集成到 Megatron-LM 框架中,并结合 MindSpeed 加速,覆盖了从自定义三值算子到基于昇腾 910B 的分布式并行训练的完整训练栈。Python00
MiniCPM5-1BMiniCPM5-1B,这是 MiniCPM5 系列的首款模型。它是一个专为端侧、本地部署和资源受限场景打造的 10 亿参数密集型 Transformer 模型,达到了 10 亿参数级开源模型的 SOTA 水平Jinja00
skillhubopenJiuwen 生态的 Skill 托管与分发开源方案,支持自建与可选 ClawHub 兼容。Python0239
热门内容推荐
最新内容推荐
项目优选
收起
暂无描述
Dockerfile
750
4.87 K
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
841
1.84 K
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
642
1.28 K
Ascend Extension for PyTorch
Python
689
834
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
451
419
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.02 K
1.04 K
Claude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed.
Get Started
Rust
1.59 K
172
CANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。
Python
956
561
昇腾LLM分布式训练框架
Python
173
212
暂无简介
Dart
998
259