已合并
fix ConvertBtMacToBinary #12528
wangrui7创建于 9月12日
fix ConvertBtMacToBinary #12528
已合并
共 2 个文件变更+136-1
| @@ -361,9 +361,20 @@ int32_t ConvertBtMacToBinary(const char *strMac, uint32_t strMacLen, uint8_t *bi | |||
| 361 | SoftBusFree(tmpMac); | 361 | SoftBusFree(tmpMac); |
| 362 | return SOFTBUS_ERR; | 362 | return SOFTBUS_ERR; |
| 363 | } | 363 | } |
| 364 | - binMac[i] = strtoul(token, &endptr, BT_ADDR_BASE); | 364 | + unsigned long val = strtoul(token, &endptr, BT_ADDR_BASE); |
缺少对 MAC 地址段数不足的检查。如果输入的 MAC 地址段数少于预期(例如 "11:22:33"),循环内 token 将变为 NULL,传递给 strtoul 会导致空指针解引用崩溃;或者如果循环提前退出,会导致 binMac 缓冲区未完全初始化。代码只增加了对段数过多(token != NULL)的检查,遗漏了段数不足的情况。 在循环内增加对 token == NULL 的检查,如果段数不足,应释放内存并返回错误;或者在循环结束后检查已解析的段数是否等于预期长度。 ![]() ![]() | |||
| 365 | + if (endptr == token || *endptr != '\0' || val > UINT8_MAX) { | ||
| 366 | + COMM_LOGE(COMM_UTILS, "invalid mac addr token: %{public}s", token); | ||
在转换蓝牙MAC地址到二进制时,未正确处理最后一个token,可能导致内存泄漏。 在循环结束后检查token是否为NULL,如果不是,则释放tmpMac指针。 ![]() ![]() | |||
| 367 | + SoftBusFree(tmpMac); | ||
| 368 | + return SOFTBUS_INVALID_PARAM; | ||
| 369 | + } | ||
| 370 | + binMac[i] = (uint8_t)val; | ||
| 365 | token = strtok_r(NULL, BT_ADDR_DELIMITER, &nextTokenPtr); | 371 | token = strtok_r(NULL, BT_ADDR_DELIMITER, &nextTokenPtr); |
| 366 | } | 372 | } |
| 373 | + if (token != NULL) { | ||
这里是校验token != NULL ?通常都是校验==NULL ![]() ![]() | |||
| 374 | + COMM_LOGE(COMM_UTILS, "invalid mac addr token: %{public}s", token); | ||
| 375 | + SoftBusFree(tmpMac); | ||
| 376 | + return SOFTBUS_INVALID_PARAM; | ||
| 377 | + } | ||
| 367 | SoftBusFree(tmpMac); | 378 | SoftBusFree(tmpMac); |
| 368 | return SOFTBUS_OK; | 379 | return SOFTBUS_OK; |
| 369 | } | 380 | } |
| @@ -318,6 +318,130 @@ HWTEST_F(SoftBusUtilsTest, SoftBusUtilsTest_ConvertBtMacToBinary_001, TestSize.L | |||
| 318 | EXPECT_EQ(SOFTBUS_INVALID_PARAM, ret); | 318 | EXPECT_EQ(SOFTBUS_INVALID_PARAM, ret); |
| 319 | } | 319 | } |
| 320 | 320 | ||
| 321 | +/* | ||
| 322 | + * @tc.name: SoftBusUtilsTest_ConvertBtMacToBinary_002 | ||
| 323 | + * @tc.desc: Verify ConvertBtMacToBinary works correctly with valid input parameters | ||
| 324 | + * @tc.type: FUNC | ||
| 325 | + * @tc.require: | ||
| 326 | + */ | ||
| 327 | +HWTEST_F(SoftBusUtilsTest, SoftBusUtilsTest_ConvertBtMacToBinary_002, TestSize.Level1) | ||
| 328 | +{ | ||
| 329 | + const char *strMac = "AA:BB:CC:DD:EE:FF"; | ||
| 330 | + uint8_t binMac[6] = {0}; | ||
| 331 | + uint32_t strMacLen = strlen(strMac) + 1; | ||
| 332 | + uint32_t binMacLen = sizeof(binMac); | ||
| 333 | + int32_t ret = ConvertBtMacToBinary(strMac, strMacLen, binMac, binMacLen); | ||
| 334 | + EXPECT_EQ(ret, SOFTBUS_OK); | ||
| 335 | + EXPECT_EQ(binMac[0], 0xAA); | ||
| 336 | + EXPECT_EQ(binMac[1], 0xBB); | ||
| 337 | + EXPECT_EQ(binMac[2], 0xCC); | ||
| 338 | + EXPECT_EQ(binMac[3], 0xDD); | ||
| 339 | + EXPECT_EQ(binMac[4], 0xEE); | ||
| 340 | + EXPECT_EQ(binMac[5], 0xFF); | ||
| 341 | +} | ||
| 342 | + | ||
| 343 | +/* | ||
| 344 | + * @tc.name: SoftBusUtilsTest_ConvertBtMacToBinary_003 | ||
| 345 | + * @tc.desc: Verify ConvertBtMacToBinary returns SOFTBUS_INVALID_PARAM when mac value exceeds uint8 range | ||
| 346 | + * @tc.type: FUNC | ||
| 347 | + * @tc.require: | ||
| 348 | + */ | ||
| 349 | +HWTEST_F(SoftBusUtilsTest, SoftBusUtilsTest_ConvertBtMacToBinary_003, TestSize.Level1) | ||
| 350 | +{ | ||
| 351 | + const char *strMac = "100:BB:CC:DD:EE:FF"; | ||
| 352 | + uint8_t binMac[6] = {0}; | ||
| 353 | + uint32_t strMacLen = strlen(strMac) + 1; | ||
| 354 | + uint32_t binMacLen = sizeof(binMac); | ||
| 355 | + int32_t ret = ConvertBtMacToBinary(strMac, strMacLen, binMac, binMacLen); | ||
| 356 | + EXPECT_EQ(ret, SOFTBUS_INVALID_PARAM); | ||
| 357 | +} | ||
| 358 | + | ||
| 359 | +/* | ||
| 360 | + * @tc.name: SoftBusUtilsTest_ConvertBtMacToBinary_004 | ||
| 361 | + * @tc.desc: Verify ConvertBtMacToBinary returns SOFTBUS_INVALID_PARAM when mac contains non-hex characters | ||
| 362 | + * @tc.type: FUNC | ||
| 363 | + * @tc.require: | ||
| 364 | + */ | ||
| 365 | +HWTEST_F(SoftBusUtilsTest, SoftBusUtilsTest_ConvertBtMacToBinary_004, TestSize.Level1) | ||
| 366 | +{ | ||
| 367 | + const char *strMac = "GG:HH:II:JJ:KK:LL"; | ||
| 368 | + uint8_t binMac[6] = {0}; | ||
| 369 | + uint32_t strMacLen = strlen(strMac) + 1; | ||
| 370 | + uint32_t binMacLen = sizeof(binMac); | ||
| 371 | + int32_t ret = ConvertBtMacToBinary(strMac, strMacLen, binMac, binMacLen); | ||
| 372 | + EXPECT_EQ(ret, SOFTBUS_INVALID_PARAM); | ||
| 373 | +} | ||
| 374 | + | ||
| 375 | +/* | ||
| 376 | + * @tc.name: SoftBusUtilsTest_ConvertBtMacToBinary_005 | ||
| 377 | + * @tc.desc: Verify ConvertBtMacToBinary returns SOFTBUS_INVALID_PARAM for zero MAC address | ||
| 378 | + * @tc.type: FUNC | ||
| 379 | + * @tc.require: | ||
| 380 | + */ | ||
| 381 | +HWTEST_F(SoftBusUtilsTest, SoftBusUtilsTest_ConvertBtMacToBinary_005, TestSize.Level1) | ||
| 382 | +{ | ||
| 383 | + const char *strMac = "00:00:00:00:00:00"; | ||
| 384 | + uint8_t binMac[6] = {0}; | ||
| 385 | + uint32_t strMacLen = strlen(strMac) + 1; | ||
| 386 | + uint32_t binMacLen = sizeof(binMac); | ||
| 387 | + int32_t ret = ConvertBtMacToBinary(strMac, strMacLen, binMac, binMacLen); | ||
| 388 | + EXPECT_EQ(ret, SOFTBUS_INVALID_PARAM); | ||
| 389 | +} | ||
| 390 | + | ||
| 391 | +/* | ||
| 392 | + * @tc.name: SoftBusUtilsTest_ConvertBtMacToBinary_006 | ||
| 393 | + * @tc.desc: Verify ConvertBtMacToBinary works with mixed case hex MAC address | ||
| 394 | + * @tc.type: FUNC | ||
| 395 | + * @tc.require: | ||
| 396 | + */ | ||
| 397 | +HWTEST_F(SoftBusUtilsTest, SoftBusUtilsTest_ConvertBtMacToBinary_006, TestSize.Level1) | ||
| 398 | +{ | ||
| 399 | + const char *strMac = "aa:bb:cc:dd:ee:ff"; | ||
| 400 | + uint8_t binMac[6] = {0}; | ||
| 401 | + uint32_t strMacLen = strlen(strMac) + 1; | ||
| 402 | + uint32_t binMacLen = sizeof(binMac); | ||
| 403 | + int32_t ret = ConvertBtMacToBinary(strMac, strMacLen, binMac, binMacLen); | ||
| 404 | + EXPECT_EQ(ret, SOFTBUS_OK); | ||
| 405 | + EXPECT_EQ(binMac[0], 0xaa); | ||
| 406 | + EXPECT_EQ(binMac[1], 0xbb); | ||
| 407 | + EXPECT_EQ(binMac[2], 0xcc); | ||
| 408 | + EXPECT_EQ(binMac[3], 0xdd); | ||
| 409 | + EXPECT_EQ(binMac[4], 0xee); | ||
| 410 | + EXPECT_EQ(binMac[5], 0xff); | ||
| 411 | +} | ||
| 412 | + | ||
| 413 | +/* | ||
| 414 | + * @tc.name: SoftBusUtilsTest_ConvertBtMacToBinary_007 | ||
| 415 | + * @tc.desc: Verify ConvertBtMacToBinary returns SOFTBUS_INVALID_PARAM when string is too short | ||
| 416 | + * @tc.type: FUNC | ||
| 417 | + * @tc.require: | ||
| 418 | + */ | ||
| 419 | +HWTEST_F(SoftBusUtilsTest, SoftBusUtilsTest_ConvertBtMacToBinary_007, TestSize.Level1) | ||
| 420 | +{ | ||
| 421 | + const char *strMac = "AA:BB:CC:DD:EE"; | ||
| 422 | + uint8_t binMac[6] = {0}; | ||
| 423 | + uint32_t strMacLen = strlen(strMac) + 1; | ||
| 424 | + uint32_t binMacLen = sizeof(binMac); | ||
| 425 | + int32_t ret = ConvertBtMacToBinary(strMac, strMacLen, binMac, binMacLen); | ||
| 426 | + EXPECT_EQ(ret, SOFTBUS_INVALID_PARAM); | ||
| 427 | +} | ||
| 428 | + | ||
| 429 | +/* | ||
| 430 | + * @tc.name: SoftBusUtilsTest_ConvertBtMacToBinary_008 | ||
| 431 | + * @tc.desc: Verify ConvertBtMacToBinary returns SOFTBUS_INVALID_PARAM when string is too long | ||
| 432 | + * @tc.type: FUNC | ||
| 433 | + * @tc.require: | ||
| 434 | + */ | ||
| 435 | +HWTEST_F(SoftBusUtilsTest, SoftBusUtilsTest_ConvertBtMacToBinary_008, TestSize.Level1) | ||
| 436 | +{ | ||
| 437 | + const char *strMac = "AA:BB:CC:DD:EE:FF:GG"; | ||
| 438 | + uint8_t binMac[6] = {0}; | ||
| 439 | + uint32_t strMacLen = strlen(strMac) + 1; | ||
| 440 | + uint32_t binMacLen = sizeof(binMac); | ||
| 441 | + int32_t ret = ConvertBtMacToBinary(strMac, strMacLen, binMac, binMacLen); | ||
| 442 | + EXPECT_EQ(ret, SOFTBUS_INVALID_PARAM); | ||
| 443 | +} | ||
| 444 | + | ||
| 321 | /* | 445 | /* |
| 322 | * @tc.name: SoftBusUtilsTest_ConvertBtMacToStr_001 | 446 | * @tc.name: SoftBusUtilsTest_ConvertBtMacToStr_001 |
| 323 | * @tc.desc: Verify ConvertBtMacToStr returns SOFTBUS_INVALID_PARAM when input parameters are invalid | 447 | * @tc.desc: Verify ConvertBtMacToStr returns SOFTBUS_INVALID_PARAM when input parameters are invalid |


在转换蓝牙MAC地址到二进制时,未正确处理转换后的值,可能导致数据溢出。
检查strtoul函数的返回值,确保转换后的值不会超过uint8_t类型的最大值。