mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-19 05:40:38 +01:00
[poincare] Fix leak when accepting ill-formed matrices-> do not accept
ill-formed matrices Change-Id: I11a47c832287ac631838b9673174db5fff909f94
This commit is contained in:
@@ -25,7 +25,6 @@ private:
|
||||
int m_numberOfRows;
|
||||
int m_numberOfColumns;
|
||||
const Expression ** m_operands;
|
||||
static Complex<double> * defaultExpression();
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -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)); }
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user