已合并
fix ConvertBtMacToBinary #12528
fix ConvertBtMacToBinary #12528
已合并
wangrui7创建于 9月12日
共 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);
xuhengxiang
xuhengxiangxuhengxiang17 天前

在转换蓝牙MAC地址到二进制时,未正确处理转换后的值,可能导致数据溢出。

检查strtoul函数的返回值,确保转换后的值不会超过uint8_t类型的最大值。

likedislike
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);
xuhengxiang
xuhengxiangxuhengxiang17 天前

缺少对 MAC 地址段数不足的检查。如果输入的 MAC 地址段数少于预期(例如 "11:22:33"),循环内 token 将变为 NULL,传递给 strtoul 会导致空指针解引用崩溃;或者如果循环提前退出,会导致 binMac 缓冲区未完全初始化。代码只增加了对段数过多(token != NULL)的检查,遗漏了段数不足的情况。

在循环内增加对 token == NULL 的检查,如果段数不足,应释放内存并返回错误;或者在循环结束后检查已解析的段数是否等于预期长度。

likedislike
365+ if (endptr == token || *endptr != '\0' || val > UINT8_MAX) {
366+ COMM_LOGE(COMM_UTILS, "invalid mac addr token: %{public}s", token);
xuhengxiang
xuhengxiangxuhengxiang17 天前

在转换蓝牙MAC地址到二进制时,未正确处理最后一个token,可能导致内存泄漏。

在循环结束后检查token是否为NULL,如果不是,则释放tmpMac指针。

likedislike
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) {
JellyAiTudou
JellyAiTudouJellyAiTudou9月14日

这里是校验token != NULL ?通常都是校验==NULL

likedislike
wangrui7
wangrui7
9月16日 评论:
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_001446 * @tc.name: SoftBusUtilsTest_ConvertBtMacToStr_001
323 * @tc.desc: Verify ConvertBtMacToStr returns SOFTBUS_INVALID_PARAM when input parameters are invalid447 * @tc.desc: Verify ConvertBtMacToStr returns SOFTBUS_INVALID_PARAM when input parameters are invalid