Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Harden the SQLITE_DBCONFIG_LOOKASIDE interface against misuse, such as described in forum post 48f365daec. Enhancements to the SQLITE_DBCONFIG_LOOKASIDE documentation. Test cases in TH3. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
1ec4c308c76c69fba031184254fc3340 |
User & Date: | drh 2025-02-17 14:16:49.747 |
References
2025-02-17
| ||
14:27 | Harden the SQLITE_DBCONFIG_LOOKASIDE interface against misuse. This is a simplification of [1ec4c308c76c69fb] appropriate for use in a patch release. (check-in: 78c4994c1c user: drh tags: branch-3.49) | |
Context
2025-02-17
| ||
16:04 | Replace TEXE (legacy name) with T.exe (3.48+ name) in two places in makefiles. This fixes distclean of jimsh.exe in the canonical build in non-native Windows environments. (check-in: edb8a78c02 user: stephan tags: trunk) | |
14:16 | Harden the SQLITE_DBCONFIG_LOOKASIDE interface against misuse, such as described in forum post 48f365daec. Enhancements to the SQLITE_DBCONFIG_LOOKASIDE documentation. Test cases in TH3. (check-in: 1ec4c308c7 user: drh tags: trunk) | |
10:58 | Fix a typo (a missing ")") in a comment that is used to generate documentation. No changes to code. (check-in: ea21685658 user: drh tags: trunk) | |
Changes
Changes to src/main.c.
︙ | ︙ | |||
755 756 757 758 759 760 761 | /* ** Set up the lookaside buffers for a database connection. ** Return SQLITE_OK on success. ** If lookaside is already active, return SQLITE_BUSY. ** ** The sz parameter is the number of bytes in each lookaside slot. | | | | | | > > > > > | | | | | | > > > | > > | | | | | 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 | /* ** Set up the lookaside buffers for a database connection. ** Return SQLITE_OK on success. ** If lookaside is already active, return SQLITE_BUSY. ** ** The sz parameter is the number of bytes in each lookaside slot. ** The cnt parameter is the number of slots. If pBuf is NULL the ** space for the lookaside memory is obtained from sqlite3_malloc() ** or similar. If pBuf is not NULL then it is sz*cnt bytes of memory ** to use for the lookaside memory. */ static int setupLookaside( sqlite3 *db, /* Database connection being configured */ void *pBuf, /* Memory to use for lookaside. May be NULL */ int sz, /* Desired size of each lookaside memory slot */ int cnt /* Number of slots to allocate */ ){ #ifndef SQLITE_OMIT_LOOKASIDE void *pStart; /* Start of the lookaside buffer */ sqlite3_int64 szAlloc; /* Total space set aside for lookaside memory */ int nBig; /* Number of full-size slots */ int nSm; /* Number smaller LOOKASIDE_SMALL-byte slots */ if( sqlite3LookasideUsed(db,0)>0 ){ return SQLITE_BUSY; } /* Free any existing lookaside buffer for this handle before ** allocating a new one so we don't have to have space for ** both at the same time. */ if( db->lookaside.bMalloced ){ sqlite3_free(db->lookaside.pStart); } /* The size of a lookaside slot after ROUNDDOWN8 needs to be larger ** than a pointer and small enough to fit in a u16. */ sz = ROUNDDOWN8(sz); if( sz<=(int)sizeof(LookasideSlot*) ) sz = 0; if( sz>65528 ) sz = 65528; /* Count must be at least 1 to be useful, but not so large as to use ** more than 0x7fff0000 total bytes for lookaside. */ if( cnt<1 ) cnt = 0; if( sz>0 && cnt>(0x7fff0000/sz) ) cnt = 0x7fff0000/sz; szAlloc = (i64)sz*(i64)cnt; if( szAlloc==0 ){ sz = 0; pStart = 0; }else if( pBuf==0 ){ sqlite3BeginBenignMalloc(); pStart = sqlite3Malloc( szAlloc ); sqlite3EndBenignMalloc(); if( pStart ) szAlloc = sqlite3MallocSize(pStart); }else{ pStart = pBuf; } #ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE if( sz>=LOOKASIDE_SMALL*3 ){ nBig = szAlloc/(3*LOOKASIDE_SMALL+sz); nSm = (szAlloc - (i64)sz*(i64)nBig)/LOOKASIDE_SMALL; }else if( sz>=LOOKASIDE_SMALL*2 ){ nBig = szAlloc/(LOOKASIDE_SMALL+sz); nSm = (szAlloc - (i64)sz*(i64)nBig)/LOOKASIDE_SMALL; }else #endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ if( sz>0 ){ nBig = szAlloc/sz; nSm = 0; }else{ nBig = nSm = 0; |
︙ | ︙ |
Changes to src/sqlite.h.in.
︙ | ︙ | |||
1985 1986 1987 1988 1989 1990 1991 | ** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then ** the entire mutexing subsystem is omitted from the build and hence calls to ** [sqlite3_config()] with the SQLITE_CONFIG_GETMUTEX configuration option will ** return [SQLITE_ERROR].</dd> ** ** [[SQLITE_CONFIG_LOOKASIDE]] <dt>SQLITE_CONFIG_LOOKASIDE</dt> ** <dd> ^(The SQLITE_CONFIG_LOOKASIDE option takes two arguments that determine | | | | | | | > > > | 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 | ** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then ** the entire mutexing subsystem is omitted from the build and hence calls to ** [sqlite3_config()] with the SQLITE_CONFIG_GETMUTEX configuration option will ** return [SQLITE_ERROR].</dd> ** ** [[SQLITE_CONFIG_LOOKASIDE]] <dt>SQLITE_CONFIG_LOOKASIDE</dt> ** <dd> ^(The SQLITE_CONFIG_LOOKASIDE option takes two arguments that determine ** the default size of [lookaside memory] on each [database connection]. ** The first argument is the ** size of each lookaside buffer slot ("sz") and the second is the number of ** slots allocated to each database connection ("cnt").)^ ** ^(SQLITE_CONFIG_LOOKASIDE sets the <i>default</i> lookaside size. ** The [SQLITE_DBCONFIG_LOOKASIDE] option to [sqlite3_db_config()] can ** be used to change the lookaside configuration on individual connections.)^ ** The [-DSQLITE_DEFAULT_LOOKASIDE] option can be used to change the ** default lookaside configuration at compile-time. ** </dd> ** ** [[SQLITE_CONFIG_PCACHE2]] <dt>SQLITE_CONFIG_PCACHE2</dt> ** <dd> ^(The SQLITE_CONFIG_PCACHE2 option takes a single argument which is ** a pointer to an [sqlite3_pcache_methods2] object. This object specifies ** the interface to a custom page cache implementation.)^ ** ^SQLite makes a copy of the [sqlite3_pcache_methods2] object.</dd> ** |
︙ | ︙ | |||
2228 2229 2230 2231 2232 2233 2234 | ** non-zero [error code] if a discontinued or unsupported configuration option ** is invoked. ** ** <dl> ** [[SQLITE_DBCONFIG_LOOKASIDE]] ** <dt>SQLITE_DBCONFIG_LOOKASIDE</dt> ** <dd> The SQLITE_DBCONFIG_LOOKASIDE option is used to adjust the | | > | < | | > | > > > > > > > > > > | | | < | < | | > > > > > > > > > > | 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 | ** non-zero [error code] if a discontinued or unsupported configuration option ** is invoked. ** ** <dl> ** [[SQLITE_DBCONFIG_LOOKASIDE]] ** <dt>SQLITE_DBCONFIG_LOOKASIDE</dt> ** <dd> The SQLITE_DBCONFIG_LOOKASIDE option is used to adjust the ** configuration of the [lookaside memory allocator] within a database ** connection. ** The arguments to the SQLITE_DBCONFIG_LOOKASIDE option are <i>not</i> ** in the [DBCONFIG arguments|usual format]. ** The SQLITE_DBCONFIG_LOOKASIDE option takes three arguments, not two, ** so that a call to [sqlite3_db_config()] that uses SQLITE_DBCONFIG_LOOKASIDE ** should have a total of five parameters. ** <ol> ** <li><p>The first argument ("buf") is a ** pointer to a memory buffer to use for lookaside memory. ** The first argument may be NULL in which case SQLite will allocate the ** lookaside buffer itself using [sqlite3_malloc()]. ** <li><P>The second argument ("sz") is the ** size of each lookaside buffer slot. Lookaside is disabled if "sz" ** is less than 8. The "sz" argument should be a multiple of 8 less than ** 65536. If "sz" does not meet this constraint, it is reduced in size until ** it does. ** <li><p>The third argument ("cnt") is the number of slots. Lookaside is disabled ** if "cnt"is less than 1. The "cnt" value will be reduced, if necessary, so ** that the product of "sz" and "cnt" does not exceed 2,147,418,112. The "cnt" ** parameter is usually chosen so that the product of "sz" and "cnt" is less ** than 1,000,000. ** </ol> ** <p>If the "buf" argument is not NULL, then it must ** point to a memory buffer with a size that is greater than ** or equal to the product of "sz" and "cnt". ** The buffer must be aligned to an 8-byte boundary. ** The lookaside memory ** configuration for a database connection can only be changed when that ** connection is not currently using lookaside memory, or in other words ** when the value returned by [SQLITE_DBSTATUS_LOOKASIDE_USED] is zero. ** Any attempt to change the lookaside memory configuration when lookaside ** memory is in use leaves the configuration unchanged and returns ** [SQLITE_BUSY]. ** If the "buf" argument is NULL and an attempt ** to allocate memory based on "sz" and "cnt" fails, then ** lookaside is silently disabled. ** <p> ** The [SQLITE_CONFIG_LOOKASIDE] configuration option can be used to set the ** default lookaside configuration at initialization. The ** [-DSQLITE_DEFAULT_LOOKASIDE] option can be used to set the default lookaside ** configuration at compile-time. Typical values for lookaside are 1200 for ** "sz" and 40 to 100 for "cnt". ** </dd> ** ** [[SQLITE_DBCONFIG_ENABLE_FKEY]] ** <dt>SQLITE_DBCONFIG_ENABLE_FKEY</dt> ** <dd> ^This option is used to enable or disable the enforcement of ** [foreign key constraints]. This is the same setting that is ** enabled or disabled by the [PRAGMA foreign_keys] statement. ** The first argument is an integer which is 0 to disable FK enforcement, |
︙ | ︙ |