浏览代码

Fixed assertions due to occassional receipt of seemingly valid HGLOBALs with invalid (NULL) data.

git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@52 595ec19a-5cb4-439b-94a8-42fb3063c22c
ingenuus 22 年之前
父节点
当前提交
be08f3adfd
共有 4 个文件被更改,包括 42 次插入1 次删除
  1. 12 0
      DataTable.cpp
  2. 8 0
      Misc.cpp
  3. 1 0
      Misc.h
  4. 21 1
      ProcessCopy.cpp

+ 12 - 0
DataTable.cpp

@@ -100,6 +100,18 @@ HGLOBAL CDataTable::TakeData()
 // http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q119/7/65.asp&NoWebContent=1
 // http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q119/7/65.asp&NoWebContent=1
 BOOL CDataTable::ReplaceData( HGLOBAL hgData, UINT len )
 BOOL CDataTable::ReplaceData( HGLOBAL hgData, UINT len )
 {
 {
+	// make sure the given HGLOBAL is valid.
+	if( hgData != NULL )
+	{
+		VERIFY( len > 0 );
+	UINT size = ::GlobalSize( hgData );
+		VERIFY( size >= len );
+		VERIFY( IsValid(hgData) );
+	}
+	else
+		VERIFY( len == 0 );
+
+	// free the old HGLOBAL
 	if( m_ooData.m_hData )
 	if( m_ooData.m_hData )
 		::GlobalFree( m_ooData.m_hData );
 		::GlobalFree( m_ooData.m_hData );
 
 

+ 8 - 0
Misc.cpp

@@ -188,6 +188,14 @@ HWND GetFocusWnd(CPoint *pPointCaret)
 	Global Memory Helper Functions
 	Global Memory Helper Functions
 \*----------------------------------------------------------------------------*/
 \*----------------------------------------------------------------------------*/
 
 
+// make sure the given HGLOBAL is valid.
+BOOL IsValid( HGLOBAL hGlobal )
+{
+void* pvData = ::GlobalLock( hGlobal );
+	::GlobalUnlock( hGlobal );
+	return ( pvData != NULL );
+}
+
 // asserts if hDest isn't big enough
 // asserts if hDest isn't big enough
 void CopyToGlobalHP( HGLOBAL hDest, LPVOID pBuf, ULONG ulBufLen )
 void CopyToGlobalHP( HGLOBAL hDest, LPVOID pBuf, ULONG ulBufLen )
 {
 {

+ 1 - 0
Misc.h

@@ -48,6 +48,7 @@ bool IsAppWnd( HWND hWnd );
 HWND GetFocusWnd(CPoint *pPointCaret = NULL);
 HWND GetFocusWnd(CPoint *pPointCaret = NULL);
 
 
 // Global Memory Helper Functions
 // Global Memory Helper Functions
+BOOL IsValid( HGLOBAL hGlobal );
 void CopyToGlobalHP( HGLOBAL hDest, LPVOID pBuf, ULONG ulBufLen );
 void CopyToGlobalHP( HGLOBAL hDest, LPVOID pBuf, ULONG ulBufLen );
 void CopyToGlobalHH( HGLOBAL hDest, HGLOBAL hSource, ULONG ulBufLen );
 void CopyToGlobalHH( HGLOBAL hDest, HGLOBAL hSource, ULONG ulBufLen );
 HGLOBAL NewGlobalP( LPVOID pBuf, UINT nLen );
 HGLOBAL NewGlobalP( LPVOID pBuf, UINT nLen );

+ 21 - 1
ProcessCopy.cpp

@@ -23,7 +23,17 @@ HGLOBAL COleDataObjectEx::GetGlobalData(CLIPFORMAT cfFormat, LPFORMATETC lpForma
 {
 {
     HGLOBAL hGlobal = COleDataObject::GetGlobalData(cfFormat, lpFormatEtc);
     HGLOBAL hGlobal = COleDataObject::GetGlobalData(cfFormat, lpFormatEtc);
 	if( hGlobal )
 	if( hGlobal )
+	{
+		if( !::IsValid(hGlobal) )
+		{
+			LOG( StrF(
+			  "COleDataObjectEx::GetGlobalData(\"%s\"): ERROR: Invalid (NULL) data returned.",
+			  GetFormatName(cfFormat) ) );
+			::GlobalFree( hGlobal );
+			hGlobal = NULL;
+		}
 		return hGlobal;
 		return hGlobal;
+	}
 
 
 	// The data isn't in global memory, so try getting an IStream interface to it.
 	// The data isn't in global memory, so try getting an IStream interface to it.
 	STGMEDIUM stg;
 	STGMEDIUM stg;
@@ -66,7 +76,16 @@ HGLOBAL COleDataObjectEx::GetGlobalData(CLIPFORMAT cfFormat, LPFORMATETC lpForma
 
 
 	ReleaseStgMedium(&stg);
 	ReleaseStgMedium(&stg);
 
 
-    return hGlobal;
+	if( hGlobal && !::IsValid(hGlobal) )
+	{
+		LOG( StrF(
+			"COleDataObjectEx::GetGlobalData(\"%s\"): ERROR: Invalid (NULL) data returned.",
+			GetFormatName(cfFormat) ) );
+		::GlobalFree( hGlobal );
+		hGlobal = NULL;
+	}
+
+	return hGlobal;
 }
 }
 
 
 /*----------------------------------------------------------------------------*\
 /*----------------------------------------------------------------------------*\
@@ -245,6 +264,7 @@ int numTypes = pTypes->GetSize();
 			nSize = GlobalSize( cf.m_hgData );
 			nSize = GlobalSize( cf.m_hgData );
 			if( nSize > 0 )
 			if( nSize > 0 )
 			{
 			{
+				ASSERT( ::IsValid(cf.m_hgData) );
 				m_Formats.Add( cf );
 				m_Formats.Add( cf );
 				m_lTotalCopySize += nSize;
 				m_lTotalCopySize += nSize;
 			}
 			}