summaryrefslogtreecommitdiff
path: root/hwpfilter
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2017-03-02 09:42:28 +0000
committerCaolán McNamara <caolanm@redhat.com>2017-03-02 09:43:17 +0000
commit76201c60a9162804b502726a0150ca925ee08719 (patch)
tree2bff61761eb9683cba1ff04b63eeca6e850d0556 /hwpfilter
parent4730b23b1da929b802d527611e974ff1b1e6d6c5 (diff)
ofz: oom in reading hwp data
Change-Id: I1e4dc5f474b229d4d68d3fc34bc23c88767e5e50
Diffstat (limited to 'hwpfilter')
-rw-r--r--hwpfilter/source/hwpfile.cxx18
1 files changed, 16 insertions, 2 deletions
diff --git a/hwpfilter/source/hwpfile.cxx b/hwpfilter/source/hwpfile.cxx
index 2983ef045dd6..c34891e1c15e 100644
--- a/hwpfilter/source/hwpfile.cxx
+++ b/hwpfilter/source/hwpfile.cxx
@@ -356,8 +356,22 @@ void HWPFile::TagsRead()
return;
}
- _hwpInfo.back_info.data.resize(_hwpInfo.back_info.size);
- ReadBlock(_hwpInfo.back_info.data.data(), _hwpInfo.back_info.size);
+ //read potentially compressed data in blocks as its more
+ //likely large values are simply broken and we'll run out
+ //of data before we need to realloc
+ for (int i = 0; i < _hwpInfo.back_info.size; i+= SAL_MAX_UINT16)
+ {
+ int nOldSize = _hwpInfo.back_info.data.size();
+ size_t nBlock = std::min<int>(SAL_MAX_UINT16, _hwpInfo.back_info.size - nOldSize);
+ _hwpInfo.back_info.data.resize(nOldSize + nBlock);
+ size_t nReadBlock = ReadBlock(_hwpInfo.back_info.data.data() + nOldSize, nBlock);
+ if (nBlock != nReadBlock)
+ {
+ _hwpInfo.back_info.data.resize(nOldSize + nReadBlock);
+ break;
+ }
+ }
+ _hwpInfo.back_info.size = _hwpInfo.back_info.data.size();
if( _hwpInfo.back_info.size > 0 )
_hwpInfo.back_info.type = 2;