TencentCloud / tencentcloud-iot-sdk-embedded-c

SDK for connecting to Tencent Cloud IoT from a device using embedded C.
https://cloud.tencent.com/product/iothub
Other
149 stars 71 forks source link

简单提几个bug #14

Closed zmqccj closed 4 years ago

zmqccj commented 5 years ago

bug1

src/utils/farra/utils_httpc.c中368行

    *p_read_len = 0;
    rc = client->network_stack.read(&client->network_stack, (unsigned char *)buf, max_len, (uint32_t)left_ms(&timer), (size_t *)p_read_len);

在64位系统中size_t和int长度可能不一样,这样强转会导致p_read_len指向地址附近的内存会被异常覆盖。

bug2

src/mqtt/src/mqtt_client_connect.c中187行

    if ((flags & MQTT_CONNECT_FLAG_USERNAME) && options->username != NULL) {
        mqtt_write_utf8_string(&ptr, options->username);
        HAL_Free(options->username);
    }

    if ((flags & MQTT_CONNECT_FLAG_PASSWORD) && options->password != NULL) {
        mqtt_write_utf8_string(&ptr, options->password);
        HAL_Free(options->password);
    }

HAL_Free后建议将指针置为NULL,否则mqtt重连的时候程序会挂掉

spikelin commented 5 years ago

谢谢指出问题。bug1的int和size_t类型转换确实不妥,我们会检查。bug2目前两个指针都只在_serialize_connect_packet内使用,运行不会有问题。不过确实Free之后应该置为NULL比较合理。

zmqccj commented 5 years ago

bug1在跑OTAdemo的时候应该会复现,下载时会出现段错误,因为len变量附近的一个指针被改了。第二个bug在自动重连的时候会复现,一方面是重复Free导致程序挂掉,另一方面是,这里Free掉了username和password,怎么重连上呢?你们的SDK真的测试过了么?

spikelin commented 5 years ago

请问你的运行环境是什么?可有改动过SDK的代码?64位系统在我们ubuntu14.04/16.04都有测试过,并没有出现你所说的问题。 关于bug2,你可以仔细看看代码,username和password在_serialize_connect_packet内使用前都是会重新malloc并赋值的,所以不会有问题。

zmqccj commented 5 years ago

我重新看了下,bug2是我们以前改了代码,和你们的SDK不一样了,你们这里是可以的。bug1你们没有复现应该是因为你们的优化选项是-Os,你们可以试下-O0,应该会出现Segmentation fault