This is an automated email from the ASF dual-hosted git repository.

ardovm pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/openoffice.git

commit b0eb5a88c5dee74030d5ab05ac5c35d761f3b7e7
Author: Arrigo Marchiori <ard...@yahoo.it>
AuthorDate: Sat May 15 21:27:35 2021 +0200

    add useful checks
---
 main/connectivity/source/drivers/dbase/DTable.cxx | 45 +++++++++++++++++++++++
 1 file changed, 45 insertions(+)

diff --git a/main/connectivity/source/drivers/dbase/DTable.cxx 
b/main/connectivity/source/drivers/dbase/DTable.cxx
index a1d0086..9d795c2 100644
--- a/main/connectivity/source/drivers/dbase/DTable.cxx
+++ b/main/connectivity/source/drivers/dbase/DTable.cxx
@@ -896,6 +896,10 @@ sal_Bool ODbaseTable::fetchRow(OValueRefRow& _rRow,const 
OSQLColumns & _rCols, s
         else if ( DataType::TIMESTAMP == nType )
         {
             sal_Int32 nDate = 0,nTime = 0;
+            OSL_ENSURE(nLen == 8, "Invalid length for date field");
+            if (nLen != 8) {
+                return false;
+            }
                        memcpy(&nDate, pData, 4);
             memcpy(&nTime, pData+ 4, 4);
             if ( !nDate && !nTime )
@@ -911,6 +915,10 @@ sal_Bool ODbaseTable::fetchRow(OValueRefRow& _rRow,const 
OSQLColumns & _rCols, s
         }
         else if ( DataType::INTEGER == nType )
         {
+            OSL_ENSURE(nLen == 4, "Invalid length for integer field");
+            if (nLen != 4) {
+                return false;
+            }
             sal_Int32 nValue = 0;
                        memcpy(&nValue, pData, nLen);
             *(_rRow->get())[i] = nValue;
@@ -918,6 +926,10 @@ sal_Bool ODbaseTable::fetchRow(OValueRefRow& _rRow,const 
OSQLColumns & _rCols, s
         else if ( DataType::DOUBLE == nType )
         {
             double d = 0.0;
+            OSL_ENSURE(nLen == 8, "Invalid length for double field");
+            if (nLen != 8) {
+                return false;
+            }
             if 
(getBOOL((*aIter)->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY))))
 // Currency wird gesondert behandelt
             {
                 sal_Int64 nValue = 0;
@@ -959,6 +971,10 @@ sal_Bool ODbaseTable::fetchRow(OValueRefRow& _rRow,const 
OSQLColumns & _rCols, s
                        {
                                case DataType::DATE:
                                {
+                    OSL_ENSURE(nLen == 8, "Invalid length for date field");
+                    if (nLen != 8) {
+                        return false;
+                    }
                                        if (aStr.Len() != nLen)
                                        {
                                                (_rRow->get())[i]->setNull();
@@ -978,6 +994,10 @@ sal_Bool ODbaseTable::fetchRow(OValueRefRow& _rRow,const 
OSQLColumns & _rCols, s
                                break;
                                case DataType::BIT:
                                {
+                    OSL_ENSURE(nLen == 1, "Invalid length for bit field");
+                    if (nLen != 1) {
+                        return false;
+                    }
                                        sal_Bool b;
                                        switch (* ((const char *)pData))
                                        {
@@ -1873,6 +1893,11 @@ sal_Bool ODbaseTable::UpdateBuffer(OValueRefVector& 
rRow, OValueRefRow pOrgRow,c
                        {
                 case DataType::TIMESTAMP:
                     {
+                        OSL_ENSURE(nLen == 8, "Invalid length for timestamp 
field");
+                        if (nLen != 8) {
+                            bHadError = true;
+                            break;
+                        }
                         sal_Int32 nJulianDate = 0, nJulianTime = 0;
                         
lcl_CalcJulDate(nJulianDate,nJulianTime,rRow.get()[nPos]->getValue());
                         // Genau 8 Byte kopieren:
@@ -1882,6 +1907,11 @@ sal_Bool ODbaseTable::UpdateBuffer(OValueRefVector& 
rRow, OValueRefRow pOrgRow,c
                     break;
                                case DataType::DATE:
                                {
+                    OSL_ENSURE(nLen == 8, "Invalid length for date field");
+                    if (nLen != 8) {
+                        bHadError = true;
+                        break;
+                    }
                                        ::com::sun::star::util::Date aDate;
                                        
if(rRow.get()[nPos]->getValue().getTypeKind() == DataType::DOUBLE)
                                                aDate = 
::dbtools::DBTypeConversion::toDate(rRow.get()[nPos]->getValue().getDouble());
@@ -1900,12 +1930,22 @@ sal_Bool ODbaseTable::UpdateBuffer(OValueRefVector& 
rRow, OValueRefRow pOrgRow,c
                                } break;
                 case DataType::INTEGER:
                     {
+                        OSL_ENSURE(nLen == 4, "Invalid length for integer 
field");
+                        if (nLen != 4) {
+                            bHadError = true;
+                            break;
+                        }
                         sal_Int32 nValue = rRow.get()[nPos]->getValue();
                         memcpy(pData,&nValue,nLen);
                     }
                     break;
                 case DataType::DOUBLE:
                     {
+                        OSL_ENSURE(nLen == 8, "Invalid length for double 
field");
+                        if (nLen != 8) {
+                            bHadError = true;
+                            break;
+                        }
                         const double d = rRow.get()[nPos]->getValue();
                         m_pColumns->getByIndex(i) >>= xCol;
                         
@@ -1958,6 +1998,11 @@ sal_Bool ODbaseTable::UpdateBuffer(OValueRefVector& 
rRow, OValueRefRow pOrgRow,c
                                        }
                                } break;
                                case DataType::BIT:
+                    OSL_ENSURE(nLen == 1, "Invalid length for bit field");
+                    if (nLen != 1) {
+                        bHadError = true;
+                        break;
+                    }
                                        *pData = 
rRow.get()[nPos]->getValue().getBool() ? 'T' : 'F';
                                        break;
                 case DataType::LONGVARBINARY:

Reply via email to