跳到正文
参考文档 / ZLIB × LEAN

历史证据登记

此页源文件快照 · b2ededd96d1515ec · 对应提交的原文 ↗

本页保留早期翻译和契约工作中的观察,不是当前固定版本新确认缺陷的清单。旧笔记包含补丁提案、源码解读,以及证据级别不同的运行报告。不能因为反复提及就提升其证据标签。

当前确认的上游问题需要允许输入、保留的复现和真实 C 的 sanitizer 运行。它应在根 README 中说明范围和可信度,并在 docs/findings/ 下保留复现。本登记不会虚构缺失复现文件。进度是当前调查和剩余工作的唯一清单。

早期库观察

先看每行中间一列的证据类型,再看现象。源码解读、历史运行报告、保留的可重跑复现和当前已确认问题,证据强度不同;函数名只是定位入口。右列说明该现象发生在哪类输入或调用顺序下。

下表记录早期工作的报告。若完整复现或日志未保留在当前树中,链接分析只证明曾有报告,不是针对当前源码可重新运行的确认。每项记录分别说明现象、证据来源和仍缺少的执行或语言语义论证。

观察 保留资料与可信度 报告范围
gzsetparams 可记录内部压缩器未接受的变更 早期发现文字报告两次独立运行:级别 6 的 16640–16660 个随机字节,请求级别 0,再输入 200000 个零字节,生成约 16.9 KB、仍被压缩的文件。Gzip 证明指南保留机制,但标为候选。历史状态的不一致不等于当前确认。 普通参数变更;仍可产生有效数据。契约审阅要求成功的有效变更到达内部压缩器。
crc32_combine_op 对任意操作符可能不终止 早期文字报告 1UL << 32 的两次超时运行;CRC 源码分析记录运行过 crc32_combine_op(1, 2, 1UL << 32)。这里未保留独立复现。 非 crc32_combine_gen 生成的操作符。文档规定的生成操作符定义域另当别论;这不是该域内失败的证据。
gz_fetch 可在部分读取后失败时保留陈旧源指针 gz 分析记录早期 address-sanitizer 越界读和已提交修复。翻译说明简述原因。属于历史 sanitizer 报告,本次文档重写未独立重跑。 读取部分数据后的错误。普通文件世界模型不覆盖所有这类外部读取序列。
在位置零 gzungetc 后 gzseek 可能发生有符号位置算术溢出 gz 分析记录早期 undefined-behaviour-sanitizer 运行和边界检查提案。属于历史 sanitizer 报告,没有链接保留的独立复现。 负逻辑位置和大 seek 算术。不能据此限制广泛 seek 目标。
gzflush(..., Z_FINISH) 失败后清错可能先于输出丢失 早期文字报告之后继续写入、成功关闭,但文件为空。gz 分析提供源码背景;此前含复现的长函数叙述已不保留。仅为报告的观察。 错误恢复和写入器生命周期。不改变另外证明的 gzclearerr 清错效果。
inflateCopy 比较无关对象内的指针 inflate 分析记录固定表与状态表比较、指针比较 sanitizer 运行和 17 个差分差异。历史源码和执行报告;仍需建立当前路径的可达性和 C 有定义性。 复制停在固定块内的流。实际预期行为不能解决指针比较是否有定义。
越过末尾的 gzseek 可与 gztell 不一致,并保留 EOF 早期文字报告一个五字节 gzip 文件:再向前定位五字节返回 10,tell 返回 5,EOF 保持;透明文件行为不同。gz 分析保留位置和待跳过操作背景。属于报告的 API 特性,没有独立保留复现。 输入结束后的逻辑位置。是否违反公开契约需另行审阅。
较小 inflate 窗口可能让成功依赖输出分块 早期文字报告一个 20000 字节流:单次调用提供足够输出空间时接受,较小窗口配合每次 100 字节调用时拒绝。inflate API说明窗口定义域。属于文档所述小窗口限制的历史观察,不是上游缺陷。 窗口小于流所需大小。不能据此声称任意小窗口都能解码每个有效流。

早期记录的调用者定义域问题

压缩侧分析和 inflate 分析记录这些情况。分类取决于公开 API 允许什么;这里没有将任何一项提升为确认缺陷。

情况 历史问题与证据边界
compress2 和 uncompress2 的空长度指针 兼容包装在 _z 检查前读取标量单元。分配回归现保留空读取见证。诊断出空读取不等于调用者允许传入 NULL。
deflateCopy(&s, &s) 报告原拥有状态丢失;源和目标相同是否被允许需要契约审阅。
inflateGetHeader(strm, NULL) 报告空指针解引用;空头部的调用者定义域需审阅。
deflateSetDictionary 与 total_in 字典字节计入计数器。此前对“输入字节”的解释可能排除了它们;文档含义与操作细化必须区分。
后期 deflatePrime 和 deflateSetHeader C 可接受超出文档顺序的调用,之后的头部解引用可能无效。接受调用本身不让序列成为文档用法。
deflateResetKeep 与预置字典输出 保留历史可使下一流请求字典。需使用文档中的 reset 语义,不能假设每种 reset 都产生全新历史。

模型与规范证据

这些记录涉及形式化或其解释,不是库安全性发现。以下链接测试是保留的执行或诊断证据;本页不声称为文档改动重跑过它们。

记录 保留证据 含义
后期 inflate 内存失败可发生在输出之后 分配回归记录截断 zlib 前缀以 Z_MEM_ERROR 返回,具有一个输出字节和两个已存计数。早期运行还记录窗口分配失败时指针已前进,而流总数和校验和不变。 内存错误不等于没有输出。契约审阅记录修正后的工具关系,以及 init 失败和后期失败不同的标量效果。
已消费的预读内容不一定全部描述有效流 延迟距离回归保留 raw 字节 73 04 42 00:一次调用输出 A,下一次在不消费更多输入时拒绝不可能距离。 此前对全部预读内容的规范过强。审阅后的支持前缀条件是模型修正,不是 zlib 缺陷。
负 priming 值保留低位 priming 回归比较有符号值和边界位计数下的实际调用。 把负数映射到零是规范错误。有限一致性不是一般细化证明。
压缩器自动存储不能消耗分配失败 分配回归保留失败索引、缓冲区、存活块观察及旧翻译的变异。 额外分配是翻译缺陷。空目标指针减法仍是独立的 C 有定义性问题。
静态 CRC 输入现有表示出的地址 正向回归保留此前反例中有效的 47 字节静态表读取,并检查两个 CRC 入口。 翻译模型的拒绝已修复,没有缩小校验和调用者定义域。这不是上游缺陷;通用 ABI 与别名限制仍存在。
Gz 状态可保留指向调用者缓冲区的指针 gz 分析记录直接解压后的加零算术,以及调用者可能释放缓冲区的情况。没有报告 sanitizer 诊断。 指针生命周期和模型悬空指针检查需单独推理。旧补丁提案不是已应用源码,也不是确认的证据。

运行时审阅记录其他表示缺口,包括新鲜指针在模型中为 NULL,以及固定任意初值。可信基础给出当前义务。历史审阅结论既不是独立基线批准,也不是完整安全性和正确性证明。

ZLIB × LEAN

全局目录

当前位置历史证据登记