diff options
author | dan <dan@noemail.net> | 2016-12-30 14:15:56 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2016-12-30 14:15:56 +0000 |
commit | 895decf6b5c21d73f5de02581498c221dfa7c5f8 (patch) | |
tree | 7093f4339c0e5e2791aa8a1d5bd8ac13c1259658 /src/func.c | |
parent | d0d7e1351192300b90b3ada5ea10c6fb596c8796 (diff) | |
download | sqlite-895decf6b5c21d73f5de02581498c221dfa7c5f8.tar.gz sqlite-895decf6b5c21d73f5de02581498c221dfa7c5f8.zip |
Avoid passing NULL pointers to memcmp() or memcpy(), even when the
"number-of-bytes" argument is passed 0.
FossilOrigin-Name: 56ff72ab44288296efc99a608f7edc4346366a50
Diffstat (limited to 'src/func.c')
-rw-r--r-- | src/func.c | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/src/func.c b/src/func.c index 5b8ed6dd2..37f7cd615 100644 --- a/src/func.c +++ b/src/func.c @@ -200,25 +200,27 @@ static void instrFunc( if( typeHaystack==SQLITE_NULL || typeNeedle==SQLITE_NULL ) return; nHaystack = sqlite3_value_bytes(argv[0]); nNeedle = sqlite3_value_bytes(argv[1]); - if( typeHaystack==SQLITE_BLOB && typeNeedle==SQLITE_BLOB ){ - zHaystack = sqlite3_value_blob(argv[0]); - zNeedle = sqlite3_value_blob(argv[1]); - isText = 0; - }else{ - zHaystack = sqlite3_value_text(argv[0]); - zNeedle = sqlite3_value_text(argv[1]); - isText = 1; - if( zNeedle==0 ) return; - assert( zHaystack ); - } - while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){ - N++; - do{ - nHaystack--; - zHaystack++; - }while( isText && (zHaystack[0]&0xc0)==0x80 ); + if( nNeedle>0 ){ + if( typeHaystack==SQLITE_BLOB && typeNeedle==SQLITE_BLOB ){ + zHaystack = sqlite3_value_blob(argv[0]); + zNeedle = sqlite3_value_blob(argv[1]); + isText = 0; + }else{ + zHaystack = sqlite3_value_text(argv[0]); + zNeedle = sqlite3_value_text(argv[1]); + isText = 1; + if( zNeedle==0 ) return; + assert( zHaystack ); + } + while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){ + N++; + do{ + nHaystack--; + zHaystack++; + }while( isText && (zHaystack[0]&0xc0)==0x80 ); + } + if( nNeedle>nHaystack ) N = 0; } - if( nNeedle>nHaystack ) N = 0; sqlite3_result_int(context, N); } |