diff options
author | unknown <joreland@mysql.com> | 2005-01-11 13:30:11 +0100 |
---|---|---|
committer | unknown <joreland@mysql.com> | 2005-01-11 13:30:11 +0100 |
commit | d73a4de9b7e7a6e73f5b8e71d6c5e8611adf53cd (patch) | |
tree | 3f57cc483ea3e68ab4e929777c38307479719b03 /ndb | |
parent | eae30642cde74965e5f81dca61bd4448a1d889f6 (diff) | |
download | mariadb-git-d73a4de9b7e7a6e73f5b8e71d6c5e8611adf53cd.tar.gz |
bug#7798 - ndb - range scan with invalid table version could cause node failure
mysql-test/r/ndb_index_ordered.result:
Test scan with invalid table version
mysql-test/t/ndb_index_ordered.test:
Test scan with invalid table version
ndb/src/kernel/blocks/dbtc/DbtcMain.cpp:
Set apiConnectstate= CS_ABORTING when receving a scan req with invalid
table version
Diffstat (limited to 'ndb')
-rw-r--r-- | ndb/src/kernel/blocks/dbtc/DbtcMain.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp b/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp index dd1252b76b9..815d6c9d838 100644 --- a/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp +++ b/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp @@ -1879,7 +1879,6 @@ void Dbtc::packKeyData000Lab(Signal* signal, Uint32 totalLen) { CacheRecord * const regCachePtr = cachePtr.p; - UintR Tmp; jam(); Uint32 len = 0; @@ -8503,14 +8502,16 @@ void Dbtc::execSCAN_TABREQ(Signal* signal) apiConnectptr.i = scanTabReq->apiConnectPtr; tabptr.i = scanTabReq->tableId; - if (apiConnectptr.i >= capiConnectFilesize || - tabptr.i >= ctabrecFilesize) { + if (apiConnectptr.i >= capiConnectFilesize) + { jam(); warningHandlerLab(signal); return; }//if + ptrAss(apiConnectptr, apiConnectRecord); ApiConnectRecord * transP = apiConnectptr.p; + if (transP->apiConnectstate != CS_CONNECTED) { jam(); // could be left over from TCKEYREQ rollback @@ -8524,9 +8525,16 @@ void Dbtc::execSCAN_TABREQ(Signal* signal) } else { jam(); errCode = ZSTATE_ERROR; - goto SCAN_TAB_error; + goto SCAN_TAB_error_no_state_change; } } + + if(tabptr.i >= ctabrecFilesize) + { + errCode = ZUNKNOWN_TABLE_ERROR; + goto SCAN_TAB_error; + } + ptrAss(tabptr, tableRecord); if ((aiLength == 0) || (!tabptr.p->checkTable(schemaVersion)) || @@ -8621,8 +8629,18 @@ void Dbtc::execSCAN_TABREQ(Signal* signal) errCode = ZNO_SCANREC_ERROR; goto SCAN_TAB_error; - SCAN_TAB_error: +SCAN_TAB_error: jam(); + /** + * Prepare for up coming ATTRINFO/KEYINFO + */ + transP->apiConnectstate = CS_ABORTING; + transP->abortState = AS_IDLE; + transP->transid[0] = transid1; + transP->transid[1] = transid2; + +SCAN_TAB_error_no_state_change: + ScanTabRef * ref = (ScanTabRef*)&signal->theData[0]; ref->apiConnectPtr = transP->ndbapiConnect; ref->transId1 = transid1; |