Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix three crash problems discovered by afl-fuzz. Ticket [a59ae93ee990a55]. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
fe5788633131281a0f27c5b75993ce2f |
User & Date: | drh 2015-01-09 01:27:29 |
Context
2015-01-09
| ||
19:36 | Improvements to the sqlite3_stmt_scanstatus() documentation. No changes to code. (check-in: 9309c9bc user: drh tags: trunk) | |
01:27 | Fix three crash problems discovered by afl-fuzz. Ticket [a59ae93ee990a55]. (check-in: fe578863 user: drh tags: trunk) | |
00:38 | Add the "ascii" mode to the command-line shell. (check-in: e1518a94 user: drh tags: trunk) | |
Changes
Changes to src/date.c.
︙ | ︙ | |||
891 892 893 894 895 896 897 | sqlite3_value **argv ){ DateTime x; u64 n; size_t i,j; char *z; sqlite3 *db; | | > > | 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 | sqlite3_value **argv ){ DateTime x; u64 n; size_t i,j; char *z; sqlite3 *db; const char *zFmt; char zBuf[100]; if( argc==0 ) return; zFmt = (const char*)sqlite3_value_text(argv[0]); if( zFmt==0 || isDate(context, argc-1, argv+1, &x) ) return; db = sqlite3_context_db_handle(context); for(i=0, n=1; zFmt[i]; i++, n++){ if( zFmt[i]=='%' ){ switch( zFmt[i+1] ){ case 'd': case 'H': |
︙ | ︙ |
Changes to src/expr.c.
︙ | ︙ | |||
511 512 513 514 515 516 517 | Parse *pParse, /* Parsing context */ int op, /* Expression opcode */ Expr *pLeft, /* Left operand */ Expr *pRight, /* Right operand */ const Token *pToken /* Argument token */ ){ Expr *p; | | | 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 | Parse *pParse, /* Parsing context */ int op, /* Expression opcode */ Expr *pLeft, /* Left operand */ Expr *pRight, /* Right operand */ const Token *pToken /* Argument token */ ){ Expr *p; if( op==TK_AND && pLeft && pRight && pParse->nErr==0 ){ /* Take advantage of short-circuit false optimization for AND */ p = sqlite3ExprAnd(pParse->db, pLeft, pRight); }else{ p = sqlite3ExprAlloc(pParse->db, op, pToken, 1); sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight); } if( p ) { |
︙ | ︙ | |||
4065 4066 4067 4068 4069 4070 4071 | ** TK_COLUMNs have not yet been converted into TK_AGG_COLUMN. If ** sqlite3FunctionUsesThisSrc() is used differently in the future, the ** NEVER() will need to be removed. */ if( pExpr->op==TK_COLUMN || NEVER(pExpr->op==TK_AGG_COLUMN) ){ int i; struct SrcCount *p = pWalker->u.pSrcCount; SrcList *pSrc = p->pSrc; | > | | | 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 | ** TK_COLUMNs have not yet been converted into TK_AGG_COLUMN. If ** sqlite3FunctionUsesThisSrc() is used differently in the future, the ** NEVER() will need to be removed. */ if( pExpr->op==TK_COLUMN || NEVER(pExpr->op==TK_AGG_COLUMN) ){ int i; struct SrcCount *p = pWalker->u.pSrcCount; SrcList *pSrc = p->pSrc; int nSrc = pSrc ? pSrc->nSrc : 0; for(i=0; i<nSrc; i++){ if( pExpr->iTable==pSrc->a[i].iCursor ) break; } if( i<nSrc ){ p->nThis++; }else{ p->nOther++; } } return WRC_Continue; } |
︙ | ︙ |
Changes to test/fuzz2.test.
︙ | ︙ | |||
8 9 10 11 12 13 14 | # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. # # This file checks error recovery from malformed SQL strings. # | < | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. # # This file checks error recovery from malformed SQL strings. # set testdir [file dirname $argv0] source $testdir/tester.tcl proc fuzzcatch {sql} { return [lindex [catchsql $sql] 0] |
︙ | ︙ | |||
100 101 102 103 104 105 106 107 108 | } {1} do_test fuzz2-5.4 { fuzzcatch {REPLACE INTO AAAAAA SELECT DISTINCT "AAAAAA" . * WHERE AAAAAA ( AAAAAA ( ) ) GROUP BY AAAAAA . AAAAAA . "AAAAAA" IN "AAAAAA" | AAAAAA ( ALL , ) ORDER BY #238, #92 DESC LIMIT 0 OFFSET - RAISE ( IGNORE ) NOT NULL > RAISE ( IGNORE ) IS NULL} } {1} do_test fuzz2-5.5 { fuzzcatch {SELECT ALL * GROUP BY EXISTS ( SELECT "AAAAAA" . * , AAAAAA ( * ) AS AAAAAA FROM "AAAAAA" . "AAAAAA" AS "AAAAAA" USING ( AAAAAA , "AAAAAA" , "AAAAAA" ) WHERE AAAAAA ( DISTINCT ) - RAISE ( FAIL , "AAAAAA" ) HAVING "AAAAAA" . "AAAAAA" . AAAAAA ORDER BY #182 , #55 ) BETWEEN EXISTS ( SELECT ALL * FROM ( ( } } {1} finish_test | > > > > > > > > > > > > > > > > > > > > > > | 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | } {1} do_test fuzz2-5.4 { fuzzcatch {REPLACE INTO AAAAAA SELECT DISTINCT "AAAAAA" . * WHERE AAAAAA ( AAAAAA ( ) ) GROUP BY AAAAAA . AAAAAA . "AAAAAA" IN "AAAAAA" | AAAAAA ( ALL , ) ORDER BY #238, #92 DESC LIMIT 0 OFFSET - RAISE ( IGNORE ) NOT NULL > RAISE ( IGNORE ) IS NULL} } {1} do_test fuzz2-5.5 { fuzzcatch {SELECT ALL * GROUP BY EXISTS ( SELECT "AAAAAA" . * , AAAAAA ( * ) AS AAAAAA FROM "AAAAAA" . "AAAAAA" AS "AAAAAA" USING ( AAAAAA , "AAAAAA" , "AAAAAA" ) WHERE AAAAAA ( DISTINCT ) - RAISE ( FAIL , "AAAAAA" ) HAVING "AAAAAA" . "AAAAAA" . AAAAAA ORDER BY #182 , #55 ) BETWEEN EXISTS ( SELECT ALL * FROM ( ( } } {1} # Test cases discovered by Michal Zalewski on 2015-01-03 and reported on the # sqlite-users mailing list. All of these cases cause segfaults in # SQLite 3.8.7.4 and earlier. # do_test fuzz2-6.1 { catchsql {SELECT n()AND+#0;} } {1 {near "#0": syntax error}} do_test fuzz2-6.2 { catchsql {SELECT strftime()} } {0 {{}}} do_test fuzz2-6.3 { catchsql {DETACH(SELECT group_concat(q));} } {1 {no such column: q}} do_test fuzz2-6.4a { db eval {DROP TABLE IF EXISTS t0; CREATE TABLE t0(t);} catchsql {INSERT INTO t0 SELECT strftime();} } {0 {}} do_test fuzz2-6.4b { db eval {SELECT quote(t) FROM t0} } {NULL} finish_test |