You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by ar...@apache.org on 2021/06/26 08:24:51 UTC

[openoffice] branch trunk updated (5358920 -> 44ef940)

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

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


    from 5358920  Issue 97058 - Add Fontwork into Insert menu (#15)
     new b0eb5a8  add useful checks
     new 44ef940  Allow more data than necessary

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 main/connectivity/source/drivers/dbase/DTable.cxx | 91 +++++++++++++++++------
 1 file changed, 67 insertions(+), 24 deletions(-)

[openoffice] 01/02: add useful checks

Posted by ar...@apache.org.
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 <ar...@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:

[openoffice] 02/02: Allow more data than necessary

Posted by ar...@apache.org.
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 44ef940190b406f82d22e775620b0585ef397ecc
Author: Arrigo Marchiori <ar...@yahoo.it>
AuthorDate: Thu May 20 22:13:58 2021 +0200

    Allow more data than necessary
    
    Also translate some comments from German
---
 main/connectivity/source/drivers/dbase/DTable.cxx | 70 +++++++++++------------
 1 file changed, 34 insertions(+), 36 deletions(-)

diff --git a/main/connectivity/source/drivers/dbase/DTable.cxx b/main/connectivity/source/drivers/dbase/DTable.cxx
index 9d795c2..fcca6e5 100644
--- a/main/connectivity/source/drivers/dbase/DTable.cxx
+++ b/main/connectivity/source/drivers/dbase/DTable.cxx
@@ -897,11 +897,10 @@ sal_Bool ODbaseTable::fetchRow(OValueRefRow& _rRow,const OSQLColumns & _rCols, s
         {
             sal_Int32 nDate = 0,nTime = 0;
             OSL_ENSURE(nLen == 8, "Invalid length for date field");
-            if (nLen != 8) {
-                return false;
+            if (nLen >= 8) {
+                memcpy(&nDate, pData, 4);
+                memcpy(&nTime, pData+ 4, 4);
             }
-			memcpy(&nDate, pData, 4);
-            memcpy(&nTime, pData+ 4, 4);
             if ( !nDate && !nTime )
             {
                 (_rRow->get())[i]->setNull();
@@ -916,54 +915,56 @@ 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;
+            if (nLen >= 4) {
+                sal_Int32 nValue = 0;
+                memcpy(&nValue, pData, 4);
+                *(_rRow->get())[i] = nValue;
+            } else {
+                (_rRow->get())[i]->setNull();
             }
-            sal_Int32 nValue = 0;
-			memcpy(&nValue, pData, nLen);
-            *(_rRow->get())[i] = nValue;
         }
         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;
-			    memcpy(&nValue, pData, nLen);
+            if (nLen >= 8) {
+                if (getBOOL((*aIter)->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY)))) // Currency needs special treatment
+                    {
+                        sal_Int64 nValue = 0;
+                        memcpy(&nValue, pData, nLen);
             
-                if ( m_aScales[i-1] )
-                    d = (double)(nValue / pow(10.0,(int)m_aScales[i-1]));
+                        if ( m_aScales[i-1] )
+                            d = (double)(nValue / pow(10.0,(int)m_aScales[i-1]));
+                        else
+                            d = (double)(nValue);
+                    }
                 else
-                    d = (double)(nValue);
-            }
-            else
-            {
-                memcpy(&d, pData, nLen);
-            }
+                    {
+                        memcpy(&d, pData, nLen);
+                    }
             
-            *(_rRow->get())[i] = d;
+                *(_rRow->get())[i] = d;
+            } else {
+                (_rRow->get())[i]->setNull();
+            }
         }
 		else
 		{
-			// Falls Nul-Zeichen im String enthalten sind, in Blanks umwandeln!
+			// Change any nulls into spaces
 			for (sal_Int32 k = 0; k < nLen; k++)
 			{
 				if (pData[k] == '\0')
 					pData[k] = ' ';
 			}
 
-			String aStr(pData, (xub_StrLen)nLen,m_eEncoding);		// Spaces am Anfang und am Ende entfernen:
+			String aStr(pData, (xub_StrLen)nLen,m_eEncoding);		// Strip spaces from beginning and end
 			aStr.EraseLeadingChars();
 			aStr.EraseTrailingChars();
 
 			if (!aStr.Len())
 			{
 				nByteOffset += nLen;
-				(_rRow->get())[i]->setNull();	// keine Werte -> fertig
+				(_rRow->get())[i]->setNull();	// no value -> we are done
 				continue;
 			}
 
@@ -972,11 +973,7 @@ 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)
-					{
+					if ((nLen < 8) || (aStr.Len() != nLen)) {
 						(_rRow->get())[i]->setNull();
 						break;
 					}
@@ -995,8 +992,9 @@ sal_Bool ODbaseTable::fetchRow(OValueRefRow& _rRow,const OSQLColumns & _rCols, s
 				case DataType::BIT:
 				{
                     OSL_ENSURE(nLen == 1, "Invalid length for bit field");
-                    if (nLen != 1) {
-                        return false;
+                    if (nLen < 1) {
+						(_rRow->get())[i]->setNull();
+						break;
                     }
 					sal_Bool b;
 					switch (* ((const char *)pData))
@@ -1024,7 +1022,7 @@ sal_Bool ODbaseTable::fetchRow(OValueRefRow& _rRow,const OSQLColumns & _rCols, s
 						(_rRow->get())[i]->setNull();
 				}	break;
 				default:
-					OSL_ASSERT("Falscher Type");
+					OSL_ASSERT("Wrong type");
 			}
 			(_rRow->get())[i]->setTypeKind(nType);
 		}