diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 8 | ||||
-rw-r--r-- | src/test1.c | 4 | ||||
-rw-r--r-- | src/test8.c | 7 | ||||
-rw-r--r-- | src/test_func.c | 98 | ||||
-rw-r--r-- | src/test_schema.c | 7 | ||||
-rw-r--r-- | src/test_tclvar.c | 8 |
6 files changed, 109 insertions, 23 deletions
diff --git a/src/main.c b/src/main.c index 52bcba1c1..cfeff0c6e 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.466 2008/06/27 13:27:04 danielk1977 Exp $ +** $Id: main.c,v 1.467 2008/07/07 14:50:14 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> @@ -677,7 +677,7 @@ int sqlite3CreateFunc( (xFunc && (xFinal || xStep)) || (!xFunc && (xFinal && !xStep)) || (!xFunc && (!xFinal && xStep)) || - (nArg<-1 || nArg>127) || + (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG) || (255<(nName = strlen(zFunctionName))) ){ sqlite3Error(db, SQLITE_ERROR, "bad parameters"); return SQLITE_ERROR; @@ -1191,8 +1191,8 @@ static const int aHardLimit[] = { #if SQLITE_MAX_VDBE_OP<40 # error SQLITE_MAX_VDBE_OP must be at least 40 #endif -#if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>255 -# error SQLITE_MAX_FUNCTION_ARG must be between 0 and 255 +#if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>127 +# error SQLITE_MAX_FUNCTION_ARG must be between 0 and 127 #endif #if SQLITE_MAX_ATTACH<0 || SQLITE_MAX_ATTACH>30 # error SQLITE_MAX_ATTACH must be between 0 and 30 diff --git a/src/test1.c b/src/test1.c index 6e6fbb86e..28b625e5d 100644 --- a/src/test1.c +++ b/src/test1.c @@ -13,7 +13,7 @@ ** is not included in the SQLite library. It is used for automated ** testing of the SQLite library. ** -** $Id: test1.c,v 1.309 2008/07/07 13:31:59 drh Exp $ +** $Id: test1.c,v 1.310 2008/07/07 14:50:14 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" @@ -102,7 +102,7 @@ static int get_sqlite_pointer( /* ** Decode a pointer to an sqlite3 object. */ -static int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb){ +int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb){ struct SqliteDb *p; Tcl_CmdInfo cmdInfo; if( Tcl_GetCommandInfo(interp, zA, &cmdInfo) ){ diff --git a/src/test8.c b/src/test8.c index 46b69d53c..9e4bcb2e5 100644 --- a/src/test8.c +++ b/src/test8.c @@ -13,7 +13,7 @@ ** is not included in the SQLite library. It is used for automated ** testing of the SQLite library. ** -** $Id: test8.c,v 1.66 2008/06/20 14:59:51 danielk1977 Exp $ +** $Id: test8.c,v 1.67 2008/07/07 14:50:14 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" @@ -1189,10 +1189,7 @@ static sqlite3_module echoModule = { /* ** Decode a pointer to an sqlite3 object. */ -static int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb){ - *ppDb = (sqlite3*)sqlite3TextToPtr(zA); - return TCL_OK; -} +extern int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb); static void moduleDestroy(void *p){ sqlite3_free(p); diff --git a/src/test_func.c b/src/test_func.c index 50d7bd60c..6bfad61ab 100644 --- a/src/test_func.c +++ b/src/test_func.c @@ -12,7 +12,7 @@ ** Code for testing all sorts of SQLite interfaces. This code ** implements new SQL functions used by the test scripts. ** -** $Id: test_func.c,v 1.5 2008/04/15 12:14:22 drh Exp $ +** $Id: test_func.c,v 1.6 2008/07/07 14:50:14 drh Exp $ */ #include "sqlite3.h" #include "tcl.h" @@ -275,6 +275,101 @@ static int autoinstall_test_funcs( return TCL_OK; } +/* +** A bogus step function and finalizer function. +*/ +static void tStep(sqlite3_context *a, int b, sqlite3_value **c){} +static void tFinal(sqlite3_context *a){} + + +/* +** tclcmd: abuse_create_function +** +** Make various calls to sqlite3_create_function that do not have valid +** parameters. Verify that the error condition is detected and reported. +*/ +static int abuse_create_function( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + extern int getDbPointer(Tcl_Interp*, const char*, sqlite3**); + sqlite3 *db; + int rc; + int mxArg; + + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; + + rc = sqlite3_create_function(db, "tx", 1, SQLITE_UTF8, 0, tStep,tStep,tFinal); + if( rc!=SQLITE_ERROR ) goto abuse_err; + if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err; + if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err; + + rc = sqlite3_create_function(db, "tx", 1, SQLITE_UTF8, 0, tStep, tStep, 0); + if( rc!=SQLITE_ERROR ) goto abuse_err; + if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err; + if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err; + + rc = sqlite3_create_function(db, "tx", 1, SQLITE_UTF8, 0, tStep, 0, tFinal); + if( rc!=SQLITE_ERROR ) goto abuse_err; + if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err; + if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err; + + rc = sqlite3_create_function(db, "tx", 1, SQLITE_UTF8, 0, 0, 0, tFinal); + if( rc!=SQLITE_ERROR ) goto abuse_err; + if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err; + if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err; + + rc = sqlite3_create_function(db, "tx", 1, SQLITE_UTF8, 0, 0, tStep, 0); + if( rc!=SQLITE_ERROR ) goto abuse_err; + if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err; + if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err; + + rc = sqlite3_create_function(db, "tx", -2, SQLITE_UTF8, 0, tStep, 0, 0); + if( rc!=SQLITE_ERROR ) goto abuse_err; + if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err; + if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err; + + rc = sqlite3_create_function(db, "tx", 128, SQLITE_UTF8, 0, tStep, 0, 0); + if( rc!=SQLITE_ERROR ) goto abuse_err; + if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err; + if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err; + + rc = sqlite3_create_function(db, "funcxx" + "_123456789_123456789_123456789_123456789_123456789" + "_123456789_123456789_123456789_123456789_123456789" + "_123456789_123456789_123456789_123456789_123456789" + "_123456789_123456789_123456789_123456789_123456789" + "_123456789_123456789_123456789_123456789_123456789", + 1, SQLITE_UTF8, 0, tStep, 0, 0); + if( rc!=SQLITE_ERROR ) goto abuse_err; + if( sqlite3_errcode(db)!=SQLITE_ERROR ) goto abuse_err; + if( strcmp(sqlite3_errmsg(db), "bad parameters")!=0 ) goto abuse_err; + + /* This last function registration should actually work. Generate + ** a no-op function (that always returns NULL) and which has the + ** maximum-length function name and the maximum number of parameters. + */ + sqlite3_limit(db, SQLITE_LIMIT_FUNCTION_ARG, 10000); + mxArg = sqlite3_limit(db, SQLITE_LIMIT_FUNCTION_ARG, -1); + rc = sqlite3_create_function(db, "nullx" + "_123456789_123456789_123456789_123456789_123456789" + "_123456789_123456789_123456789_123456789_123456789" + "_123456789_123456789_123456789_123456789_123456789" + "_123456789_123456789_123456789_123456789_123456789" + "_123456789_123456789_123456789_123456789_123456789", + mxArg, SQLITE_UTF8, 0, tStep, 0, 0); + if( rc!=SQLITE_OK ) goto abuse_err; + + return TCL_OK; + +abuse_err: + Tcl_AppendResult(interp, "sqlite3_create_function abused test failed", + (char*)0); + return TCL_ERROR; +} + /* @@ -286,6 +381,7 @@ int Sqlitetest_func_Init(Tcl_Interp *interp){ Tcl_ObjCmdProc *xProc; } aObjCmd[] = { { "autoinstall_test_functions", autoinstall_test_funcs }, + { "abuse_create_function", abuse_create_function }, }; int i; for(i=0; i<sizeof(aObjCmd)/sizeof(aObjCmd[0]); i++){ diff --git a/src/test_schema.c b/src/test_schema.c index 536af86a0..51099f5ad 100644 --- a/src/test_schema.c +++ b/src/test_schema.c @@ -13,7 +13,7 @@ ** is not included in the SQLite library. It is used for automated ** testing of the SQLite library. ** -** $Id: test_schema.c,v 1.14 2008/05/01 17:16:53 drh Exp $ +** $Id: test_schema.c,v 1.15 2008/07/07 14:50:14 drh Exp $ */ /* The code in this file defines a sqlite3 virtual-table module that @@ -299,10 +299,7 @@ static sqlite3_module schemaModule = { /* ** Decode a pointer to an sqlite3 object. */ -static int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb){ - *ppDb = (sqlite3*)sqlite3TextToPtr(zA); - return TCL_OK; -} +extern int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb); /* ** Register the schema virtual table module. diff --git a/src/test_tclvar.c b/src/test_tclvar.c index 1ff48983f..6cbec53bf 100644 --- a/src/test_tclvar.c +++ b/src/test_tclvar.c @@ -16,7 +16,7 @@ ** The emphasis of this file is a virtual table that provides ** access to TCL variables. ** -** $Id: test_tclvar.c,v 1.15 2008/05/29 05:23:42 drh Exp $ +** $Id: test_tclvar.c,v 1.16 2008/07/07 14:50:14 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" @@ -277,11 +277,7 @@ static sqlite3_module tclvarModule = { /* ** Decode a pointer to an sqlite3 object. */ -static int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb){ - *ppDb = (sqlite3*)sqlite3TextToPtr(zA); - return TCL_OK; -} - +extern int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb); /* ** Register the echo virtual table module. |