3月13日,发布了紧凑型嵌入式数据库管理系统3.51.3的修正版本。 SQLite项目代码用 C 语言编写,并以公共领域发布。
由于某些新功能存在向后兼容性问题,版本 3.52.0 (3月6日发布)已被撤回。
3.51.3版本变更列表:
- 3月3日,SQLite开发人员之一(Dan)发现并修复了一个在极少数情况下可能导致数据库损坏的漏洞,该漏洞被称为 WA 重置错误:
- 仅当数据库以 WAL 模式运行时,如果两个或多个连接在不同的线程或进程中打开到同一个文件,并且这两个连接同时尝试写入或创建检查点,才会出现此错误。
- 该错误与严格时间限制下的数据访问冲突有关。在正常运行条件下,这种情况极其罕见。开发人员无法在实际环境中重现该错误,因此被迫在 SQLite 中添加特殊的测试逻辑,人为地制造错误发生的条件,以确保问题得到解决。
- 错误发生于:
- 一个连接执行检查点操作。第一个检查点必须完成。换句话说,检查点必须成功地将 WAL 文件的全部内容复制回数据库,并使 WAL 文件处于可以刷新的状态。
- 第一个检查点完成后,第二个检查点立即启动。
- 在步骤 2 的第二个检查点运行时,另一个数据库连接提交一个事务,该事务会刷新 WAL 文件并将新内容写入 WAL 文件的开头。
- 由于数据访问冲突,步骤 2 中的第二个检查点没有考虑到步骤 3 中的事务提交导致 WAL 文件被刷新。第二个检查点为 WAL 索引头中的一个字段设置了错误的值。该字段指示 WAL 文件的一部分在检查点时已经提交,但实际上并非如此。
- 提交额外的事务会导致 WAL 文件中的页数超过步骤 1 中第一个检查点时存在的页数。
- 后来,当第三个检查点出现时,它会跳过阶段 3 中写入的全部或部分事务。因此,阶段 3 中的部分事务永远不会进入数据库文件,从而导致数据库文件损坏。
- 该漏洞似乎存在于所有 SQLite 版本中,从 3.7.0 (2010-07-21) 到 3.51.2 均有发现。一些早期版本也已发布了热修复程序: 3.44.6 и 3.50.7.
- 其他一些小问题需要修复。
来源: linux.org.ru
