summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2016-09-20 17:04:50 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2016-09-21 08:08:24 +0200
commitab2da32b380e068bb131bca6f28c62c0bb9c9fdb (patch)
tree05750becff3db502e1b73c067f3615af0eef8736
parentb9b7d4ee4ded28f59997ce7f30488e049af917a1 (diff)
lokdocview: guard against int overflow
If a too large rectangle is parsed, the width or the height may be larger than std::numeric_limits<int>::max(), in that case just set width/height to that max value, instead of allowing an overflow. Change-Id: Ic01319b01a3f9286501c346ea765868be57466a1 (cherry picked from commit 28447258fb6d9b8246f2a96d1a86945ef255d110)
-rw-r--r--libreofficekit/source/gtk/lokdocview.cxx12
1 files changed, 10 insertions, 2 deletions
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx
index d3c4974d927f..786d827d92d5 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -1019,13 +1019,21 @@ payloadToRectangle (LOKDocView* pDocView, const char* pPayload)
++ppCoordinate;
if (!*ppCoordinate)
return aRet;
- aRet.width = atoi(*ppCoordinate);
+ long l = atol(*ppCoordinate);
+ if (l > std::numeric_limits<int>::max())
+ aRet.width = std::numeric_limits<int>::max();
+ else
+ aRet.width = l;
if (aRet.x + aRet.width > priv->m_nDocumentWidthTwips)
aRet.width = priv->m_nDocumentWidthTwips - aRet.x;
++ppCoordinate;
if (!*ppCoordinate)
return aRet;
- aRet.height = atoi(*ppCoordinate);
+ l = atol(*ppCoordinate);
+ if (l > std::numeric_limits<int>::max())
+ aRet.height = std::numeric_limits<int>::max();
+ else
+ aRet.height = l;
if (aRet.y + aRet.height > priv->m_nDocumentHeightTwips)
aRet.height = priv->m_nDocumentHeightTwips - aRet.y;
g_strfreev(ppCoordinates);