diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/build.c | 15 | ||||
-rw-r--r-- | src/callback.c | 6 | ||||
-rw-r--r-- | src/global.c | 4 | ||||
-rw-r--r-- | src/main.c | 14 | ||||
-rw-r--r-- | src/sqliteInt.h | 4 | ||||
-rw-r--r-- | src/util.c | 16 | ||||
-rw-r--r-- | src/vdbemem.c | 15 |
7 files changed, 52 insertions, 22 deletions
diff --git a/src/build.c b/src/build.c index 8fe25968d..30037e3fa 100644 --- a/src/build.c +++ b/src/build.c @@ -22,7 +22,7 @@ ** COMMIT ** ROLLBACK ** -** $Id: build.c,v 1.486 2008/07/08 00:06:50 drh Exp $ +** $Id: build.c,v 1.487 2008/07/08 14:52:08 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> @@ -276,11 +276,13 @@ void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ Table *p = 0; int i; + int nName; assert( zName!=0 ); + nName = sqlite3Strlen(db, zName) + 1; for(i=OMIT_TEMPDB; i<db->nDb; i++){ int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ if( zDatabase!=0 && sqlite3StrICmp(zDatabase, db->aDb[j].zName) ) continue; - p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName, strlen(zName)+1); + p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName, nName); if( p ) break; } return p; @@ -338,13 +340,14 @@ Table *sqlite3LocateTable( Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const char *zDb){ Index *p = 0; int i; + int nName = sqlite3Strlen(db, zName)+1; for(i=OMIT_TEMPDB; i<db->nDb; i++){ int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ Schema *pSchema = db->aDb[j].pSchema; if( zDb && sqlite3StrICmp(zDb, db->aDb[j].zName) ) continue; assert( pSchema || (j==1 && !db->aDb[1].pBt) ); if( pSchema ){ - p = sqlite3HashFind(&pSchema->idxHash, zName, strlen(zName)+1); + p = sqlite3HashFind(&pSchema->idxHash, zName, nName); } if( p ) break; } @@ -371,7 +374,7 @@ static void sqliteDeleteIndex(Index *p){ Index *pOld; const char *zName = p->zName; - pOld = sqlite3HashInsert(&p->pSchema->idxHash, zName, strlen( zName)+1, 0); + pOld = sqlite3HashInsert(&p->pSchema->idxHash, zName, strlen(zName)+1, 0); assert( pOld==0 || pOld==p ); freeIndex(p); } @@ -387,7 +390,7 @@ void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char *zIdxName){ int len; Hash *pHash = &db->aDb[iDb].pSchema->idxHash; - len = strlen(zIdxName); + len = sqlite3Strlen(db, zIdxName); pIndex = sqlite3HashInsert(pHash, zIdxName, len+1, 0); if( pIndex ){ if( pIndex->pTable->pIndex==pIndex ){ @@ -1265,7 +1268,7 @@ CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName, int nName){ pColl = sqlite3GetCollSeq(db, pColl, zName, nName); if( !pColl ){ if( nName<0 ){ - nName = strlen(zName); + nName = sqlite3Strlen(db, zName); } sqlite3ErrorMsg(pParse, "no such collation sequence: %.*s", nName, zName); pColl = 0; diff --git a/src/callback.c b/src/callback.c index 1a8198b06..09f6841d9 100644 --- a/src/callback.c +++ b/src/callback.c @@ -13,7 +13,7 @@ ** This file contains functions used to access the internal hash tables ** of user defined functions and collation sequences. ** -** $Id: callback.c,v 1.24 2008/06/23 16:53:47 danielk1977 Exp $ +** $Id: callback.c,v 1.25 2008/07/08 14:52:10 drh Exp $ */ #include "sqliteInt.h" @@ -25,7 +25,7 @@ */ static void callCollNeeded(sqlite3 *db, const char *zName, int nName){ assert( !db->xCollNeeded || !db->xCollNeeded16 ); - if( nName<0 ) nName = strlen(zName); + if( nName<0 ) nName = sqlite3Strlen(db, zName); if( db->xCollNeeded ){ char *zExternal = sqlite3DbStrNDup(db, zName, nName); if( !zExternal ) return; @@ -158,7 +158,7 @@ static CollSeq *findCollSeqEntry( int create ){ CollSeq *pColl; - if( nName<0 ) nName = strlen(zName); + if( nName<0 ) nName = sqlite3Strlen(db, zName); pColl = sqlite3HashFind(&db->aCollSeq, zName, nName); if( 0==pColl && create ){ diff --git a/src/global.c b/src/global.c index 9d3a2eb1b..4211c5835 100644 --- a/src/global.c +++ b/src/global.c @@ -12,7 +12,7 @@ ** ** This file contains definitions of global variables and contants. ** -** $Id: global.c,v 1.2 2008/06/14 16:56:22 drh Exp $ +** $Id: global.c,v 1.3 2008/07/08 14:52:10 drh Exp $ */ #include "sqliteInt.h" @@ -66,4 +66,4 @@ const unsigned char sqlite3UpperToLower[] = { ** The following singleton contains the global configuration for ** the SQLite library. */ -struct Sqlite3Config sqlite3Config = { 1, 1, 1, }; +struct Sqlite3Config sqlite3Config = { 1, 1, 1, 0x7ffffffe }; diff --git a/src/main.c b/src/main.c index 90487d095..74e8aa90c 100644 --- a/src/main.c +++ b/src/main.c @@ -14,7 +14,7 @@ ** other files are for internal use by SQLite and should not be ** accessed by users of the library. ** -** $Id: main.c,v 1.470 2008/07/08 12:02:35 danielk1977 Exp $ +** $Id: main.c,v 1.471 2008/07/08 14:52:10 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> @@ -680,7 +680,7 @@ int sqlite3CreateFunc( (!xFunc && (xFinal && !xStep)) || (!xFunc && (!xFinal && xStep)) || (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG) || - (255<(nName = strlen(zFunctionName))) ){ + (255<(nName = sqlite3Strlen(db, zFunctionName))) ){ sqlite3Error(db, SQLITE_ERROR, "bad parameters"); return SQLITE_ERROR; } @@ -806,7 +806,7 @@ int sqlite3_overload_function( const char *zName, int nArg ){ - int nName = strlen(zName); + int nName = sqlite3Strlen(db, zName); int rc; sqlite3_mutex_enter(db->mutex); if( sqlite3FindFunction(db, zName, nName, nArg, SQLITE_UTF8, 0)==0 ){ @@ -1094,6 +1094,7 @@ static int createCollation( ){ CollSeq *pColl; int enc2; + int nName; assert( sqlite3_mutex_held(db->mutex) ); @@ -1113,7 +1114,8 @@ static int createCollation( ** sequence. If so, and there are active VMs, return busy. If there ** are no active VMs, invalidate any pre-compiled statements. */ - pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, strlen(zName), 0); + nName = sqlite3Strlen(db, zName); + pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, nName, 0); if( pColl && pColl->xCmp ){ if( db->activeVdbeCnt ){ sqlite3Error(db, SQLITE_BUSY, @@ -1129,7 +1131,7 @@ static int createCollation( ** to be called. */ if( (pColl->enc & ~SQLITE_UTF16_ALIGNED)==enc2 ){ - CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName, strlen(zName)); + CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName, nName); int j; for(j=0; j<3; j++){ CollSeq *p = &aColl[j]; @@ -1143,7 +1145,7 @@ static int createCollation( } } - pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, strlen(zName), 1); + pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, nName, 1); if( pColl ){ pColl->xCmp = xCompare; pColl->pUser = pCtx; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index b9ecdf619..7be67939b 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -11,7 +11,7 @@ ************************************************************************* ** Internal interface definitions for SQLite. ** -** @(#) $Id: sqliteInt.h,v 1.734 2008/06/27 14:05:25 danielk1977 Exp $ +** @(#) $Id: sqliteInt.h,v 1.735 2008/07/08 14:52:10 drh Exp $ */ #ifndef _SQLITEINT_H_ #define _SQLITEINT_H_ @@ -1739,6 +1739,7 @@ struct Sqlite3Config { int bMemstat; /* True to enable memory status */ int bCoreMutex; /* True to enable core mutexing */ int bFullMutex; /* True to enable full mutexing */ + int mxStrlen; /* Maximum string length */ sqlite3_mem_methods m; /* Low-level memory allocation interface */ sqlite3_mutex_methods mutex; /* Low-level mutex interface */ void *pHeap; /* Heap storage space */ @@ -1786,6 +1787,7 @@ struct Sqlite3Config { int sqlite3StrICmp(const char *, const char *); int sqlite3StrNICmp(const char *, const char *, int); int sqlite3IsNumber(const char*, int*, u8); +int sqlite3Strlen(sqlite3*, const char*); int sqlite3MallocInit(void); void sqlite3MallocEnd(void); diff --git a/src/util.c b/src/util.c index b4979ba44..bcf55e0a0 100644 --- a/src/util.c +++ b/src/util.c @@ -14,7 +14,7 @@ ** This file contains functions for allocating memory, comparing ** strings, and stuff like that. ** -** $Id: util.c,v 1.233 2008/07/06 00:21:35 drh Exp $ +** $Id: util.c,v 1.234 2008/07/08 14:52:10 drh Exp $ */ #include "sqliteInt.h" #include <stdarg.h> @@ -42,6 +42,20 @@ int sqlite3IsNaN(double x){ } /* +** Return the length of a string, except do not allow the string length +** to exceed the SQLITE_LIMIT_LENGTH setting. +*/ +int sqlite3Strlen(sqlite3 *db, const char *z){ + const char *z2 = z; + while( *z2 ){ z2++; } + if( z2 > &z[db->aLimit[SQLITE_LIMIT_LENGTH]] ){ + return db->aLimit[SQLITE_LIMIT_LENGTH]; + }else{ + return (int)(z2 - z); + } +} + +/* ** Set the most recent error code and error string for the sqlite ** handle "db". The error code is set to "err_code". ** diff --git a/src/vdbemem.c b/src/vdbemem.c index 6be8d9909..7abf08dc7 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -15,7 +15,7 @@ ** only within the VDBE. Interface routines refer to a Mem using the ** name sqlite_value ** -** $Id: vdbemem.c,v 1.115 2008/05/16 04:51:55 danielk1977 Exp $ +** $Id: vdbemem.c,v 1.116 2008/07/08 14:52:10 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> @@ -588,6 +588,7 @@ int sqlite3VdbeMemSetStr( void (*xDel)(void*) /* Destructor function */ ){ int nByte = n; /* New value for pMem->n */ + int iLimit; /* Maximum allowed string or blob size */ int flags = 0; /* New value for pMem->flags */ assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); @@ -598,16 +599,24 @@ int sqlite3VdbeMemSetStr( return SQLITE_OK; } + if( pMem->db ){ + iLimit = pMem->db->aLimit[SQLITE_LIMIT_LENGTH]; + }else{ + iLimit = SQLITE_MAX_LENGTH; + } flags = (enc==0?MEM_Blob:MEM_Str); if( nByte<0 ){ assert( enc!=0 ); if( enc==SQLITE_UTF8 ){ - for(nByte=0; z[nByte]; nByte++){} + for(nByte=0; nByte<=iLimit && z[nByte]; nByte++){} }else{ - for(nByte=0; z[nByte] | z[nByte+1]; nByte+=2){} + for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){} } flags |= MEM_Term; } + if( nByte>iLimit ){ + return SQLITE_TOOBIG; + } /* The following block sets the new values of Mem.z and Mem.xDel. It ** also sets a flag in local variable "flags" to indicate the memory |