声明Char数组时的缓冲区溢出

时间:2012-02-11 21:02:01

标签: visual-c++ dll com

我以前从未做过任何C ++ / COM工作,所以我试图劫持现有的解决方案并根据我的需要改变它。该项目是用VC 6编写并成功编译的,我现在正试图在2010年使用它。我不得不更改一些引用以使其编译,但由于某种原因,我生成的DLL导致异常我的系统(原版工作正常)。对错误进行一些研究,当我尝试声明一个char数组时,看起来我得到了缓冲区溢出。

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++

我确定有一些愚蠢的基本错误,但我似乎无法弄明白。

2 个答案:

答案 0 :(得分:0)

您的错误很可能发生在您最终破坏堆的其他地方。我注意到你在这里使用strlen而没有添加一个用于终止零。看看你的代码,看看你是否使用strlen来分配内存和复制到某个地方,因为我认为你通过分配一个字节太少然后strcpy到它来破坏堆。

答案 1 :(得分:0)

我怀疑,这完全是我自己的愚蠢。这个COM应用程序有一个我不知道的依赖。从未在进程监视器中看到任何试图查找它的内容,并且该项目显然有用于编译目的的文件的本地副本。谢谢你的意见。