天气数据解析增加安全防护 防止数组越界
authorhcj <1224667075@qq.com>
Mon, 30 Sep 2024 02:13:29 +0000 (10:13 +0800)
committerhcj <1224667075@qq.com>
Mon, 30 Sep 2024 02:13:29 +0000 (10:13 +0800)
code/sdk/application/wearable/fd230app/nativeui/languagecode/src/LanguageSwitchView.cpp
code/sdk/application/wearable/fd230app/nativeui/weather/include/WeatherModel.h
code/sdk/application/wearable/fd230app/nativeui/weather/src/WeatherModel.cpp
code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h

index 24dfd1c..722fa1c 100644 (file)
@@ -299,6 +299,8 @@ namespace OHOS
         else
         {
              group->SetVisible(true);
+            hint_id= LanguageSwitchModel::GetInstance().get_hint_code();
+
             LanguageSwitchModel::GetInstance().set_hint_flag(false);
         }
     }
index daad9d7..c334315 100644 (file)
@@ -19,13 +19,15 @@ namespace OHOS
     {
 #endif /* __cplusplus */
 #include "string.h"
+        #define weather_short_len 32
+        #define weather_long_len  64
 
         /*天气数据*/
         struct Weather_data
         {
             int humidity;       // 湿度
-            char windScale[16]; // 风速
-            char textNight[16]; // 夜间天气文本
+            char windScale[weather_short_len]; // 风速
+            char textNight[weather_short_len]; // 夜间天气文本
             int uvIndex;        // 紫外线指数
             int temp;           // 温度
             int iconNight;      // 夜间天气图标
@@ -35,7 +37,7 @@ namespace OHOS
         struct Weather_data_address
         {
             int lat;              // 纬度
-            char atm[16];         // 大气压
+            char atm[weather_short_len];         // 大气压
             char city[32];        // 城市
             char subLocality[32]; // 子地区
             int lon;              // 经纬度
@@ -48,7 +50,7 @@ namespace OHOS
             int tempMin;      // 最低温度
             int iconDay;      // 白天天气图标
             int fxDate;       // 日期
-            char textDay[16]; // 白天天气文本
+            char textDay[weather_short_len]; // 白天天气文本
             int tempMax;      // 最高温度
         };
 
index 72ba782..b038170 100644 (file)
@@ -34,10 +34,10 @@ namespace OHOS
         void UI_set_weather_now_data(int humidity, char *windScale, char *textNight, int uvIndex, int temp, int iconNight)
         {
             Weather_data_t_now.humidity = humidity;
-            memset((void *)Weather_data_t_now.windScale, 0, 16);
-            strcpy(Weather_data_t_now.windScale, windScale);
-            memset((void *)Weather_data_t_now.textNight, 0, 16);
-            strcpy(Weather_data_t_now.textNight, textNight);
+            memset((void *)Weather_data_t_now.windScale, 0, weather_short_len);
+            strcpy_s(Weather_data_t_now.windScale, weather_short_len,windScale);
+            memset((void *)Weather_data_t_now.textNight, 0, weather_short_len);
+            strcpy_s(Weather_data_t_now.textNight,weather_short_len, textNight);
             Weather_data_t_now.uvIndex = uvIndex;
             Weather_data_t_now.temp = temp;
             Weather_data_t_now.iconNight = iconNight;
@@ -57,12 +57,12 @@ namespace OHOS
         {
             Weather_data_t_address.lat = lat;
             Weather_data_t_address.lon = lon;
-            memset((void *)Weather_data_t_address.atm, 0, 16);
-            strcpy(Weather_data_t_address.atm, atm);
-            memset((void *)Weather_data_t_address.city, 0, 32);
-            strcpy(Weather_data_t_address.city, city);
-            memset((void *)Weather_data_t_address.subLocality, 0, 32);
-            strcpy(Weather_data_t_address.subLocality, subLocality);
+            memset((void *)Weather_data_t_address.atm, 0, weather_short_len);
+            strcpy_s(Weather_data_t_address.atm,weather_short_len, atm);
+            memset((void *)Weather_data_t_address.city, 0, weather_long_len);
+            strcpy_s(Weather_data_t_address.city, weather_long_len,city);
+            memset((void *)Weather_data_t_address.subLocality, 0, weather_long_len);
+            strcpy_s(Weather_data_t_address.subLocality, weather_long_len,subLocality);
         }
 
         /*
@@ -83,8 +83,8 @@ namespace OHOS
             Weather_data_seven_data[count].tempMax = t.tempMax;
             Weather_data_seven_data[count].tempMin = t.tempMin;
             Weather_data_seven_data[count].fxDate = t.fxDate;
-            memset((void *)Weather_data_seven_data[count].textDay, 0, 16);
-            strcpy(Weather_data_seven_data[count].textDay, t.textDay);
+            memset((void *)Weather_data_seven_data[count].textDay, 0, weather_short_len);
+            strcpy_s(Weather_data_seven_data[count].textDay,weather_short_len, t.textDay);
 
             Weather_data_seven_count++;
         }
index 1f65365..1ae46a6 100644 (file)
@@ -2259,8 +2259,8 @@ void set_weather_one_data(int tempMin, int iconDay,int fxDate, int tempMax, char
     data_t.iconDay=iconDay;
     data_t.fxDate=fxDate;
     data_t.tempMax=tempMax;
-    memset((void*)data_t.textDay,0,16);
-    strcpy(data_t.textDay,textDay);
+    memset((void*)data_t.textDay,0,weather_short_len);
+    strcpy_s(data_t.textDay,weather_short_len,textDay);
     printf("set_weather_one_data  %d\n",count);
     return UI_set_weather_seven_day_data(data_t ,count);
 }
index a7e1f16..fda66f2 100644 (file)
@@ -669,9 +669,12 @@ void comfirmPaire(uint8_t flag)
     if(flag == 1)\r
     {\r
         first_bond = 1;\r
+        printf(" gap_ble_pair \r\n");\r
 \r
         if(get_ble_pair())\r
         {\r
+            printf(" gap_ble_pair \r\n");\r
+\r
             bd_addr_t addr={0};\r
             get_phone_addr(&addr,g_ble_conn_id);\r
 \r
@@ -681,6 +684,7 @@ void comfirmPaire(uint8_t flag)
                 printf("gap_ble_pair_remote_device fail %X\r\n",code);\r
             }\r
         }\r
+\r
         \r
     }else{\r
         first_bond = 0;\r
@@ -2441,6 +2445,154 @@ uint8_t jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气
     }\r
     return parse_jsonCheck_weather(buf,check);\r
 }\r
+void parse_jsonCheck_weather_post(uint8_t *buf)//json 格式解析 天气数据\r
+{\r
+     uint8_t *json;\r
+    json = buf;\r
+    // printf("jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));\r
+    cJSON* root = cJSON_Parse((const char *)json);\r
+    if (root == NULL) {\r
+        printf("天气 JSON解析错误\n");\r
+        return ;\r
+    }\r
+    printf("开始解析天气 JSON\n");\r
+    cJSON *now_cjson = cJSON_GetObjectItem(root, "now");\r
+    if(now_cjson == NULL)\r
+    {\r
+        printf("天气 JSON解析错误\n");\r
+        return ;\r
+    }\r
+    int humidity=0;\r
+    char * windScale=NULL;\r
+    char *textNight=NULL;\r
+    int uvIndex=0;\r
+    int temp=0;\r
+    int iconNight=0;\r
+\r
+    cJSON *now_data_humidity= cJSON_GetObjectItem(now_cjson, "humidity");\r
+    if(now_data_humidity)\r
+    {\r
+        humidity=now_data_humidity->valueint;\r
+    }\r
+    cJSON *now_data_windScale=cJSON_GetObjectItem(now_cjson, "windScale");\r
+    if(now_data_windScale)\r
+    {\r
+        windScale=now_data_windScale->valuestring;\r
+    }\r
+    cJSON *now_data_textNight=cJSON_GetObjectItem(now_cjson, "textNight");\r
+    if(now_data_textNight)\r
+    {\r
+        textNight=now_data_textNight->valuestring;\r
+    }\r
+    cJSON *now_data_uvIndex= cJSON_GetObjectItem(now_cjson, "uvIndex");\r
+    if(now_data_uvIndex)\r
+    {\r
+        uvIndex=now_data_uvIndex->valueint;\r
+    }\r
+    cJSON *now_data_temp= cJSON_GetObjectItem(now_cjson, "temp");\r
+    if(now_data_temp)\r
+    {\r
+        temp=now_data_temp->valueint;\r
+    }\r
+    cJSON *now_data_iconNight= cJSON_GetObjectItem(now_cjson, "iconNight");\r
+    if(now_data_iconNight)\r
+    {\r
+        iconNight=now_data_iconNight->valueint;\r
+    }\r
+    set_weather_now_data(humidity,windScale,textNight,uvIndex,temp,iconNight);\r
+\r
+\r
+    cJSON *address_cjson = cJSON_GetObjectItem(root, "address");\r
+\r
+    char*city=NULL;\r
+    char*subLocality=NULL;\r
+    char*atm=NULL;\r
+     int lat=0;\r
+     int lon=0;\r
+\r
+    cJSON *address_cjson_ = cJSON_GetObjectItem(address_cjson, "city");\r
+    if(address_cjson_)\r
+    {\r
+        city=address_cjson_->valuestring;\r
+    }\r
+    \r
+    \r
+     address_cjson_= cJSON_GetObjectItem(address_cjson, "subLocality");\r
+    if(address_cjson_)\r
+    {\r
+        subLocality=address_cjson_->valuestring;\r
+    } \r
+\r
+    address_cjson_=cJSON_GetObjectItem(address_cjson, "atm");\r
+    if(address_cjson_)\r
+    {\r
+        atm=address_cjson_->valuestring;\r
+    } \r
+    address_cjson_ = cJSON_GetObjectItem(address_cjson, "lat");\r
+    if(address_cjson_)\r
+    {\r
+        lat=address_cjson_->valueint;\r
+    } \r
+\r
+    address_cjson_ = cJSON_GetObjectItem(address_cjson, "lon");\r
+    if(address_cjson_)\r
+    {\r
+        lon=address_cjson_->valueint;\r
+    } \r
+    set_weather_address_data(lat,atm,city,subLocality,lon);\r
+    cJSON *daily = cJSON_GetObjectItem(root, "daily");\r
+    if(daily==NULL)\r
+    {\r
+        return ;\r
+    }\r
+    int count= cJSON_GetArraySize(daily);\r
+    for(int i=0;i<count;i++)\r
+    {   \r
+        //{"tempMin":22,"iconDay":6,"fxDate":1712505600,"textDay":"阵雨","tempMax":29},\r
+        cJSON *data=cJSON_GetArrayItem(daily,i);\r
+\r
+        int  tempMin=0;\r
+        int  iconDay=0;\r
+        int  fxDate=0;\r
+        char *  textDay=NULL;\r
+        int  tempMax=0;\r
+\r
+\r
+        cJSON *data_=cJSON_GetObjectItem(data,"tempMin");\r
+        if(data_&& cJSON_IsNumber(data_) )\r
+        {\r
+           tempMin=data_->valueint;\r
+        }\r
+        \r
+        data_=cJSON_GetObjectItem(data,"iconDay");\r
+        if(data_&& cJSON_IsNumber(data_) )\r
+        {\r
+           iconDay=data_->valueint;\r
+        }\r
+        \r
+        data_=cJSON_GetObjectItem(data,"fxDate");\r
+        if(data_&& cJSON_IsNumber(data_) )\r
+        {\r
+           fxDate=data_->valueint;\r
+        }\r
+        \r
+        data_=cJSON_GetObjectItem(data,"textDay");\r
+        if(data_&& cJSON_IsString(data_) )\r
+        {\r
+           textDay=data_->valuestring;\r
+        }\r
+        data_=cJSON_GetObjectItem(data,"tempMax");\r
+        if(data_&& cJSON_IsNumber(data_) )\r
+        {\r
+           tempMax=data_->valueint;\r
+        }\r
+        set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i);\r
+\r
+    }\r
+     ble_UpdateMainWeatherData();\r
+    cJSON_Delete(root);\r
+    return ;\r
+}\r
 \r
 uint8_t parse_jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气数据\r
 {\r
@@ -2562,30 +2714,30 @@ uint8_t parse_jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析
 \r
 \r
         cJSON *data_=cJSON_GetObjectItem(data,"tempMin");\r
-        if(data_)\r
+        if(data_&& cJSON_IsNumber(data_) )\r
         {\r
            tempMin=data_->valueint;\r
         }\r
         \r
         data_=cJSON_GetObjectItem(data,"iconDay");\r
-        if(data_)\r
+        if(data_&& cJSON_IsNumber(data_) )\r
         {\r
            iconDay=data_->valueint;\r
         }\r
         \r
         data_=cJSON_GetObjectItem(data,"fxDate");\r
-        if(data_)\r
+        if(data_&& cJSON_IsNumber(data_) )\r
         {\r
            fxDate=data_->valueint;\r
         }\r
         \r
         data_=cJSON_GetObjectItem(data,"textDay");\r
-        if(data_)\r
+        if(data_&& cJSON_IsString(data_) )\r
         {\r
            textDay=data_->valuestring;\r
         }\r
         data_=cJSON_GetObjectItem(data,"tempMax");\r
-        if(data_)\r
+        if(data_&& cJSON_IsNumber(data_) )\r
         {\r
            tempMax=data_->valueint;\r
         }\r
@@ -2638,6 +2790,7 @@ uint8_t read_jsonHistory_weather(void)
         fclose(fp);\r
         return 0;\r
     }\r
+    \r
     char *str = fgets((char *)buf,size + 1,fp);\r
     if(str!=NULL)\r
     {\r
@@ -2645,9 +2798,9 @@ uint8_t read_jsonHistory_weather(void)
     }\r
 \r
     fclose(fp);\r
-   \r
-    uint8_t check = 0;\r
-    parse_jsonCheck_weather(buf,&check);\r
+\r
+    parse_jsonCheck_weather_post(buf);\r
+\r
     free(buf);\r
     \r
     return 1;\r
index 7b8b25d..675d7bb 100644 (file)
@@ -823,6 +823,7 @@ bool get_ctkd_flag(void);
 void Watch_SendDial_ToAppCmd(void);
 
 uint8_t parse_jsonCheck_weather(uint8_t *buf,uint8_t *check);//json 格式解析 天气数据
+void parse_jsonCheck_weather_post(uint8_t *buf);
 uint8_t read_jsonHistory_weather(void);
 void GetwatchSaveMac(uint8_t *mac,uint8_t *mactype);