2012-02-11 4 views
1

이전에 C++/COM 작업을 한 번도 해 본 적이 없으므로 기존 솔루션을 가로 채고 내 필요에 맞게 변경하려고합니다. 이 프로젝트는 VC 6으로 작성되었고 성공적으로 2010 년에 작업하려고 시도하고 있습니다. 컴파일하기 위해 몇 가지 참조를 변경해야했지만 어떤 이유에서든 생성하는 DLL에서 예외가 발생했습니다. 내 시스템 (원래 작동). 오류에 대한 조사를하고 있는데, 문자 배열을 선언하려고하면 버퍼 오버 플로우가 발생하는 것 같습니다.문자 배열 선언시 버퍼 오버플로

bool CFile::simpleWrite(char* cData) 
{ 
    try{ 

     // temp result variable 
     BOOL bResult = 0; 

     // file handle 
     HANDLE hFile = INVALID_HANDLE_VALUE; 

     // get the CMain singleton 
     CMain* m_pMain = CMain::GetInstance(); 

     // this point gets synchronization to ensure we get unique file name... 
     char cDirFilename[MAX_PATH + 1]; 
     GetLogFileName(cDirFilename, MAX_PATH); 

     // sanity check 
     if(strcmp(cDirFilename, "c:\\") == 0) assert(0); 

     // try and create a file 
     hFile = CreateFile(cDirFilename, GENERIC_WRITE, FILE_SHARE_READ,NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

     // if have a good file handle 
     if(hFile != INVALID_HANDLE_VALUE){ 

      size_t lenFileData = strlen(cData) + 72; 
      char* cFileData = new char[lenFileData]; 
      _snprintf(cFileData, lenFileData, "<?xml version=\"1.0\"?>\r\n<RootElement>\r\n%s</RootElement>\r\n\0", cData); 
... 

다음은 cData (호출 방법의 cXML)에 대한 선언/할당입니다.

char cXML[EVENT_LOG_MAX_MESSAGE]; 
// get the CMain singleton 
CMain* pMain = CMain::GetInstance(); 

long lThreadID = GetCurrentThreadId(); 

// put the parameters into XML format 
pMain->BuildXML(cXML, EVENT_LOG_MAX_MESSAGE,errLogLevel,userActivityID,methodName,lineNumber,className,AppID,errorDescription,errorID,lThreadID); 

// write the data to file 
if(!simpleWrite(cXML)) 
... 

BuildXML은 cXML에 _snprintf를 수행하고이를 반환합니다.

내 호출에서 일부 VC 파일로 이동하는 스택 추적입니다.

Test.dll!_heap_alloc_base(unsigned int size) Line 55 C 
Test.dll!_heap_alloc_dbg_impl(unsigned int nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 431 + 0x9 bytes C++ 
Test.dll!_nh_malloc_dbg_impl(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 239 + 0x19 bytes C++ 
Test.dll!_nh_malloc_dbg(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine) Line 302 + 0x1d bytes C++ 
Test.dll!malloc(unsigned int nSize) Line 56 + 0x15 bytes C++ 
Test.dll!operator new(unsigned int size) Line 59 + 0x9 bytes C++ 
Test.dll!operator new[](unsigned int count) Line 6 + 0x9 bytes C++ 
Test.dll!CFile::simpleWrite(char * cData) Line 87 + 0xc bytes C++ 

나는 어리석은 기본적인 실수가있을 것이라고 확신하지만, 생각지도 못한 것 같습니다.

+0

'cData'에 대한 자세한 정보를 제공해 주시겠습니까? –

+1

72는 영어 숫자입니다. 프로그래머는 256을 사용합니다. 물론 코드 스 니펫은 전혀 의미가 없습니다. –

+0

cData에 대한 자세한 내용을 추가했지만이 프로젝트는 VS 6이 빌드 될 때 컴파일되고 실행됩니다.이 코드는 수년간 사용 중이며 2007 년부터 수정되지 않았습니다. – JStinebaugh

답변

0

오류는 힙을 손상시키는 다른 곳에서 발생할 가능성이 큽니다. strlen을 종료 0으로 추가하지 않고 여기에서 사용합니다. 코드를 살펴보면서 strlen을 사용하여 메모리를 할당하고 어딘가에 복사하는지 확인하십시오. 왜냐하면 여러분이 하나의 바이트를 너무 적게 할당 한 다음 strcpy를 사용하여 힙을 손상시키고 있다고 생각하기 때문입니다.

+1

생각이 들었습니다. ; cData를 할당하고 복사하는 위치를 살펴보십시오. 혹시 cData = new char [strlen (oldString)]; strcpy (cData, oldString)? 종료 0은 버퍼의 끝을 덮어 쓰므로 힙 손상이 발생할 수 있습니다. – Tobias

0

의심스러운 것처럼, 이것은 모두 내 자신의 어리 석음이었습니다. 이 COM 응용 프로그램에는 내가 알지 못하는 종속성이있었습니다. 프로세스 모니터에서이 파일을 찾으려고 한 것을 보지 못했습니다. 프로젝트는 컴파일 목적으로 파일의 로컬 복사본을 가지고 있습니다. 그래도 입력 주셔서 감사합니다.