From: Ole John Aske Date: October 31 2011 9:49am Subject: bzr push into mysql-5.1-telco-7.0 branch (ole.john.aske:4629 to 4630) List-Archive: http://lists.mysql.com/commits/141670 Message-Id: <20111031094954.A6F58233@fimafeng09.norway.sun.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 4630 Ole John Aske 2011-10-31 SPJ: Small refactoring to improve error handling: Moved the error check for incorrect treeNode and parameter length to a place earlier in the code ... To ensure they are actually checked *before* they are used. modified: storage/ndb/src/kernel/blocks/dbspj/DbspjMain.cpp 4629 Frazer Clement 2011-10-28 [merge] Merge 6.3->7.0 modified: storage/ndb/src/kernel/blocks/ERROR_codes.txt storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp storage/ndb/test/ndbapi/testNodeRestart.cpp storage/ndb/test/run-test/daily-basic-tests.txt === modified file 'storage/ndb/src/kernel/blocks/dbspj/DbspjMain.cpp' --- a/storage/ndb/src/kernel/blocks/dbspj/DbspjMain.cpp 2011-10-23 08:34:49 +0000 +++ b/storage/ndb/src/kernel/blocks/dbspj/DbspjMain.cpp 2011-10-31 09:49:29 +0000 @@ -2705,6 +2705,23 @@ Dbspj::lookup_build(Build_context& ctx, const QN_LookupParameters * param = (const QN_LookupParameters*)qp; do { + err = DbspjErr::InvalidTreeNodeSpecification; + if (unlikely(node->len < QN_LookupNode::NodeSize)) + { + jam(); + DEBUG_CRASH(); + break; + } + + err = DbspjErr::InvalidTreeParametersSpecification; + DEBUG("param len: " << param->len); + if (unlikely(param->len < QN_LookupParameters::NodeSize)) + { + jam(); + DEBUG_CRASH(); + break; + } + err = createNode(ctx, requestPtr, treeNodePtr); if (unlikely(err != 0)) { @@ -2756,13 +2773,6 @@ Dbspj::lookup_build(Build_context& ctx, dst->requestInfo = requestInfo; } - err = DbspjErr::InvalidTreeNodeSpecification; - if (unlikely(node->len < QN_LookupNode::NodeSize)) - { - DEBUG_CRASH(); - break; - } - if (treeBits & QN_LookupNode::L_UNIQUE_INDEX) { jam(); @@ -2775,14 +2785,6 @@ Dbspj::lookup_build(Build_context& ctx, Uint32 tableSchemaVersion = tableId + ((schemaVersion << 16) & 0xFFFF0000); dst->tableSchemaVersion = tableSchemaVersion; - err = DbspjErr::InvalidTreeParametersSpecification; - DEBUG("param len: " << param->len); - if (unlikely(param->len < QN_LookupParameters::NodeSize)) - { - DEBUG_CRASH(); - break; - } - ctx.m_resultData = param->resultData; treeNodePtr.p->m_lookup_data.m_api_resultRef = ctx.m_resultRef; treeNodePtr.p->m_lookup_data.m_api_resultData = param->resultData; @@ -3765,6 +3767,24 @@ Dbspj::scanFrag_build(Build_context& ctx do { + err = DbspjErr::InvalidTreeNodeSpecification; + DEBUG("scanFrag_build: len=" << node->len); + if (unlikely(node->len < QN_ScanFragNode::NodeSize)) + { + jam(); + DEBUG_CRASH(); + break; + } + + err = DbspjErr::InvalidTreeParametersSpecification; + DEBUG("param len: " << param->len); + if (unlikely(param->len < QN_ScanFragParameters::NodeSize)) + { + jam(); + DEBUG_CRASH(); + break; + } + err = createNode(ctx, requestPtr, treeNodePtr); if (unlikely(err != 0)) break; @@ -3810,24 +3830,9 @@ Dbspj::scanFrag_build(Build_context& ctx (treeBits & DABits::NI_LINKED_DISK) == 0 && (paramBits & DABits::PI_DISK_ATTR) == 0); dst->requestInfo = requestInfo; - - err = DbspjErr::InvalidTreeNodeSpecification; - DEBUG("scanFrag_build: len=" << node->len); - if (unlikely(node->len < QN_ScanFragNode::NodeSize)) - break; - dst->tableId = node->tableId; dst->schemaVersion = node->tableVersion; - err = DbspjErr::InvalidTreeParametersSpecification; - DEBUG("param len: " << param->len); - if (unlikely(param->len < QN_ScanFragParameters::NodeSize)) - { - jam(); - DEBUG_CRASH(); - break; - } - ctx.m_resultData = param->resultData; /** @@ -4315,6 +4320,24 @@ Dbspj::scanIndex_build(Build_context& ct do { + err = DbspjErr::InvalidTreeNodeSpecification; + DEBUG("scanIndex_build: len=" << node->len); + if (unlikely(node->len < QN_ScanIndexNode::NodeSize)) + { + jam(); + DEBUG_CRASH(); + break; + } + + err = DbspjErr::InvalidTreeParametersSpecification; + DEBUG("param len: " << param->len); + if (unlikely(param->len < QN_ScanIndexParameters::NodeSize)) + { + jam(); + DEBUG_CRASH(); + break; + } + err = createNode(ctx, requestPtr, treeNodePtr); if (unlikely(err != 0)) break; @@ -4355,24 +4378,9 @@ Dbspj::scanIndex_build(Build_context& ct (paramBits & DABits::PI_DISK_ATTR) == 0); ScanFragReq::setCorrFactorFlag(requestInfo, 1); dst->requestInfo = requestInfo; - - err = DbspjErr::InvalidTreeNodeSpecification; - DEBUG("scanIndex_build: len=" << node->len); - if (unlikely(node->len < QN_ScanIndexNode::NodeSize)) - break; - dst->tableId = node->tableId; dst->schemaVersion = node->tableVersion; - err = DbspjErr::InvalidTreeParametersSpecification; - DEBUG("param len: " << param->len); - if (unlikely(param->len < QN_ScanIndexParameters::NodeSize)) - { - jam(); - DEBUG_CRASH(); - break; - } - ctx.m_resultData = param->resultData; /** @@ -5735,7 +5743,7 @@ Dbspj::scanIndex_execSCAN_NEXTREQ(Signal DEBUG("scanIndex_execSCAN_NEXTREQ to: " << hex << treeNodePtr.p->m_send.m_ref - << ", m_node_no=" << treeNodePtr.p->m_node_no + << ", m_node_no=" << treeNodePtr.p->m_node_no << ", senderData: " << req->senderData); #ifdef DEBUG_SCAN_FRAGREQ No bundle (reason: useless for push emails).