[poincare] Fix leak when accepting ill-formed matrices-> do not accept

ill-formed matrices

Change-Id: I11a47c832287ac631838b9673174db5fff909f94
This commit is contained in:
Émilie Feral
2017-12-01 16:50:02 +01:00
parent 504bd41664
commit b3f2f245b0
3 changed files with 4 additions and 9 deletions

View File

@@ -25,7 +25,6 @@ private:
int m_numberOfRows;
int m_numberOfColumns;
const Expression ** m_operands;
static Complex<double> * defaultExpression();
};
}

View File

@@ -144,7 +144,7 @@ lstData:
/* MATRICES_ARE_DEFINED */
mtxData:
LEFT_BRACKET lstData RIGHT_BRACKET { $$ = new Poincare::MatrixData($2, false); $2->detachOperands(); delete $2; }
| mtxData LEFT_BRACKET lstData RIGHT_BRACKET { $$ = $1; $$->pushListData($3, false); $3->detachOperands(); delete $3; }
| mtxData LEFT_BRACKET lstData RIGHT_BRACKET { if ($3->numberOfOperands() != $1->numberOfColumns()) { delete $1; delete $3; YYERROR; } ; $$ = $1; $$->pushListData($3, false); $3->detachOperands(); delete $3; }
number:
DIGITS { $$ = new Poincare::Rational(Poincare::Integer($1.address, false)); }

View File

@@ -23,10 +23,6 @@ MatrixData::MatrixData(ListData * listData, bool clone) :
}
}
Complex<double> * MatrixData::defaultExpression() {
return new Complex<double>(Complex<double>::Float(0.0));
}
MatrixData::~MatrixData() {
if (m_operands != nullptr) {
for (int i=0; i<m_numberOfRows*m_numberOfColumns; i++) {
@@ -38,15 +34,15 @@ MatrixData::~MatrixData() {
void MatrixData::pushListData(ListData * listData, bool clone) {
const Expression ** newOperands = new const Expression * [(m_numberOfRows+1)*m_numberOfColumns];
assert(listData->numberOfOperands() == m_numberOfColumns);
for (int i = 0; i < m_numberOfRows*m_numberOfColumns; i++) {
newOperands[i] = m_operands[i];
}
for (int i = 0; i < m_numberOfColumns; i++) {
int max = listData->numberOfOperands();
if (clone) {
newOperands[m_numberOfRows*m_numberOfColumns+i] = i < max ? listData->operand(i)->clone() : defaultExpression();
newOperands[m_numberOfRows*m_numberOfColumns+i] = listData->operand(i)->clone();
} else {
newOperands[m_numberOfRows*m_numberOfColumns+i] = i < max ? listData->operand(i) : defaultExpression();
newOperands[m_numberOfRows*m_numberOfColumns+i] = listData->operand(i);
}
}
delete[] m_operands;