summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2021-09-23 20:19:57 +0100
committerCaolán McNamara <caolanm@redhat.com>2021-09-24 09:32:14 +0200
commitcea0753e18171bf9bcdd857535b20e6ed02222f5 (patch)
treeefbb3d82804f09a2ad310cd3859803c6ce212d42
parent4ff91bb2065b6a603f2fb8692c81911f0cdd58a8 (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.cxx28
-rw-r--r--sc/qa/unit/data/dbf/pass/ooo83401-1.dbfbin0 -> 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
new file mode 100644
index 000000000000..c916dc923e51
--- /dev/null
+++ b/sc/qa/unit/data/dbf/pass/ooo83401-1.dbf
Binary files differ