首页 > 解决方案 > OCIDESCRIPTORFREE 崩溃而不是返回 OCI_INVALID_HANDLE

问题描述

问题:对 OCIDescriptorFree() 的调用,有时它不返回 OCI_INVALID_HANDLE,而是使程序崩溃。程序崩溃。堆栈:kpufhndl、kpufhndl、OCIDescriptorFree、...、main

示例代码:OCILobLocator *lobloc = 0; OCIDescriptorAlloc( (dvoid *)phandle->envhp, (dvoid **)&lobloc, OCI_DTYPE_LOB, 0, NULL ); … … …(可能失去连接,然后重新连接) … OCIDescriptorFree( (dvoid *)lobloc, OCI_DTYPE_LOB );

转载于 Windows Server 2012、Oracle RDBMS 12.1.0.2、客户端 12.2.0.1。

根据 Bug 10144882,OCIDescriptorFree 的崩溃应该已经在 12.1.0.2 中修复。(https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=97595593912668&id=10144882.8&displayIndex=2&_afrWindowMode=0&_adf.ctrl-state=17pq5lo8dx_2732

OCIDescriptorFree() 函数内部的逻辑是什么?当Application调用OCIDescriptorFree()时,它如何验证参数(dvoid *descp)传递的地址?是不是在OCIDescriptorAlloc()的时候把它放到了一个地方(比如vector),然后在后面的OCIDescriptorFree()中根据这个地方(比如vector)的记录来验证它?如果 OCIDescriptorFree() 中的验证已经足够,在什么情况下调用 OCIDescriptorFree() 会导致崩溃转储?

标签: oracleoracle-call-interface

解决方案


推荐阅读