1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-07 02:42:48 +03:00

Code changes that make it easier to prove that no 32-bit integer overflows

happen during memory allocation.  No problems fixed; this change is just
to make future maintenance easier.

FossilOrigin-Name: 215650a5a1d55bdbca9c92524804a1a54456a17f42a17e53747b21a6507506f5
This commit is contained in:
drh
2025-02-17 17:33:14 +00:00
parent ad5dcff53b
commit ef86b942b9
21 changed files with 111 additions and 85 deletions

View File

@@ -1,5 +1,5 @@
C Add\stwo\sgenerated\sfiles\sto\sthe\sdistclean\srules\sof\sthe\sautoconf\sbundle. C Code\schanges\sthat\smake\sit\seasier\sto\sprove\sthat\sno\s32-bit\sinteger\soverflows\nhappen\sduring\smemory\sallocation.\s\sNo\sproblems\sfixed;\sthis\schange\sis\sjust\nto\smake\sfuture\smaintenance\seasier.
D 2025-02-17T16:14:15.880 D 2025-02-17T17:33:14.937
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@@ -713,26 +713,26 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
F sqlite3.1 acdff36db796e2d00225b911d3047d580cd136547298435426ce9d40347973cc F sqlite3.1 acdff36db796e2d00225b911d3047d580cd136547298435426ce9d40347973cc
F sqlite3.pc.in 0977c03a4da7c4204bd60e784a0efb8d51a190448aba78a4e973fe7192bdaf03 F sqlite3.pc.in 0977c03a4da7c4204bd60e784a0efb8d51a190448aba78a4e973fe7192bdaf03
F src/alter.c 1751e231d8385067fa0d0145f0d461a092db6bd3d7edbfc3172db625aceccd9a F src/alter.c 1751e231d8385067fa0d0145f0d461a092db6bd3d7edbfc3172db625aceccd9a
F src/analyze.c 0823d2edb3ce564157e9d62714cc729027933209b712e95fbabb23e47fff0aec F src/analyze.c 6d27b425a16817975e6a4f8501e531d13dd1bf4b53bff2329dbc1f301aeef82d
F src/attach.c 3a5cb9ee4aad6c5b22268287340a4f2f7b07959b7a522201be30fee23cd802e9 F src/attach.c c36d9d82811e2274bd06bf3b34459e36d8ae8a7f32efa5cbf3f890eef08a9987
F src/auth.c 54ab9c6c5803b47c0d45b76ce27eff22a03b4b1f767c5945a3a4eb13aa4c78dc F src/auth.c 54ab9c6c5803b47c0d45b76ce27eff22a03b4b1f767c5945a3a4eb13aa4c78dc
F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523 F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523
F src/bitvec.c 9eac5f42c11914d5ef00a75605bb205e934f435c579687f985f1f8b0995c8645 F src/bitvec.c d64aa60cd5f2721ebd6c155b3ac5ff7342086bead485239d57342cdfdccb9f50
F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522
F src/btree.c 63ca6b647342e8cef643863cd0962a542f133e1069460725ba4461dcda92b03c F src/btree.c 9316859aa5f14bde4a3719ffb1570219e51c5de433221e38b87ea19db868aedf
F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50 F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50
F src/btreeInt.h 98aadb6dcb77b012cab2574d6a728fad56b337fc946839b9898c4b4c969e30b6 F src/btreeInt.h 98aadb6dcb77b012cab2574d6a728fad56b337fc946839b9898c4b4c969e30b6
F src/build.c 602fc45ea6301a3dc03ec20a9f9b294c492b7e1766ae96651f2ba8044dc445a6 F src/build.c 2fa35745a279e2a17eec6df67a3cd35d456c136a7f5c75e80bdd6c5658423b60
F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859 F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
F src/date.c 842c08ac143a56a627b05ac51d68624f2b7b03e3b4cba596205e735eed64ee57 F src/date.c 842c08ac143a56a627b05ac51d68624f2b7b03e3b4cba596205e735eed64ee57
F src/dbpage.c 2e677acb658a29965e55398bbc61161cb7819da538057c8032adac7ab8e4a8c0 F src/dbpage.c 2e677acb658a29965e55398bbc61161cb7819da538057c8032adac7ab8e4a8c0
F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c
F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42
F src/expr.c ca943270395374afc65256ce86cdb152a22fa6ff146895175833b89ba870e117 F src/expr.c 6e0635f3e3761f368d10e77d26d29a1a521ab208f1be66e84c13354ffbcf5ad2
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f
F src/func.c 838bb4c02065daef6ef359cf294e6b6f95a73d4ff0159240a4710478bae80e1c F src/func.c 6c8b7bbdc5b588f3cfc79ed5effcfd3031758f5034c464fcd8891e8010b4d317
F src/global.c a19e4b1ca1335f560e9560e590fc13081e21f670643367f99cb9e8f9dc7d615b F src/global.c a19e4b1ca1335f560e9560e590fc13081e21f670643367f99cb9e8f9dc7d615b
F src/hash.c 73934a7f7ab1cb110614a9388cb516893b0cf5b7b69e4fd1a0780ac4ce166be7 F src/hash.c 73934a7f7ab1cb110614a9388cb516893b0cf5b7b69e4fd1a0780ac4ce166be7
F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf
@@ -749,7 +749,7 @@ F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
F src/mem2.c c8bfc9446fd0798bddd495eb5d9dbafa7d4b7287d8c22d50a83ac9daa26d8a75 F src/mem2.c c8bfc9446fd0798bddd495eb5d9dbafa7d4b7287d8c22d50a83ac9daa26d8a75
F src/mem3.c 30301196cace2a085cbedee1326a49f4b26deff0af68774ca82c1f7c06fda4f6 F src/mem3.c 30301196cace2a085cbedee1326a49f4b26deff0af68774ca82c1f7c06fda4f6
F src/mem5.c b7da5c10a726aacacc9ad7cdcb0667deec643e117591cc69cf9b4b9e7f3e96ff F src/mem5.c b7da5c10a726aacacc9ad7cdcb0667deec643e117591cc69cf9b4b9e7f3e96ff
F src/memdb.c 16679def118b5fd75292a253166d3feba3ec9c6189205bf209643ecdb2174ecc F src/memdb.c a3feb427cdd4036ea2db0ba56d152f14c8212ca760ccb05fb7aa49ff6b897df3
F src/memjournal.c c283c6c95d940eb9dc70f1863eef3ee40382dbd35e5a1108026e7817c206e8a0 F src/memjournal.c c283c6c95d940eb9dc70f1863eef3ee40382dbd35e5a1108026e7817c206e8a0
F src/msvc.h 80b35f95d93bf996ccb3e498535255f2ef1118c78764719a7cd15ab4106ccac9 F src/msvc.h 80b35f95d93bf996ccb3e498535255f2ef1118c78764719a7cd15ab4106ccac9
F src/mutex.c 06bcd9c3dbf2d9b21fcd182606c00fafb9bfe0287983c8e17acd13d2c81a2fa9 F src/mutex.c 06bcd9c3dbf2d9b21fcd182606c00fafb9bfe0287983c8e17acd13d2c81a2fa9
@@ -764,17 +764,17 @@ F src/os_common.h 6c0eb8dd40ef3e12fe585a13e709710267a258e2c8dd1c40b1948a1d14582e
F src/os_kv.c 4d39e1f1c180b11162c6dc4aa8ad34053873a639bac6baae23272fc03349986a F src/os_kv.c 4d39e1f1c180b11162c6dc4aa8ad34053873a639bac6baae23272fc03349986a
F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d872107 F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d872107
F src/os_unix.c 4c73f89479d90412cb736a180e9ef89ac1495a158753a7f5de1260c197bc8e1f F src/os_unix.c 4c73f89479d90412cb736a180e9ef89ac1495a158753a7f5de1260c197bc8e1f
F src/os_win.c 49c7725b500f5867e8360e75eeb30f9d70b62fa1f05c8a101da627210578df32 F src/os_win.c 2423a45e70c2cda01bfc84106f7e9f34feb1add42121ab2e35a67ba24589ac52
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
F src/pager.c 3a1c4e7f69af482e33c8cba8a75afe0dda0ea6391240adac22b040ce1bdeef44 F src/pager.c 8d73e7a0ebbecd8bb4996ff285cc055cec56b7e3edb5a4609d0748e0fa39d28a
F src/pager.h 6137149346e6c8a3ddc1eeb40aee46381e9bc8b0fcc6dda8a1efde993c2275b8 F src/pager.h 6137149346e6c8a3ddc1eeb40aee46381e9bc8b0fcc6dda8a1efde993c2275b8
F src/parse.y f84673f1454e2bcf517623d4346e67fb2d73e57826ea103681ad5848238f6029 F src/parse.y f84673f1454e2bcf517623d4346e67fb2d73e57826ea103681ad5848238f6029
F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484
F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5 F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5
F src/pcache1.c 49516ad7718a3626f28f710fa7448ef1fce3c07fd169acbb4817341950264319 F src/pcache1.c 78d4935e510f7bed0fdd1a3f742c0e663b36a795f9dc7411161dc22bdae1245e
F src/pragma.c c7ada272232e1182c4536d9637fa7b955a10bc1bd8d5a87d4dc9309dab827791 F src/pragma.c c7ada272232e1182c4536d9637fa7b955a10bc1bd8d5a87d4dc9309dab827791
F src/prepare.c 1832be043fce7d489959aae6f994c452d023914714c4d5457beaed51c0f3d126 F src/prepare.c 1832be043fce7d489959aae6f994c452d023914714c4d5457beaed51c0f3d126
F src/printf.c 96f7f8baeedc7639da94e4e7a4a2c200e2537c4eec9e5e1c2ffc821f40eb3105 F src/printf.c b9ac740dfaf68552f5da1266be28ae2824b53a6b73d93425f7c6b2ef62457cbb
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
F src/resolve.c 626c24b258b111f75c22107aa5614ad89810df3026f5ca071116d3fe75925c75 F src/resolve.c 626c24b258b111f75c22107aa5614ad89810df3026f5ca071116d3fe75925c75
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
@@ -783,7 +783,7 @@ F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf323
F src/sqlite.h.in 8d4486fb28a90de818ac1e8c6206ea458e7de6bd8e0dfa3d554494f155be8c01 F src/sqlite.h.in 8d4486fb28a90de818ac1e8c6206ea458e7de6bd8e0dfa3d554494f155be8c01
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54
F src/sqliteInt.h 8cbfef6c26efd539eb93011905f4d3ce7fdb77475d1280764d86f9e7954c464b F src/sqliteInt.h 020aff180111b7dfe5bbdf8e59e8595c195b956488e9ca955f876cb7482e6de5
F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523
F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -847,19 +847,19 @@ F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba
F src/util.c 9ff6470dabcf943fd796d2da766c98bd328c8f6fe036a31e5b338e628603f989 F src/util.c 9ff6470dabcf943fd796d2da766c98bd328c8f6fe036a31e5b338e628603f989
F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40 F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40
F src/vdbe.c 063763e08f1ad00890b7377fc663dbccec85a47630f5d2bbb13f3fdf77e06f78 F src/vdbe.c e7567bed441a53c4ceb48d2bdf3d1747677fc296a91e8d2a0fe8facdb9b890ce
F src/vdbe.h 3d26d5c7660c5c7bd33ffb0d8784615072d8b23c81f8110870efe2631136bc89 F src/vdbe.h 3d26d5c7660c5c7bd33ffb0d8784615072d8b23c81f8110870efe2631136bc89
F src/vdbeInt.h 078b1c15b26587b54c1c1879d0d2f4dec812b9de4c337fed9faf73fbcc3bf091 F src/vdbeInt.h 078b1c15b26587b54c1c1879d0d2f4dec812b9de4c337fed9faf73fbcc3bf091
F src/vdbeapi.c 82fe278a7c71b653235c6f9fb5de0b5de589908dfcb011ba2a782e8becf06f86 F src/vdbeapi.c cb8eb9e41a16f5fa3ce5b8f3910edfbba336d10156cfb7a79f92cf7bf443977b
F src/vdbeaux.c 541d3d232714455960eab4ed10b34cb48b4bcd565d7539ef31092f5e73648e6b F src/vdbeaux.c d7ef1a0a7233589d789eda1ba9ffa4b0ea61fca9651e4f47fb4250d03d62bcaf
F src/vdbeblob.c 9166b6eb7054e5da82e35255892fb1ed551355a4716452539e8e3ac14f25fbe3 F src/vdbeblob.c 9166b6eb7054e5da82e35255892fb1ed551355a4716452539e8e3ac14f25fbe3
F src/vdbemem.c 4af21a948820259ced96e3d46d70f9af347afa2deb7cb60a8b3981d5748e4279 F src/vdbemem.c 571ae3116dbf840a62c4aaa6bc09d577dfef8ad4d3978cf37275bb5f9653217b
F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f F src/vdbesort.c 3e8e6340ec5f68909a975031081102471300eaec9791d081b5443822e1061cda
F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823
F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3
F src/vtab.c 828221bdbeaaa6d62126ee6d07fd4ec0d09dcaea846f87ad01944d8b7e548859 F src/vtab.c 828221bdbeaaa6d62126ee6d07fd4ec0d09dcaea846f87ad01944d8b7e548859
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.c cefdffc112c767c79596d9c0d15cb4de27071132e9b8a0fce323b140cd4af683
F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452
F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014
F src/where.c 09dc313e7223ca1217c39c7026b00f16ff449a8323511a762fcba7863a00f4cd F src/where.c 09dc313e7223ca1217c39c7026b00f16ff449a8323511a762fcba7863a00f4cd
@@ -2207,8 +2207,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P edb8a78c0238f085eefbf86aa7777528f36f3400d4ef096ffd6855cf3321a97b P b59d0ebb22e4ca2f3a7a73dd49a0c142dbca538cb1b4eafd35a78bac87c6c456
R 35984cc59a3a13710af92ec281a18a95 R a324a0ad4ec5bff22beea8348186f31d
U stephan U drh
Z b005a16738a1a2fa13fe8f4e242441b2 Z e55663a48a3fa77210e8f8e7032e8f31
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
b59d0ebb22e4ca2f3a7a73dd49a0c142dbca538cb1b4eafd35a78bac87c6c456 215650a5a1d55bdbca9c92524804a1a54456a17f42a17e53747b21a6507506f5

View File

@@ -407,7 +407,7 @@ static void statInit(
int nCol; /* Number of columns in index being sampled */ int nCol; /* Number of columns in index being sampled */
int nKeyCol; /* Number of key columns */ int nKeyCol; /* Number of key columns */
int nColUp; /* nCol rounded up for alignment */ int nColUp; /* nCol rounded up for alignment */
int n; /* Bytes of space to allocate */ i64 n; /* Bytes of space to allocate */
sqlite3 *db = sqlite3_context_db_handle(context); /* Database connection */ sqlite3 *db = sqlite3_context_db_handle(context); /* Database connection */
#ifdef SQLITE_ENABLE_STAT4 #ifdef SQLITE_ENABLE_STAT4
/* Maximum number of samples. 0 if STAT4 data is not collected */ /* Maximum number of samples. 0 if STAT4 data is not collected */

View File

@@ -156,7 +156,7 @@ static void attachFunc(
if( aNew==0 ) return; if( aNew==0 ) return;
memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2); memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2);
}else{ }else{
aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(db->nDb+1) ); aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(1+(i64)db->nDb));
if( aNew==0 ) return; if( aNew==0 ) return;
} }
db->aDb = aNew; db->aDb = aNew;

View File

@@ -344,7 +344,7 @@ int sqlite3BitvecBuiltinTest(int sz, int *aOp){
/* Allocate the Bitvec to be tested and a linear array of /* Allocate the Bitvec to be tested and a linear array of
** bits to act as the reference */ ** bits to act as the reference */
pBitvec = sqlite3BitvecCreate( sz ); pBitvec = sqlite3BitvecCreate( sz );
pV = sqlite3MallocZero( (sz+7)/8 + 1 ); pV = sqlite3MallocZero( (7+(i64)sz)/8 + 1 );
pTmpSpace = sqlite3_malloc64(BITVEC_SZ); pTmpSpace = sqlite3_malloc64(BITVEC_SZ);
if( pBitvec==0 || pV==0 || pTmpSpace==0 ) goto bitvec_end; if( pBitvec==0 || pV==0 || pTmpSpace==0 ) goto bitvec_end;

View File

@@ -729,7 +729,7 @@ static int saveCursorKey(BtCursor *pCur){
** below. */ ** below. */
void *pKey; void *pKey;
pCur->nKey = sqlite3BtreePayloadSize(pCur); pCur->nKey = sqlite3BtreePayloadSize(pCur);
pKey = sqlite3Malloc( pCur->nKey + 9 + 8 ); pKey = sqlite3Malloc( ((i64)pCur->nKey) + 9 + 8 );
if( pKey ){ if( pKey ){
rc = sqlite3BtreePayload(pCur, 0, (int)pCur->nKey, pKey); rc = sqlite3BtreePayload(pCur, 0, (int)pCur->nKey, pKey);
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
@@ -6100,7 +6100,7 @@ bypass_moveto_root:
rc = SQLITE_CORRUPT_PAGE(pPage); rc = SQLITE_CORRUPT_PAGE(pPage);
goto moveto_index_finish; goto moveto_index_finish;
} }
pCellKey = sqlite3Malloc( nCell+nOverrun ); pCellKey = sqlite3Malloc( (u64)nCell+(u64)nOverrun );
if( pCellKey==0 ){ if( pCellKey==0 ){
rc = SQLITE_NOMEM_BKPT; rc = SQLITE_NOMEM_BKPT;
goto moveto_index_finish; goto moveto_index_finish;
@@ -11289,6 +11289,7 @@ int sqlite3BtreeIsInBackup(Btree *p){
*/ */
void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void *)){ void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void *)){
BtShared *pBt = p->pBt; BtShared *pBt = p->pBt;
assert( nBytes==0 || nBytes==sizeof(Schema) );
sqlite3BtreeEnter(p); sqlite3BtreeEnter(p);
if( !pBt->pSchema && nBytes ){ if( !pBt->pSchema && nBytes ){
pBt->pSchema = sqlite3DbMallocZero(0, nBytes); pBt->pSchema = sqlite3DbMallocZero(0, nBytes);

View File

@@ -68,6 +68,7 @@ static SQLITE_NOINLINE void lockTable(
} }
} }
assert( pToplevel->nTableLock < 0x7fff0000 );
nBytes = sizeof(TableLock) * (pToplevel->nTableLock+1); nBytes = sizeof(TableLock) * (pToplevel->nTableLock+1);
pToplevel->aTableLock = pToplevel->aTableLock =
sqlite3DbReallocOrFree(pToplevel->db, pToplevel->aTableLock, nBytes); sqlite3DbReallocOrFree(pToplevel->db, pToplevel->aTableLock, nBytes);
@@ -2089,7 +2090,8 @@ static void identPut(char *z, int *pIdx, char *zSignedIdent){
** from sqliteMalloc() and must be freed by the calling function. ** from sqliteMalloc() and must be freed by the calling function.
*/ */
static char *createTableStmt(sqlite3 *db, Table *p){ static char *createTableStmt(sqlite3 *db, Table *p){
int i, k, n; int i, k, len;
i64 n;
char *zStmt; char *zStmt;
char *zSep, *zSep2, *zEnd; char *zSep, *zSep2, *zEnd;
Column *pCol; Column *pCol;
@@ -2113,8 +2115,9 @@ static char *createTableStmt(sqlite3 *db, Table *p){
sqlite3OomFault(db); sqlite3OomFault(db);
return 0; return 0;
} }
sqlite3_snprintf(n, zStmt, "CREATE TABLE "); assert( n>14 && n<=0x7fffffff );
k = sqlite3Strlen30(zStmt); memcpy(zStmt, "CREATE TABLE ", 13);
k = 13;
identPut(zStmt, &k, p->zName); identPut(zStmt, &k, p->zName);
zStmt[k++] = '('; zStmt[k++] = '(';
for(pCol=p->aCol, i=0; i<p->nCol; i++, pCol++){ for(pCol=p->aCol, i=0; i<p->nCol; i++, pCol++){
@@ -2126,13 +2129,15 @@ static char *createTableStmt(sqlite3 *db, Table *p){
/* SQLITE_AFF_REAL */ " REAL", /* SQLITE_AFF_REAL */ " REAL",
/* SQLITE_AFF_FLEXNUM */ " NUM", /* SQLITE_AFF_FLEXNUM */ " NUM",
}; };
int len;
const char *zType; const char *zType;
sqlite3_snprintf(n-k, &zStmt[k], zSep); len = sqlite3Strlen30(zSep);
k += sqlite3Strlen30(&zStmt[k]); assert( k+len<n );
memcpy(&zStmt[k], zSep, len);
k += len;
zSep = zSep2; zSep = zSep2;
identPut(zStmt, &k, pCol->zCnName); identPut(zStmt, &k, pCol->zCnName);
assert( k<n );
assert( pCol->affinity-SQLITE_AFF_BLOB >= 0 ); assert( pCol->affinity-SQLITE_AFF_BLOB >= 0 );
assert( pCol->affinity-SQLITE_AFF_BLOB < ArraySize(azType) ); assert( pCol->affinity-SQLITE_AFF_BLOB < ArraySize(azType) );
testcase( pCol->affinity==SQLITE_AFF_BLOB ); testcase( pCol->affinity==SQLITE_AFF_BLOB );
@@ -2147,11 +2152,14 @@ static char *createTableStmt(sqlite3 *db, Table *p){
assert( pCol->affinity==SQLITE_AFF_BLOB assert( pCol->affinity==SQLITE_AFF_BLOB
|| pCol->affinity==SQLITE_AFF_FLEXNUM || pCol->affinity==SQLITE_AFF_FLEXNUM
|| pCol->affinity==sqlite3AffinityType(zType, 0) ); || pCol->affinity==sqlite3AffinityType(zType, 0) );
assert( k+len<n );
memcpy(&zStmt[k], zType, len); memcpy(&zStmt[k], zType, len);
k += len; k += len;
assert( k<=n ); assert( k<=n );
} }
sqlite3_snprintf(n-k, &zStmt[k], "%s", zEnd); len = sqlite3Strlen30(zEnd);
assert( k+len<n );
memcpy(&zStmt[k], zEnd, len+1);
return zStmt; return zStmt;
} }
@@ -3845,7 +3853,7 @@ Index *sqlite3AllocateIndexObject(
char **ppExtra /* Pointer to the "extra" space */ char **ppExtra /* Pointer to the "extra" space */
){ ){
Index *p; /* Allocated index object */ Index *p; /* Allocated index object */
int nByte; /* Bytes of space for Index object + arrays */ i64 nByte; /* Bytes of space for Index object + arrays */
nByte = ROUND8(sizeof(Index)) + /* Index structure */ nByte = ROUND8(sizeof(Index)) + /* Index structure */
ROUND8(sizeof(char*)*nCol) + /* Index.azColl */ ROUND8(sizeof(char*)*nCol) + /* Index.azColl */

View File

@@ -3369,7 +3369,7 @@ static char *exprINAffinity(Parse *pParse, const Expr *pExpr){
char *zRet; char *zRet;
assert( pExpr->op==TK_IN ); assert( pExpr->op==TK_IN );
zRet = sqlite3DbMallocRaw(pParse->db, nVal+1); zRet = sqlite3DbMallocRaw(pParse->db, 1+(i64)nVal);
if( zRet ){ if( zRet ){
int i; int i;
for(i=0; i<nVal; i++){ for(i=0; i<nVal; i++){

View File

@@ -1420,7 +1420,7 @@ static void replaceFunc(
assert( zRep==sqlite3_value_text(argv[2]) ); assert( zRep==sqlite3_value_text(argv[2]) );
nOut = nStr + 1; nOut = nStr + 1;
assert( nOut<SQLITE_MAX_LENGTH ); assert( nOut<SQLITE_MAX_LENGTH );
zOut = contextMalloc(context, (i64)nOut); zOut = contextMalloc(context, nOut);
if( zOut==0 ){ if( zOut==0 ){
return; return;
} }

View File

@@ -567,13 +567,13 @@ static int memdbOpen(
} }
if( p==0 ){ if( p==0 ){
MemStore **apNew; MemStore **apNew;
p = sqlite3Malloc( sizeof(*p) + szName + 3 ); p = sqlite3Malloc( sizeof(*p) + (i64)szName + 3 );
if( p==0 ){ if( p==0 ){
sqlite3_mutex_leave(pVfsMutex); sqlite3_mutex_leave(pVfsMutex);
return SQLITE_NOMEM; return SQLITE_NOMEM;
} }
apNew = sqlite3Realloc(memdb_g.apMemStore, apNew = sqlite3Realloc(memdb_g.apMemStore,
sizeof(apNew[0])*(memdb_g.nMemStore+1) ); sizeof(apNew[0])*(1+(i64)memdb_g.nMemStore) );
if( apNew==0 ){ if( apNew==0 ){
sqlite3_free(p); sqlite3_free(p);
sqlite3_mutex_leave(pVfsMutex); sqlite3_mutex_leave(pVfsMutex);

View File

@@ -3938,7 +3938,7 @@ static int winOpenSharedMemory(winFile *pDbFd){
p = sqlite3MallocZero( sizeof(*p) ); p = sqlite3MallocZero( sizeof(*p) );
if( p==0 ) return SQLITE_IOERR_NOMEM_BKPT; if( p==0 ) return SQLITE_IOERR_NOMEM_BKPT;
nName = sqlite3Strlen30(pDbFd->zPath); nName = sqlite3Strlen30(pDbFd->zPath);
pNew = sqlite3MallocZero( sizeof(*pShmNode) + nName + 17 ); pNew = sqlite3MallocZero( sizeof(*pShmNode) + (i64)nName + 17 );
if( pNew==0 ){ if( pNew==0 ){
sqlite3_free(p); sqlite3_free(p);
return SQLITE_IOERR_NOMEM_BKPT; return SQLITE_IOERR_NOMEM_BKPT;
@@ -4759,7 +4759,7 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){
size_t i, j; size_t i, j;
DWORD pid; DWORD pid;
int nPre = sqlite3Strlen30(SQLITE_TEMP_FILE_PREFIX); int nPre = sqlite3Strlen30(SQLITE_TEMP_FILE_PREFIX);
int nMax, nBuf, nDir, nLen; i64 nMax, nBuf, nDir, nLen;
char *zBuf; char *zBuf;
/* It's odd to simulate an io-error here, but really this is just /* It's odd to simulate an io-error here, but really this is just
@@ -4771,7 +4771,8 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){
/* Allocate a temporary buffer to store the fully qualified file /* Allocate a temporary buffer to store the fully qualified file
** name for the temporary file. If this fails, we cannot continue. ** name for the temporary file. If this fails, we cannot continue.
*/ */
nMax = pVfs->mxPathname; nBuf = nMax + 2; nMax = pVfs->mxPathname;
nBuf = 2 + (i64)nMax;
zBuf = sqlite3MallocZero( nBuf ); zBuf = sqlite3MallocZero( nBuf );
if( !zBuf ){ if( !zBuf ){
OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n"));
@@ -5630,7 +5631,7 @@ static int winFullPathnameNoMutex(
** for converting the relative path name to an absolute ** for converting the relative path name to an absolute
** one by prepending the data directory and a slash. ** one by prepending the data directory and a slash.
*/ */
char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 ); char *zOut = sqlite3MallocZero( 1+(u64)pVfs->mxPathname );
if( !zOut ){ if( !zOut ){
return SQLITE_IOERR_NOMEM_BKPT; return SQLITE_IOERR_NOMEM_BKPT;
} }
@@ -5725,13 +5726,12 @@ static int winFullPathnameNoMutex(
return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(),
"winFullPathname1", zRelative); "winFullPathname1", zRelative);
} }
nByte += 3; zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) + 3*sizeof(zTemp[0]) );
zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) );
if( zTemp==0 ){ if( zTemp==0 ){
sqlite3_free(zConverted); sqlite3_free(zConverted);
return SQLITE_IOERR_NOMEM_BKPT; return SQLITE_IOERR_NOMEM_BKPT;
} }
nByte = osGetFullPathNameW((LPCWSTR)zConverted, nByte, zTemp, 0); nByte = osGetFullPathNameW((LPCWSTR)zConverted, nByte+3, zTemp, 0);
if( nByte==0 ){ if( nByte==0 ){
sqlite3_free(zConverted); sqlite3_free(zConverted);
sqlite3_free(zTemp); sqlite3_free(zTemp);
@@ -5751,13 +5751,12 @@ static int winFullPathnameNoMutex(
return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(),
"winFullPathname3", zRelative); "winFullPathname3", zRelative);
} }
nByte += 3; zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) + 3*sizeof(zTemp[0]) );
zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) );
if( zTemp==0 ){ if( zTemp==0 ){
sqlite3_free(zConverted); sqlite3_free(zConverted);
return SQLITE_IOERR_NOMEM_BKPT; return SQLITE_IOERR_NOMEM_BKPT;
} }
nByte = osGetFullPathNameA((char*)zConverted, nByte, zTemp, 0); nByte = osGetFullPathNameA((char*)zConverted, nByte+3, zTemp, 0);
if( nByte==0 ){ if( nByte==0 ){
sqlite3_free(zConverted); sqlite3_free(zConverted);
sqlite3_free(zTemp); sqlite3_free(zTemp);

View File

@@ -1291,7 +1291,7 @@ static void checkPage(PgHdr *pPg){
** If an error occurs while reading from the journal file, an SQLite ** If an error occurs while reading from the journal file, an SQLite
** error code is returned. ** error code is returned.
*/ */
static int readSuperJournal(sqlite3_file *pJrnl, char *zSuper, u32 nSuper){ static int readSuperJournal(sqlite3_file *pJrnl, char *zSuper, u64 nSuper){
int rc; /* Return code */ int rc; /* Return code */
u32 len; /* Length in bytes of super-journal name */ u32 len; /* Length in bytes of super-journal name */
i64 szJ; /* Total size in bytes of journal file pJrnl */ i64 szJ; /* Total size in bytes of journal file pJrnl */
@@ -2527,12 +2527,12 @@ static int pager_delsuper(Pager *pPager, const char *zSuper){
char *zJournal; /* Pointer to one journal within MJ file */ char *zJournal; /* Pointer to one journal within MJ file */
char *zSuperPtr; /* Space to hold super-journal filename */ char *zSuperPtr; /* Space to hold super-journal filename */
char *zFree = 0; /* Free this buffer */ char *zFree = 0; /* Free this buffer */
int nSuperPtr; /* Amount of space allocated to zSuperPtr[] */ i64 nSuperPtr; /* Amount of space allocated to zSuperPtr[] */
/* Allocate space for both the pJournal and pSuper file descriptors. /* Allocate space for both the pJournal and pSuper file descriptors.
** If successful, open the super-journal file for reading. ** If successful, open the super-journal file for reading.
*/ */
pSuper = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile * 2); pSuper = (sqlite3_file *)sqlite3MallocZero(2 * (i64)pVfs->szOsFile);
if( !pSuper ){ if( !pSuper ){
rc = SQLITE_NOMEM_BKPT; rc = SQLITE_NOMEM_BKPT;
pJournal = 0; pJournal = 0;
@@ -2550,11 +2550,14 @@ static int pager_delsuper(Pager *pPager, const char *zSuper){
*/ */
rc = sqlite3OsFileSize(pSuper, &nSuperJournal); rc = sqlite3OsFileSize(pSuper, &nSuperJournal);
if( rc!=SQLITE_OK ) goto delsuper_out; if( rc!=SQLITE_OK ) goto delsuper_out;
nSuperPtr = pVfs->mxPathname+1; nSuperPtr = 1 + (i64)pVfs->mxPathname;
assert( nSuperJournal>=0 && nSuperPtr>0 );
zFree = sqlite3Malloc(4 + nSuperJournal + nSuperPtr + 2); zFree = sqlite3Malloc(4 + nSuperJournal + nSuperPtr + 2);
if( !zFree ){ if( !zFree ){
rc = SQLITE_NOMEM_BKPT; rc = SQLITE_NOMEM_BKPT;
goto delsuper_out; goto delsuper_out;
}else{
assert( nSuperJournal<=0x7fffffff );
} }
zFree[0] = zFree[1] = zFree[2] = zFree[3] = 0; zFree[0] = zFree[1] = zFree[2] = zFree[3] = 0;
zSuperJournal = &zFree[4]; zSuperJournal = &zFree[4];
@@ -2815,7 +2818,7 @@ static int pager_playback(Pager *pPager, int isHot){
** for pageSize. ** for pageSize.
*/ */
zSuper = pPager->pTmpSpace; zSuper = pPager->pTmpSpace;
rc = readSuperJournal(pPager->jfd, zSuper, pPager->pVfs->mxPathname+1); rc = readSuperJournal(pPager->jfd, zSuper, 1+(i64)pPager->pVfs->mxPathname);
if( rc==SQLITE_OK && zSuper[0] ){ if( rc==SQLITE_OK && zSuper[0] ){
rc = sqlite3OsAccess(pVfs, zSuper, SQLITE_ACCESS_EXISTS, &res); rc = sqlite3OsAccess(pVfs, zSuper, SQLITE_ACCESS_EXISTS, &res);
} }
@@ -2954,7 +2957,7 @@ end_playback:
** which case it requires 4 0x00 bytes in memory immediately before ** which case it requires 4 0x00 bytes in memory immediately before
** the filename. */ ** the filename. */
zSuper = &pPager->pTmpSpace[4]; zSuper = &pPager->pTmpSpace[4];
rc = readSuperJournal(pPager->jfd, zSuper, pPager->pVfs->mxPathname+1); rc = readSuperJournal(pPager->jfd, zSuper, 1+(i64)pPager->pVfs->mxPathname);
testcase( rc!=SQLITE_OK ); testcase( rc!=SQLITE_OK );
} }
if( rc==SQLITE_OK if( rc==SQLITE_OK
@@ -4725,6 +4728,7 @@ int sqlite3PagerOpen(
const char *zUri = 0; /* URI args to copy */ const char *zUri = 0; /* URI args to copy */
int nUriByte = 1; /* Number of bytes of URI args at *zUri */ int nUriByte = 1; /* Number of bytes of URI args at *zUri */
/* Figure out how much space is required for each journal file-handle /* Figure out how much space is required for each journal file-handle
** (there are two of them, the main journal and the sub-journal). */ ** (there are two of them, the main journal and the sub-journal). */
journalFileSize = ROUND8(sqlite3JournalSize(pVfs)); journalFileSize = ROUND8(sqlite3JournalSize(pVfs));
@@ -4751,7 +4755,7 @@ int sqlite3PagerOpen(
if( zFilename && zFilename[0] ){ if( zFilename && zFilename[0] ){
const char *z; const char *z;
nPathname = pVfs->mxPathname + 1; nPathname = pVfs->mxPathname + 1;
zPathname = sqlite3DbMallocRaw(0, nPathname*2); zPathname = sqlite3DbMallocRaw(0, 2*(i64)nPathname);
if( zPathname==0 ){ if( zPathname==0 ){
return SQLITE_NOMEM_BKPT; return SQLITE_NOMEM_BKPT;
} }
@@ -4838,14 +4842,14 @@ int sqlite3PagerOpen(
ROUND8(sizeof(*pPager)) + /* Pager structure */ ROUND8(sizeof(*pPager)) + /* Pager structure */
ROUND8(pcacheSize) + /* PCache object */ ROUND8(pcacheSize) + /* PCache object */
ROUND8(pVfs->szOsFile) + /* The main db file */ ROUND8(pVfs->szOsFile) + /* The main db file */
journalFileSize * 2 + /* The two journal files */ (u64)journalFileSize * 2 + /* The two journal files */
SQLITE_PTRSIZE + /* Space to hold a pointer */ SQLITE_PTRSIZE + /* Space to hold a pointer */
4 + /* Database prefix */ 4 + /* Database prefix */
nPathname + 1 + /* database filename */ (u64)nPathname + 1 + /* database filename */
nUriByte + /* query parameters */ (u64)nUriByte + /* query parameters */
nPathname + 8 + 1 + /* Journal filename */ (u64)nPathname + 8 + 1 + /* Journal filename */
#ifndef SQLITE_OMIT_WAL #ifndef SQLITE_OMIT_WAL
nPathname + 4 + 1 + /* WAL filename */ (u64)nPathname + 4 + 1 + /* WAL filename */
#endif #endif
3 /* Terminator */ 3 /* Terminator */
); );

View File

@@ -538,12 +538,12 @@ static int pcache1UnderMemoryPressure(PCache1 *pCache){
*/ */
static void pcache1ResizeHash(PCache1 *p){ static void pcache1ResizeHash(PCache1 *p){
PgHdr1 **apNew; PgHdr1 **apNew;
unsigned int nNew; u64 nNew;
unsigned int i; u32 i;
assert( sqlite3_mutex_held(p->pGroup->mutex) ); assert( sqlite3_mutex_held(p->pGroup->mutex) );
nNew = p->nHash*2; nNew = 2*(u64)p->nHash;
if( nNew<256 ){ if( nNew<256 ){
nNew = 256; nNew = 256;
} }
@@ -766,7 +766,7 @@ static void pcache1Destroy(sqlite3_pcache *p);
static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){
PCache1 *pCache; /* The newly created page cache */ PCache1 *pCache; /* The newly created page cache */
PGroup *pGroup; /* The group the new page cache will belong to */ PGroup *pGroup; /* The group the new page cache will belong to */
int sz; /* Bytes of memory required to allocate the new cache */ i64 sz; /* Bytes of memory required to allocate the new cache */
assert( (szPage & (szPage-1))==0 && szPage>=512 && szPage<=65536 ); assert( (szPage & (szPage-1))==0 && szPage>=512 && szPage<=65536 );
assert( szExtra < 300 ); assert( szExtra < 300 );

View File

@@ -1057,7 +1057,7 @@ void sqlite3_str_appendall(sqlite3_str *p, const char *z){
static SQLITE_NOINLINE char *strAccumFinishRealloc(StrAccum *p){ static SQLITE_NOINLINE char *strAccumFinishRealloc(StrAccum *p){
char *zText; char *zText;
assert( p->mxAlloc>0 && !isMalloced(p) ); assert( p->mxAlloc>0 && !isMalloced(p) );
zText = sqlite3DbMallocRaw(p->db, p->nChar+1 ); zText = sqlite3DbMallocRaw(p->db, 1+(u64)p->nChar );
if( zText ){ if( zText ){
memcpy(zText, p->zText, p->nChar+1); memcpy(zText, p->zText, p->nChar+1);
p->printfFlags |= SQLITE_PRINTF_MALLOCED; p->printfFlags |= SQLITE_PRINTF_MALLOCED;

View File

@@ -1016,6 +1016,14 @@ typedef INT16_TYPE LogEst;
#define LARGEST_UINT64 (0xffffffff|(((u64)0xffffffff)<<32)) #define LARGEST_UINT64 (0xffffffff|(((u64)0xffffffff)<<32))
#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) #define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64)
/*
** Macro SMXV(n) return the maximum value that can be held in variable n,
** assuming n is a signed integer type. UMXV(n) is similar for unsigned
** integer types.
*/
#define SMXV(n) ((((i64)1)<<(sizeof(n)-1))-1)
#define UMXV(n) ((((i64)1)<<(sizeof(n)))-1)
/* /*
** Round up a number to the next larger multiple of 8. This is used ** Round up a number to the next larger multiple of 8. This is used
** to force 8-byte alignment on 64-bit architectures. ** to force 8-byte alignment on 64-bit architectures.

View File

@@ -276,7 +276,7 @@ static VdbeCursor *allocateCursor(
*/ */
Mem *pMem = iCur>0 ? &p->aMem[p->nMem-iCur] : p->aMem; Mem *pMem = iCur>0 ? &p->aMem[p->nMem-iCur] : p->aMem;
int nByte; i64 nByte;
VdbeCursor *pCx = 0; VdbeCursor *pCx = 0;
nByte = nByte =
ROUND8P(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField + ROUND8P(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField +
@@ -304,7 +304,7 @@ static VdbeCursor *allocateCursor(
pMem->szMalloc = 0; pMem->szMalloc = 0;
return 0; return 0;
} }
pMem->szMalloc = nByte; pMem->szMalloc = (int)nByte;
} }
p->apCsr[iCur] = pCx = (VdbeCursor*)pMem->zMalloc; p->apCsr[iCur] = pCx = (VdbeCursor*)pMem->zMalloc;
@@ -7325,7 +7325,7 @@ case OP_RowSetTest: { /* jump, in1, in3 */
*/ */
case OP_Program: { /* jump0 */ case OP_Program: { /* jump0 */
int nMem; /* Number of memory registers for sub-program */ int nMem; /* Number of memory registers for sub-program */
int nByte; /* Bytes of runtime space required for sub-program */ i64 nByte; /* Bytes of runtime space required for sub-program */
Mem *pRt; /* Register to allocate runtime space */ Mem *pRt; /* Register to allocate runtime space */
Mem *pMem; /* Used to iterate through memory cells */ Mem *pMem; /* Used to iterate through memory cells */
Mem *pEnd; /* Last memory cell in new array */ Mem *pEnd; /* Last memory cell in new array */
@@ -7376,7 +7376,7 @@ case OP_Program: { /* jump0 */
nByte = ROUND8(sizeof(VdbeFrame)) nByte = ROUND8(sizeof(VdbeFrame))
+ nMem * sizeof(Mem) + nMem * sizeof(Mem)
+ pProgram->nCsr * sizeof(VdbeCursor*) + pProgram->nCsr * sizeof(VdbeCursor*)
+ (pProgram->nOp + 7)/8; + (7 + (i64)pProgram->nOp)/8;
pFrame = sqlite3DbMallocZero(db, nByte); pFrame = sqlite3DbMallocZero(db, nByte);
if( !pFrame ){ if( !pFrame ){
goto no_mem; goto no_mem;
@@ -7384,7 +7384,7 @@ case OP_Program: { /* jump0 */
sqlite3VdbeMemRelease(pRt); sqlite3VdbeMemRelease(pRt);
pRt->flags = MEM_Blob|MEM_Dyn; pRt->flags = MEM_Blob|MEM_Dyn;
pRt->z = (char*)pFrame; pRt->z = (char*)pFrame;
pRt->n = nByte; pRt->n = (int)nByte;
pRt->xDel = sqlite3VdbeFrameMemDel; pRt->xDel = sqlite3VdbeFrameMemDel;
pFrame->v = p; pFrame->v = p;

View File

@@ -2233,7 +2233,9 @@ int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppValue){
Column *pCol = &p->pTab->aCol[iIdx]; Column *pCol = &p->pTab->aCol[iIdx];
if( pCol->iDflt>0 ){ if( pCol->iDflt>0 ){
if( p->apDflt==0 ){ if( p->apDflt==0 ){
int nByte = sizeof(sqlite3_value*)*p->pTab->nCol; int nByte;
assert( sizeof(sqlite3_value*)*UMXV(p->pTab->nCol) < 0x7fffffff );
nByte = sizeof(sqlite3_value*)*p->pTab->nCol;
p->apDflt = (sqlite3_value**)sqlite3DbMallocZero(db, nByte); p->apDflt = (sqlite3_value**)sqlite3DbMallocZero(db, nByte);
if( p->apDflt==0 ) goto preupdate_old_out; if( p->apDflt==0 ) goto preupdate_old_out;
} }
@@ -2383,6 +2385,7 @@ int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppValue){
*/ */
assert( p->op==SQLITE_UPDATE ); assert( p->op==SQLITE_UPDATE );
if( !p->aNew ){ if( !p->aNew ){
assert( sizeof(Mem)*UMXV(p->pCsr->nField) < 0x7fffffff );
p->aNew = (Mem *)sqlite3DbMallocZero(db, sizeof(Mem)*p->pCsr->nField); p->aNew = (Mem *)sqlite3DbMallocZero(db, sizeof(Mem)*p->pCsr->nField);
if( !p->aNew ){ if( !p->aNew ){
rc = SQLITE_NOMEM; rc = SQLITE_NOMEM;

View File

@@ -726,7 +726,7 @@ static Op *opIterNext(VdbeOpIter *p){
} }
if( pRet->p4type==P4_SUBPROGRAM ){ if( pRet->p4type==P4_SUBPROGRAM ){
int nByte = (p->nSub+1)*sizeof(SubProgram*); i64 nByte = (1+(u64)p->nSub)*sizeof(SubProgram*);
int j; int j;
for(j=0; j<p->nSub; j++){ for(j=0; j<p->nSub; j++){
if( p->apSub[j]==pRet->p4.pProgram ) break; if( p->apSub[j]==pRet->p4.pProgram ) break;
@@ -1198,7 +1198,7 @@ void sqlite3VdbeScanStatus(
const char *zName /* Name of table or index being scanned */ const char *zName /* Name of table or index being scanned */
){ ){
if( IS_STMT_SCANSTATUS(p->db) ){ if( IS_STMT_SCANSTATUS(p->db) ){
sqlite3_int64 nByte = (p->nScan+1) * sizeof(ScanStatus); i64 nByte = (1+(i64)p->nScan) * sizeof(ScanStatus);
ScanStatus *aNew; ScanStatus *aNew;
aNew = (ScanStatus*)sqlite3DbRealloc(p->db, p->aScan, nByte); aNew = (ScanStatus*)sqlite3DbRealloc(p->db, p->aScan, nByte);
if( aNew ){ if( aNew ){
@@ -4219,6 +4219,7 @@ UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(
){ ){
UnpackedRecord *p; /* Unpacked record to return */ UnpackedRecord *p; /* Unpacked record to return */
int nByte; /* Number of bytes required for *p */ int nByte; /* Number of bytes required for *p */
assert( sizeof(UnpackedRecord) + sizeof(Mem)*65536 < 0x7fffffff );
nByte = ROUND8P(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nKeyField+1); nByte = ROUND8P(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nKeyField+1);
p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte);
if( !p ) return 0; if( !p ) return 0;

View File

@@ -1440,7 +1440,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){
if( pRec==0 ){ if( pRec==0 ){
Index *pIdx = p->pIdx; /* Index being probed */ Index *pIdx = p->pIdx; /* Index being probed */
int nByte; /* Bytes of space to allocate */ i64 nByte; /* Bytes of space to allocate */
int i; /* Counter variable */ int i; /* Counter variable */
int nCol = pIdx->nColumn; /* Number of index columns including rowid */ int nCol = pIdx->nColumn; /* Number of index columns including rowid */
@@ -1506,7 +1506,7 @@ static int valueFromFunction(
){ ){
sqlite3_context ctx; /* Context object for function invocation */ sqlite3_context ctx; /* Context object for function invocation */
sqlite3_value **apVal = 0; /* Function arguments */ sqlite3_value **apVal = 0; /* Function arguments */
int nVal = 0; /* Size of apVal[] array */ int nVal = 0; /* Number of function arguments */
FuncDef *pFunc = 0; /* Function definition */ FuncDef *pFunc = 0; /* Function definition */
sqlite3_value *pVal = 0; /* New value */ sqlite3_value *pVal = 0; /* New value */
int rc = SQLITE_OK; /* Return code */ int rc = SQLITE_OK; /* Return code */

View File

@@ -936,7 +936,7 @@ int sqlite3VdbeSorterInit(
VdbeSorter *pSorter; /* The new sorter */ VdbeSorter *pSorter; /* The new sorter */
KeyInfo *pKeyInfo; /* Copy of pCsr->pKeyInfo with db==0 */ KeyInfo *pKeyInfo; /* Copy of pCsr->pKeyInfo with db==0 */
int szKeyInfo; /* Size of pCsr->pKeyInfo in bytes */ int szKeyInfo; /* Size of pCsr->pKeyInfo in bytes */
int sz; /* Size of pSorter in bytes */ i64 sz; /* Size of pSorter in bytes */
int rc = SQLITE_OK; int rc = SQLITE_OK;
#if SQLITE_MAX_WORKER_THREADS==0 #if SQLITE_MAX_WORKER_THREADS==0
# define nWorker 0 # define nWorker 0
@@ -964,6 +964,8 @@ int sqlite3VdbeSorterInit(
assert( pCsr->pKeyInfo ); assert( pCsr->pKeyInfo );
assert( !pCsr->isEphemeral ); assert( !pCsr->isEphemeral );
assert( pCsr->eCurType==CURTYPE_SORTER ); assert( pCsr->eCurType==CURTYPE_SORTER );
assert( sizeof(KeyInfo) + UMXV(pCsr->pKeyInfo->nKeyField)*sizeof(CollSeq*)
< 0x7fffffff );
szKeyInfo = sizeof(KeyInfo) + (pCsr->pKeyInfo->nKeyField-1)*sizeof(CollSeq*); szKeyInfo = sizeof(KeyInfo) + (pCsr->pKeyInfo->nKeyField-1)*sizeof(CollSeq*);
sz = sizeof(VdbeSorter) + nWorker * sizeof(SortSubtask); sz = sizeof(VdbeSorter) + nWorker * sizeof(SortSubtask);
@@ -1177,7 +1179,7 @@ static int vdbeSorterJoinAll(VdbeSorter *pSorter, int rcin){
*/ */
static MergeEngine *vdbeMergeEngineNew(int nReader){ static MergeEngine *vdbeMergeEngineNew(int nReader){
int N = 2; /* Smallest power of two >= nReader */ int N = 2; /* Smallest power of two >= nReader */
int nByte; /* Total bytes of space to allocate */ i64 nByte; /* Total bytes of space to allocate */
MergeEngine *pNew; /* Pointer to allocated object to return */ MergeEngine *pNew; /* Pointer to allocated object to return */
assert( nReader<=SORTER_MAX_MERGE_COUNT ); assert( nReader<=SORTER_MAX_MERGE_COUNT );

View File

@@ -753,7 +753,7 @@ static SQLITE_NOINLINE int walIndexPageRealloc(
/* Enlarge the pWal->apWiData[] array if required */ /* Enlarge the pWal->apWiData[] array if required */
if( pWal->nWiData<=iPage ){ if( pWal->nWiData<=iPage ){
sqlite3_int64 nByte = sizeof(u32*)*(iPage+1); sqlite3_int64 nByte = sizeof(u32*)*(1+(i64)iPage);
volatile u32 **apNew; volatile u32 **apNew;
apNew = (volatile u32 **)sqlite3Realloc((void *)pWal->apWiData, nByte); apNew = (volatile u32 **)sqlite3Realloc((void *)pWal->apWiData, nByte);
if( !apNew ){ if( !apNew ){