@@ -671,10 +671,27 @@
671 671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to zero to stop appending DML statement text.
672 672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
673 673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void db_append_dml_to_blob(Blob *pBlob){
674 674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db.pDmlLog = pBlob;
675 675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine is a no-op on most builds. But if Fossil is built using
679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the FOSSIL_PENTEST compile-time option, and if the argument to this routine
680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** contains the text "BUG", then that indicates a potential SQL injection
681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** vulnerability. A panic is generated to bring this to the tester's
682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** attention.
683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void db_pentest(const char *zSql){
685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef FOSSIL_PENTEST
686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (void)zSql;
687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strstr(zSql,"BUG")!=0 ){
689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_panic("SQL Injection vulnerability!");
690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
676 693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
677 694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
678 695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Pause or unpause the DML log
679 696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
680 697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void db_pause_dml_log(void){ db.pauseDmlLog++; }
@@ -698,10 +715,11 @@
698 715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_append_dml(zSql);
699 716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( flags & DB_PREPARE_PERSISTENT ){
700 717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
prepFlags = SQLITE_PREPARE_PERSISTENT;
701 718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
702 719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3_prepare_v3(g.db, zSql, -1, prepFlags, &pStmt->pStmt, &zExtra);
720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=0 ) db_pentest(zSql);
703 721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=0 && (flags & DB_PREPARE_IGNORE_ERROR)==0 ){
704 722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_err("%s\n%s", sqlite3_errmsg(g.db), zSql);
705 723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( zExtra && !fossil_all_whitespace(zExtra) ){
706 724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_err("surplus text follows SQL: \"%s\"", zExtra);
707 725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -760,10 +778,11 @@
760 778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_init(pSql, 0, 0);
761 779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zSql = blob_sql_text(&pStmt->sql);
762 780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db.nPrepare++;
763 781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3_prepare_v3(g.db, zSql, -1, 0, &pStmt->pStmt, 0);
764 782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=0 ){
783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_pentest(zSql);
765 784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_err("%s\n%s", sqlite3_errmsg(g.db), zSql);
766 785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
767 786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pStmt->pNext = pStmt->pPrev = 0;
768 787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pStmt->nStep = 0;
769 788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pStmt->rc = rc;
@@ -1046,11 +1065,14 @@
1046 1065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
va_end(ap);
1047 1066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
z = blob_str(&sql);
1048 1067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( rc==SQLITE_OK && z[0] ){
1049 1068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pStmt = 0;
1050 1069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3_prepare_v2(g.db, z, -1, &pStmt, &zEnd);
1051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) break;
1070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
1071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_pentest(z);
1072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
1073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1052 1074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pStmt ){
1053 1075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nRow = 0;
1054 1076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db.nPrepare++;
1055 1077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( sqlite3_step(pStmt)==SQLITE_ROW ){
1056 1078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i, n;
@@ -1080,10 +1102,11 @@
1080 1102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zEnd;
1081 1103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( rc==SQLITE_OK && z[0] ){
1082 1104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pStmt = 0;
1083 1105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3_prepare_v2(g.db, z, -1, &pStmt, &zEnd);
1084 1106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc ){
1107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_pentest(z);
1085 1108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_err("%s: {%s}", sqlite3_errmsg(g.db), z);
1086 1109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( pStmt ){
1087 1110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db.nPrepare++;
1088 1111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_append_dml(sqlite3_sql(pStmt));
1089 1112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( sqlite3_step(pStmt)==SQLITE_ROW ){}
1090 1113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!