Visual c++ vc6 ado执行缓冲区溢出

Visual c++ vc6 ado执行缓冲区溢出,visual-c++,ado,buffer-overflow,visual-c++-6,Visual C++,Ado,Buffer Overflow,Visual C++ 6,因此,我在生产中遇到了一个问题,而这个问题似乎是通过服务包升级暴露出来的。这似乎是ado\u ConnectionPtr对象的执行方法中的某种缓冲区溢出。以下代码是导致缓冲区溢出的原因: char szStatement[600]; sprintf(szStatement, "UPDATE ROUTING_MASTER SET CNTNR_WGT_EST = %g WHERE CNTNR_ID = '%s'", spLineItem->C

因此,我在生产中遇到了一个问题,而这个问题似乎是通过服务包升级暴露出来的。这似乎是ado\u ConnectionPtr对象的执行方法中的某种缓冲区溢出。以下代码是导致缓冲区溢出的原因:

char szStatement[600];
sprintf(szStatement, "UPDATE ROUTING_MASTER SET CNTNR_WGT_EST = %g WHERE CNTNR_ID = '%s'", 
                         spLineItem->CntnrItemsWeight, (LPCTSTR) spLineItem->ContainerID);

m_spCN->Execute(szStatement,&var,adCmdText);
在execute方法之后,它会踩踏我的一个成员变量_bstr_\t,下一次应用程序尝试访问被踩踏的成员变量时,它会抛出一个异常。我可以看出它被践踏了,因为我在监视窗口中有我的成员变量,在Execute方法完成后,我立即看到成员变量已更改m_bstrDate:

var在头文件中声明为:

variant_t var;
BOOL m_bUseStorePutCntnr;
_bstr_t m_bstrDate, m_bstrTime;
似乎对&var的赋值就是这样做的,因为如果我将其更改为以下值,它不会破坏我的成员变量:

m_spCN->Execute(szStatement, NULL, adCmdText);
我不确定这是否与service pack有关,因为我在我的开发环境中也看到了这一点,而visual studio在下次必须访问该成员变量时不知何故一直在运行


知道这会导致缓冲区溢出的原因吗?

我没有Visual C/C++v6.0 with ADO环境设置,因此我无法验证下面写的任何内容

但很明显,使用Execute方法的第二个参数传递的保留内存块的地址不够大

我在MSDN中找不到类_ConnectionPtr,也找不到关于这个类的方法Execute的任何信息。但是我找到了那一页。根据本页,方法执行的原型为:

所以第二个参数是指向结构的指针

但您已经将成员变量var定义为封装变量结构的类的对象

我100%认为结构变量的大小与类变量的大小不同

您应该能够通过在代码中插入以下内容来验证:

TRACE("Size of VARIANT is %u and size of variant_t is %u\n",sizeof(VARIANT),sizeof(variant_t));
我的结论是:

您将错误的对象传递给方法Execute

您的应用程序应该使用variant替换头文件中的variant\u t,并可能使用

memset(&var,0,sizeof(var));
在调用方法Execute之前,尽管我很确定这不是真的需要

如果您想另外使用类variant,您还必须定义一个variant结构并将其附加到variant对象

这意味着您需要在头文件中:

VARIANT var;
variant_t RecordsAffected;
在源文件中:

memset(&var,0,sizeof(var));   // Most likely not really needed.
m_spCN->Execute(szStatement,&var,adCmdText);
RecordsAffected.Attach(&var);

请让我知道,如果我在代码片段上犯了错误,而我根本无法测试,以及我的答案中的任何其他错误信息。

Hm,您使用的是sprintf,它不检查缓冲区大小,缓冲区溢出可能是由此引起的吗?它看起来不像我调试它时,szStatement的大小看起来很好。看起来是正确的null结尾,并且szStatement的大小小于600字节。我还添加了上述声明。
memset(&var,0,sizeof(var));   // Most likely not really needed.
m_spCN->Execute(szStatement,&var,adCmdText);
RecordsAffected.Attach(&var);