Open kydahe opened 3 years ago
感谢指出问题。回复如下:
int IOT_Template_Destroy(void *pClient);
函数会对入参进行判断
POINTER_SANITY_CHECK(pClient, QCLOUD_ERR_INVAL);
所以double free应该没关系。 2. 3. 同上void HAL_Free(void *ptr)
{
if (ptr)
free(ptr);
}
所以double free应该没关系,但是在代码中确实会形成double free的现象,后面会想办法优化,再次感谢!
感谢指出问题。回复如下:
- samples/asr/asr_data_template_sample.c
int IOT_Template_Destroy(void *pClient);
函数会对入参进行判断POINTER_SANITY_CHECK(pClient, QCLOUD_ERR_INVAL);
所以double free应该没关系。 2. 3. 同上- HAL_Free函数也对入参进行了判断
void HAL_Free(void *ptr) { if (ptr) free(ptr); }
所以double free应该没关系,但是在代码中确实会形成double free的现象,后面会想办法优化,再次感谢!
感谢回复!! 但是想请问一下这个HAL_Free的实现是在哪里?我找到的HAL_Free实现是没有入参判断的....如下所示
void HAL_Free(_IN_ void *ptr)
{
free(ptr);
}
所以想请教一下,感谢!!
感谢指出问题。回复如下:
- samples/asr/asr_data_template_sample.c
int IOT_Template_Destroy(void *pClient);
函数会对入参进行判断POINTER_SANITY_CHECK(pClient, QCLOUD_ERR_INVAL);
所以double free应该没关系。 2. 3. 同上- HAL_Free函数也对入参进行了判断
void HAL_Free(void *ptr) { if (ptr) free(ptr); }
所以double free应该没关系,但是在代码中确实会形成double free的现象,后面会想办法优化,再次感谢!
感谢回复!! 但是想请问一下这个HAL_Free的实现是在哪里?我找到的HAL_Free实现是没有入参判断的....如下所示
void HAL_Free(_IN_ void *ptr) { free(ptr); }
所以想请教一下,感谢!!
感谢指出问题。回复如下:
- samples/asr/asr_data_template_sample.c
int IOT_Template_Destroy(void *pClient);
函数会对入参进行判断POINTER_SANITY_CHECK(pClient, QCLOUD_ERR_INVAL);
所以double free应该没关系。 2. 3. 同上- HAL_Free函数也对入参进行了判断
void HAL_Free(void *ptr) { if (ptr) free(ptr); }
所以double free应该没关系,但是在代码中确实会形成double free的现象,后面会想办法优化,再次感谢!
感谢回复!! 但是想请问一下这个HAL_Free的实现是在哪里?我找到的HAL_Free实现是没有入参判断的....如下所示
void HAL_Free(_IN_ void *ptr) { free(ptr); }
所以想请教一下,感谢!!
HAL_Free和IOT_Template_Destroy函数在free指针内存之后,并没有对指针置空,所以在连续调用这两个函数时,尽管进行了空指针检查,但是并没有对已释放的指针置空,所以还是会存在double free问题。
void HAL_Free(_IN_ void *ptr)
{
if (ptr)
free(ptr);
}
int IOT_Template_Destroy(void *pClient)
{
IOT_FUNC_ENTRY;
POINTER_SANITY_CHECK(pClient, QCLOUD_ERR_INVAL);
Qcloud_IoT_Template *pTemplate = (Qcloud_IoT_Template *)pClient;
qcloud_iot_template_reset(pTemplate);
IOT_MQTT_Destroy(&pTemplate->mqtt);
if (NULL != pTemplate->mutex) {
HAL_MutexDestroy(pTemplate->mutex);
}
if (NULL != pTemplate->inner_data.downstream_topic) {
HAL_Free(pTemplate->inner_data.downstream_topic);
pTemplate->inner_data.downstream_topic = NULL;
}
HAL_Free(pClient);
IOT_FUNC_EXIT_RC(QCLOUD_RET_SUCCESS)
}
感谢指出,下一版本修复。
DF问题:在main函数的第407行,调用了_register_data_template_property函数;在_register_data_template_property函数的214行中,如果rc!=QCLOUD_RET_SUCCESS,则调用IOT_Template_Destroy对参数1(即main函数中的data_template_client)进行释放;之后,main函数进入210的else分支,并跳转到exit;exit中在514行,调用IOT_Template_Destroy对data_template_client进行了而此释放,造成了double free安全问题。
DF问题:同上,client在_register_data_template_property中被释放(273行IOT_Template_Destroy),之后在main函数中的exit跳转中又再次被释放(521行IOT_Template_Destroy),造成Memory Double Free安全问题。
DF问题:同上,client在_register_data_template_property中被释放482行IOT_Template_Destroy),之后在main函数中的exit跳转中又再次被释放837行IOT_Template_Destroy),造成Memory Double Free安全问题。
DF问题:在第295行已经释放了version内存,但在第300行又再次释放version,造成double free安全问题。
DF问题:在869行,pTemplate在IOT_Template_Destroy中通过HAL_Free进行释放,但在870行中pTemplate被HAL_Free进行二次释放,造成double free安全问题。