summaryrefslogtreecommitdiff
path: root/formula
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2020-03-20 23:11:53 +0100
committerMichael Stahl <michael.stahl@cib.de>2020-04-23 11:22:27 +0200
commita79bbe2f92f6a25b2e170f11a6aa2b6a5123fe2f (patch)
tree7b080f0b78bec5cc51d07482ce650cdcc0ec8acc /formula
parent175143c819d6043bc3e986c90ec137c462da1eb0 (diff)
Resolves: tdf#131423 Handle Function Wizard max argument count correctly
The function description's argument count includes the VAR_ARGS and PAIRED_VAR_ARGS logic. Limit the max arguments count to the actual supported number of arguments. Change-Id: I588bed4672ff84adddc4be94962b2537758c5247 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90849 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Jenkins (cherry picked from commit d43d2662ff64c613740080e166d1046214edb0f0) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/91300 Reviewed-by: Michael Stahl <michael.stahl@cib.de>
Diffstat (limited to 'formula')
-rw-r--r--formula/source/ui/dlg/parawin.cxx49
-rw-r--r--formula/source/ui/dlg/parawin.hxx3
2 files changed, 31 insertions, 21 deletions
diff --git a/formula/source/ui/dlg/parawin.cxx b/formula/source/ui/dlg/parawin.cxx
index 9d8f1be6e0b2..ff70b3bee55f 100644
--- a/formula/source/ui/dlg/parawin.cxx
+++ b/formula/source/ui/dlg/parawin.cxx
@@ -35,6 +35,10 @@
namespace formula
{
+// Formula token argument count is sal_uInt8, max 255, edit offset 254.
+constexpr sal_uInt16 kMaxArgCount = 255;
+constexpr sal_uInt16 kMaxArgOffset = kMaxArgCount - 1;
+
ParaWin::ParaWin(weld::Container* pParent,IControlReferenceHandler* _pDlg)
: pFuncDesc(nullptr)
, pMyParent(_pDlg)
@@ -102,12 +106,13 @@ ParaWin::ParaWin(weld::Container* pParent,IControlReferenceHandler* _pDlg)
void ParaWin::UpdateArgDesc( sal_uInt16 nArg )
{
- if (nArg==NOT_FOUND) return;
+ if (nArg == NOT_FOUND)
+ return;
- if ( nArgs > 4 )
+ if (nMaxArgs > 4)
nArg = sal::static_int_cast<sal_uInt16>( nArg + GetSliderPos() );
- if ( (nArgs > 0) && (nArg<nArgs) )
+ if ((nMaxArgs > 0) && (nArg<nMaxArgs))
{
OUString aArgDesc;
OUString aArgName;
@@ -161,9 +166,12 @@ void ParaWin::UpdateArgDesc( sal_uInt16 nArg )
void ParaWin::UpdateArgInput( sal_uInt16 nOffset, sal_uInt16 i )
{
sal_uInt16 nArg = nOffset + i;
+ if (nArg > kMaxArgOffset)
+ return;
+
if ( nArgs < VAR_ARGS)
{
- if(nArg<nArgs)
+ if (nArg < nMaxArgs)
{
sal_uInt16 nRealArg = aVisibleArgMapping[nArg];
SetArgNameFont (i,(pFuncDesc->isParameterOptional(nRealArg))
@@ -213,7 +221,7 @@ void ParaWin::UpdateArgInput( sal_uInt16 nOffset, sal_uInt16 i )
else
SetArgName( i, pFuncDesc->getParameterName(nRealArg) );
}
- if (nArg<nArgs)
+ if (nArg < nMaxArgs)
aArgInput[i].SetArgVal(aParaArray[nArg]);
}
@@ -230,7 +238,7 @@ ParaWin::~ParaWin()
void ParaWin::SetActiveLine(sal_uInt16 no)
{
- if(no<nArgs)
+ if (no < nMaxArgs)
{
long nOffset = GetSliderPos();
nActiveLine=no;
@@ -248,7 +256,7 @@ void ParaWin::SetActiveLine(sal_uInt16 no)
RefEdit* ParaWin::GetActiveEdit()
{
- if(nArgs>0 && nEdFocus!=NOT_FOUND)
+ if (nMaxArgs > 0 && nEdFocus != NOT_FOUND)
{
return aArgInput[nEdFocus].GetArgEdPtr();
}
@@ -274,7 +282,7 @@ OUString ParaWin::GetArgument(sal_uInt16 no)
OUString ParaWin::GetActiveArgName() const
{
OUString aStr;
- if(nArgs>0 && nEdFocus!=NOT_FOUND)
+ if (nMaxArgs > 0 && nEdFocus != NOT_FOUND)
{
aStr=aArgInput[nEdFocus].GetArgName();
}
@@ -301,7 +309,7 @@ void ParaWin::SetFunctionDesc(const IFunctionDescription* pFDesc)
SetArgumentDesc( OUString() );
SetArgumentText( OUString() );
SetEditDesc( OUString() );
- nArgs = 0;
+ nMaxArgs = nArgs = 0;
if ( pFuncDesc!=nullptr)
{
if ( !pFuncDesc->getDescription().isEmpty() )
@@ -313,6 +321,7 @@ void ParaWin::SetFunctionDesc(const IFunctionDescription* pFDesc)
SetEditDesc(aDefaultString);
}
nArgs = pFuncDesc->getSuppressedArgumentCount();
+ nMaxArgs = std::min( nArgs, kMaxArgCount);
pFuncDesc->fillVisibleArgumentMapping(aVisibleArgMapping);
m_xSlider->set_vpolicy(VclPolicyType::NEVER);
m_xSlider->set_size_request(-1, -1);
@@ -394,30 +403,30 @@ void ParaWin::SetArgumentOffset(sal_uInt16 nOffset)
aParaArray.clear();
m_xSlider->vadjustment_set_value(0);
- aParaArray.resize(nArgs);
+ aParaArray.resize(nMaxArgs);
- if ( nArgs > 0 )
+ if (nMaxArgs > 0)
{
- for ( int i=0; i<4 && i<nArgs; i++ )
+ for ( int i=0; i<4 && i<nMaxArgs; i++ )
{
aArgInput[i].SetArgVal(OUString());
aArgInput[i].GetArgEdPtr()->Init(
- (i==0) ? nullptr : aArgInput[i-1].GetArgEdPtr(),
- (i==3 || i==nArgs-1) ? nullptr : aArgInput[i+1].GetArgEdPtr(),
- *m_xSlider, *this, nArgs );
+ (i==0) ? nullptr : aArgInput[i-1].GetArgEdPtr(),
+ (i==3 || i==nMaxArgs-1) ? nullptr : aArgInput[i+1].GetArgEdPtr(),
+ *m_xSlider, *this, nMaxArgs );
}
}
UpdateParas();
- if ( nArgs < 5 )
+ if (nMaxArgs < 5)
{
m_xSlider->set_vpolicy(VclPolicyType::NEVER);
m_xSlider->set_size_request(-1, -1);
}
else
{
- m_xSlider->vadjustment_configure(nOffset, 0, nArgs, 1, 4, 4);
+ m_xSlider->vadjustment_configure(nOffset, 0, nMaxArgs, 1, 4, 4);
m_xSlider->set_vpolicy(VclPolicyType::ALWAYS);
Size aPrefSize(m_xGrid->get_preferred_size());
m_xSlider->set_size_request(aPrefSize.Width(), aPrefSize.Height());
@@ -429,16 +438,16 @@ void ParaWin::UpdateParas()
sal_uInt16 i;
sal_uInt16 nOffset = GetSliderPos();
- if ( nArgs > 0 )
+ if ( nMaxArgs > 0 )
{
- for ( i=0; (i<nArgs) && (i<4); i++ )
+ for ( i=0; (i<nMaxArgs) && (i<4); i++ )
{
UpdateArgInput( nOffset, i );
aArgInput[i].Show();
}
}
- for ( i=nArgs; i<4; i++ )
+ for ( i=nMaxArgs; i<4; i++ )
aArgInput[i].Hide();
}
diff --git a/formula/source/ui/dlg/parawin.hxx b/formula/source/ui/dlg/parawin.hxx
index bcd836c221dc..cff5c0a5f087 100644
--- a/formula/source/ui/dlg/parawin.hxx
+++ b/formula/source/ui/dlg/parawin.hxx
@@ -42,7 +42,8 @@ private:
::std::vector<sal_uInt16> aVisibleArgMapping;
const IFunctionDescription* pFuncDesc;
IControlReferenceHandler* pMyParent;
- sal_uInt16 nArgs; // unsuppressed arguments
+ sal_uInt16 nArgs; // unsuppressed arguments, may be >= VAR_ARGS to indicate repeating parameters
+ sal_uInt16 nMaxArgs; // max arguments, limited to supported number of arguments
vcl::Font aFntBold;
vcl::Font aFntLight;