diff options
author | Caolán McNamara <caolanm@redhat.com> | 2021-09-23 20:19:57 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2021-09-24 09:32:14 +0200 |
commit | cea0753e18171bf9bcdd857535b20e6ed02222f5 (patch) | |
tree | efbb3d82804f09a2ad310cd3859803c6ce212d42 | |
parent | 4ff91bb2065b6a603f2fb8692c81911f0cdd58a8 (diff) |
do some sanity checks on the number of records claimed
while retaining the fix of #i83401# to recovered a broken case
Change-Id: I283c45b10aaa24004a34bfe6faee517d4a443b98
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122543
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | connectivity/source/drivers/dbase/DTable.cxx | 28 | ||||
-rw-r--r-- | sc/qa/unit/data/dbf/pass/ooo83401-1.dbf | bin | 0 -> 702 bytes |
2 files changed, 19 insertions, 9 deletions
diff --git a/connectivity/source/drivers/dbase/DTable.cxx b/connectivity/source/drivers/dbase/DTable.cxx index 5259a4721fc3..a306474817be 100644 --- a/connectivity/source/drivers/dbase/DTable.cxx +++ b/connectivity/source/drivers/dbase/DTable.cxx @@ -509,6 +509,24 @@ void ODbaseTable::construct() return; } + if (m_aHeader.recordLength) + { + std::size_t nMaxPossibleRecords = (nFileSize - m_aHeader.headerLength) / m_aHeader.recordLength; + // #i83401# seems to be empty or someone wrote nonsense into the dbase + // file try and recover if m_aHeader.db_slng is sane + if (m_aHeader.nbRecords == 0) + { + SAL_WARN("connectivity.drivers", "Parsing warning: 0 records claimed, recovering"); + m_aHeader.nbRecords = nMaxPossibleRecords; + } + else if (m_aHeader.nbRecords > nMaxPossibleRecords) + { + SAL_WARN("connectivity.drivers", "Parsing error: " << nMaxPossibleRecords << + " max possible records, but " << m_aHeader.nbRecords << " claimed, truncating"); + m_aHeader.nbRecords = nMaxPossibleRecords; + } + } + if (HasMemoFields()) { // Create Memo-Filename (.DBT): @@ -532,16 +550,8 @@ void ODbaseTable::construct() } fillColumns(); - m_pFileStream->Seek(STREAM_SEEK_TO_BEGIN); - // seems to be empty or someone wrote bullshit into the dbase file - // try and recover if m_aHeader.db_slng is sane - if (m_aHeader.nbRecords == 0 && m_aHeader.recordLength) - { - std::size_t nRecords = (nFileSize-m_aHeader.headerLength)/m_aHeader.recordLength; - if (nRecords > 0) - m_aHeader.nbRecords = nRecords; - } + // Buffersize dependent on the file size m_pFileStream->SetBufferSize(nFileSize > 1000000 ? 32768 : diff --git a/sc/qa/unit/data/dbf/pass/ooo83401-1.dbf b/sc/qa/unit/data/dbf/pass/ooo83401-1.dbf Binary files differnew file mode 100644 index 000000000000..c916dc923e51 --- /dev/null +++ b/sc/qa/unit/data/dbf/pass/ooo83401-1.dbf |