From d4f05865bb452ae5c5d66c2fda494a16abfe5fc6 Mon Sep 17 00:00:00 2001 From: kishoramballi Date: Sat, 10 Oct 2009 13:05:21 +0000 Subject: [PATCH] Memory Leak Fixes --- src/sql/SelStatement.cxx | 21 ++++++++++++++++----- src/storage/AggTableImpl.cxx | 5 +---- src/storage/JoinTableImpl.cxx | 3 ++- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/sql/SelStatement.cxx b/src/sql/SelStatement.cxx index 6c2ab9d9..cfd93132 100644 --- a/src/sql/SelStatement.cxx +++ b/src/sql/SelStatement.cxx @@ -466,7 +466,12 @@ DbRetVal SelStatement::resolve() if (name->aType ==AGG_UNKNOWN && parsedData->getGroupFieldNameList().size()== 0) { rv = table->bindFld(name->fldName, newVal->value); - if (OK !=rv) return rv; + if (OK !=rv) { + if (newVal->isAllocVal) free(newVal->value); + delete newVal; + delete fInfo; + return rv; + } } else if (!isSingleTableNoGrp) { @@ -475,7 +480,12 @@ DbRetVal SelStatement::resolve() aggTable->setTable(table); } rv = aggTable->bindFld(name->fldName, name->aType, newVal->value); - if (OK !=rv) return rv; + if (OK !=rv) { + if (newVal->isAllocVal) free(newVal->value); + delete newVal; delete fInfo; delete aggTable; + aggTable = NULL; table = NULL; + return rv; + } } if (name->aType !=AGG_UNKNOWN && isSingleTableNoGrp) handleAggWithTbl= true; @@ -755,8 +765,9 @@ DbRetVal SelStatement::setBindFieldAndValues() ListIterator valIter = parsedData->getFieldValueList().getIterator(); int colNo =0; FieldValue *value = NULL; - valIter.reset(); - while(valIter.hasElement()) + //The second condition colNo < totalFields is important for projection list + //might not contain the binded having field. + while(valIter.hasElement() && colNo < totalFields) { value = (FieldValue*) valIter.nextElement(); if (value == NULL) @@ -766,7 +777,7 @@ DbRetVal SelStatement::setBindFieldAndValues() printError(ErrSysFatal, "Should never happen. value NULL after iteration"); return ErrSysFatal; } - bindFields[colNo++ ] = value; + bindFields[colNo++] = value; } return OK; } diff --git a/src/storage/AggTableImpl.cxx b/src/storage/AggTableImpl.cxx index 12e1a9a8..2eba92eb 100644 --- a/src/storage/AggTableImpl.cxx +++ b/src/storage/AggTableImpl.cxx @@ -46,8 +46,7 @@ AggTableImpl::~AggTableImpl() while (iter.hasElement()) { elem = (AggFldDef*) iter.nextElement(); - if(!elem->alreadyBinded) free(elem->bindBuf); - //if(elem->bindBuf) { free(elem->bindBuf); elem->bindBuf =NULL; } + if(!elem->alreadyBinded) free(elem->bindBuf); delete elem; } fldList.reset(); @@ -57,7 +56,6 @@ AggTableImpl::~AggTableImpl() { elem = (AggFldDef*) giter.nextElement(); if(!elem->alreadyBinded) free(elem->bindBuf); - //if(elem->bindBuf) { free(elem->bindBuf); elem->bindBuf =NULL; } delete elem; } fldGroupList.reset(); @@ -122,7 +120,6 @@ DbRetVal AggTableImpl::bindFld(const char *fldname, AggType aggType, void *val) delete def; return rv; } - def->alreadyBinded = true; } fldList.append(def); delete info; diff --git a/src/storage/JoinTableImpl.cxx b/src/storage/JoinTableImpl.cxx index 688779a2..45350690 100644 --- a/src/storage/JoinTableImpl.cxx +++ b/src/storage/JoinTableImpl.cxx @@ -37,7 +37,7 @@ JoinTableImpl::JoinTableImpl() isNestedLoop = true; rightExhausted = false; } -JoinTableImpl::~JoinTableImpl() {} +JoinTableImpl::~JoinTableImpl() {} DbRetVal JoinTableImpl::bindFld(const char *fldname, void *val) { @@ -67,6 +67,7 @@ DbRetVal JoinTableImpl::bindFld(const char *fldname, void *val) DbRetVal rv = getFieldInfo(fldname, info); if ( OK != rv) { printError(ErrBadCall, "Field not found or unqualified field name %s", fldname); + delete def; delete info; return ErrSyntaxError; } -- 2.11.4.GIT