发现Z-Stack Home 1.2.1的MT.c文件似乎存在一处bug
协议栈版本:Z-Stack Home 1.2.1
MT.c文件 -> MT_BuildEndpointDesc函数中,有这样一段代码:
if ( ret == ZMemError )
{
if (epDesc->simpleDesc->pAppInClusterList) { osal_mem_free(epDesc->simpleDesc->pAppInClusterList); }
if (epDesc->simpleDesc->AppNumOutClusters) { osal_mem_free(epDesc->simpleDesc->pAppOutClusterList); }
osal_mem_free(epDesc->simpleDesc);
}
红字注明部分,似乎应该改成:pAppOutClusterList。
应该也可以的,因为epDesc->simpleDesc->AppNumOutClusters非零说明epDesc->simpleDesc->pAppOutClusterList非空。
不对,按程序的思路,执行过程应该是这样的:
1、判断epDesc->simpleDesc->AppNumInClusters是否非零,若非零,则分配内存epDesc->simpleDesc->pAppInClusterList用来存储InClusterList。
2、判断epDesc->simpleDesc->AppNumOutClusters是否非零,若非零,则分配内存epDesc->simpleDesc->pAppOutClusterList用来存储OutClusterList。
3、之后会判断上面是否顺利执行,若有某一步执行错误,需将之前分配成功的内存释放。
例如epDesc->simpleDesc->AppNumInClusters非零且epDesc->simpleDesc->pAppInClusterList分配成功,epDesc->simpleDesc->AppNumOutClusters非零且epDesc->simpleDesc->pAppOutClusterList分配失败,
此时会释放epDesc->simpleDesc->pAppInClusterList,而对epDesc->simpleDesc->pAppOutClusterList则不应该执行释放(因为它没有分配成功)。
但按我指出的bug,此时仍会对epDesc->simpleDesc->pAppOutClusterList执行释放,即对一个指向0000H的指针执行了osal_mem_free。
能否确认一下