xref: /sqlite-3.40.0/test/corruptG.test (revision af3906a7)
1# 2013-08-01
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#***********************************************************************
11#
12
13set testdir [file dirname $argv0]
14source $testdir/tester.tcl
15set testprefix corruptG
16
17# This module uses hard-coded offsets which do not work if the reserved_bytes
18# value is nonzero.
19if {[nonzero_reserved_bytes]} {finish_test; return;}
20
21# These tests deal with corrupt database files
22#
23database_may_be_corrupt
24
25# Create a simple database with a single entry.  Then corrupt the
26# header-size varint on the index payload so that it maps into a
27# negative number.  Try to use the database.
28#
29
30do_execsql_test 1.1 {
31  PRAGMA page_size=512;
32  CREATE TABLE t1(a,b,c);
33  INSERT INTO t1(rowid,a,b,c) VALUES(52,'abc','xyz','123');
34  CREATE INDEX t1abc ON t1(a,b,c);
35}
36
37set idxroot [db one {SELECT rootpage FROM sqlite_master WHERE name = 't1abc'}]
38
39# Corrupt the file
40db close
41hexio_write test.db [expr {$idxroot*512 - 15}] 888080807f
42sqlite3 db test.db
43
44# Try to use the file.
45do_test 1.2 {
46  catchsql {
47    SELECT c FROM t1 WHERE a>'abc';
48  }
49} {1 {database disk image is malformed}}
50do_test 1.3 {
51  catchsql {
52     PRAGMA integrity_check
53  }
54} {1 {database disk image is malformed}}
55do_test 1.4 {
56  catchsql {
57    SELECT c FROM t1 ORDER BY a;
58  }
59} {1 {database disk image is malformed}}
60
61# Corrupt the same file in a slightly different way.  Make the record header
62# sane, but corrupt one of the serial_type value to indicate a huge payload
63# such that the payload begins in allocated space but overflows the buffer.
64#
65db close
66hexio_write test.db [expr {$idxroot*512-15}] 0513ff7f01
67sqlite3 db test.db
68
69do_test 2.1 {
70  catchsql {
71    SELECT rowid FROM t1 WHERE a='abc' and b='xyz123456789XYZ';
72  }
73} {1 {database disk image is malformed}}
74
75finish_test
76