From 858aa861950979e5c0b620957136885cc5d64e97 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E8=83=A1=E4=BC=A0=E5=86=9B?= <1224667075@qq.com> Date: Mon, 30 Sep 2024 02:57:08 +0000 Subject: [PATCH] Merge #1065 into sdk602patch0626 from refs/changes/1065/head MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Code review from 胡传军 * refs/changes/1065/head: (2 commits squashed) - 天气数据解析增加安全防护 防止数组越界 - Merge branch 'sdk602patch0626' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into 0626 Signed-off-by: aliyun8003852482 <1224667075@qq.com> Reviewed-by: snickersun@163.com Merged-by: snickersun@163.com CR-link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/1065 --- .../languagecode/src/LanguageSwitchView.cpp | 2 + .../nativeui/weather/include/WeatherModel.h | 10 +- .../nativeui/weather/src/WeatherModel.cpp | 24 +-- .../service/ble_service/blemoder/bletest.cpp | 4 +- .../service/ble_service/bleservice/bleEvent.c | 169 +++++++++++++++++- .../service/ble_service/bleservice/bleEvent.h | 1 + 6 files changed, 184 insertions(+), 26 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/languagecode/src/LanguageSwitchView.cpp b/code/sdk/application/wearable/fd230app/nativeui/languagecode/src/LanguageSwitchView.cpp index 24dfd1c0b..722fa1c80 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/languagecode/src/LanguageSwitchView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/languagecode/src/LanguageSwitchView.cpp @@ -299,6 +299,8 @@ namespace OHOS else { group->SetVisible(true); + hint_id= LanguageSwitchModel::GetInstance().get_hint_code(); + LanguageSwitchModel::GetInstance().set_hint_flag(false); } } diff --git a/code/sdk/application/wearable/fd230app/nativeui/weather/include/WeatherModel.h b/code/sdk/application/wearable/fd230app/nativeui/weather/include/WeatherModel.h index daad9d70d..c3343153e 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/weather/include/WeatherModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/weather/include/WeatherModel.h @@ -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; // 最高温度 }; diff --git a/code/sdk/application/wearable/fd230app/nativeui/weather/src/WeatherModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/weather/src/WeatherModel.cpp index 72ba78208..b03817003 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/weather/src/WeatherModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/weather/src/WeatherModel.cpp @@ -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++; } diff --git a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp index 1f65365f4..1ae46a627 100644 --- a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp +++ b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp @@ -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); } diff --git a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c index a7e1f16f2..fda66f29a 100644 --- a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c +++ b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c @@ -669,9 +669,12 @@ void comfirmPaire(uint8_t flag) if(flag == 1) { first_bond = 1; + printf(" gap_ble_pair \r\n"); if(get_ble_pair()) { + printf(" gap_ble_pair \r\n"); + bd_addr_t addr={0}; get_phone_addr(&addr,g_ble_conn_id); @@ -681,6 +684,7 @@ void comfirmPaire(uint8_t flag) printf("gap_ble_pair_remote_device fail %X\r\n",code); } } + }else{ first_bond = 0; @@ -2441,6 +2445,154 @@ uint8_t jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气 } return parse_jsonCheck_weather(buf,check); } +void parse_jsonCheck_weather_post(uint8_t *buf)//json 格式解析 天气数据 +{ + uint8_t *json; + json = buf; + // printf("jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json)); + cJSON* root = cJSON_Parse((const char *)json); + if (root == NULL) { + printf("天气 JSON解析错误\n"); + return ; + } + printf("开始解析天气 JSON\n"); + cJSON *now_cjson = cJSON_GetObjectItem(root, "now"); + if(now_cjson == NULL) + { + printf("天气 JSON解析错误\n"); + return ; + } + int humidity=0; + char * windScale=NULL; + char *textNight=NULL; + int uvIndex=0; + int temp=0; + int iconNight=0; + + cJSON *now_data_humidity= cJSON_GetObjectItem(now_cjson, "humidity"); + if(now_data_humidity) + { + humidity=now_data_humidity->valueint; + } + cJSON *now_data_windScale=cJSON_GetObjectItem(now_cjson, "windScale"); + if(now_data_windScale) + { + windScale=now_data_windScale->valuestring; + } + cJSON *now_data_textNight=cJSON_GetObjectItem(now_cjson, "textNight"); + if(now_data_textNight) + { + textNight=now_data_textNight->valuestring; + } + cJSON *now_data_uvIndex= cJSON_GetObjectItem(now_cjson, "uvIndex"); + if(now_data_uvIndex) + { + uvIndex=now_data_uvIndex->valueint; + } + cJSON *now_data_temp= cJSON_GetObjectItem(now_cjson, "temp"); + if(now_data_temp) + { + temp=now_data_temp->valueint; + } + cJSON *now_data_iconNight= cJSON_GetObjectItem(now_cjson, "iconNight"); + if(now_data_iconNight) + { + iconNight=now_data_iconNight->valueint; + } + set_weather_now_data(humidity,windScale,textNight,uvIndex,temp,iconNight); + + + cJSON *address_cjson = cJSON_GetObjectItem(root, "address"); + + char*city=NULL; + char*subLocality=NULL; + char*atm=NULL; + int lat=0; + int lon=0; + + cJSON *address_cjson_ = cJSON_GetObjectItem(address_cjson, "city"); + if(address_cjson_) + { + city=address_cjson_->valuestring; + } + + + address_cjson_= cJSON_GetObjectItem(address_cjson, "subLocality"); + if(address_cjson_) + { + subLocality=address_cjson_->valuestring; + } + + address_cjson_=cJSON_GetObjectItem(address_cjson, "atm"); + if(address_cjson_) + { + atm=address_cjson_->valuestring; + } + address_cjson_ = cJSON_GetObjectItem(address_cjson, "lat"); + if(address_cjson_) + { + lat=address_cjson_->valueint; + } + + address_cjson_ = cJSON_GetObjectItem(address_cjson, "lon"); + if(address_cjson_) + { + lon=address_cjson_->valueint; + } + set_weather_address_data(lat,atm,city,subLocality,lon); + cJSON *daily = cJSON_GetObjectItem(root, "daily"); + if(daily==NULL) + { + return ; + } + int count= cJSON_GetArraySize(daily); + for(int i=0;ivalueint; + } + + data_=cJSON_GetObjectItem(data,"iconDay"); + if(data_&& cJSON_IsNumber(data_) ) + { + iconDay=data_->valueint; + } + + data_=cJSON_GetObjectItem(data,"fxDate"); + if(data_&& cJSON_IsNumber(data_) ) + { + fxDate=data_->valueint; + } + + data_=cJSON_GetObjectItem(data,"textDay"); + if(data_&& cJSON_IsString(data_) ) + { + textDay=data_->valuestring; + } + data_=cJSON_GetObjectItem(data,"tempMax"); + if(data_&& cJSON_IsNumber(data_) ) + { + tempMax=data_->valueint; + } + set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i); + + } + ble_UpdateMainWeatherData(); + cJSON_Delete(root); + return ; +} uint8_t parse_jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气数据 { @@ -2562,30 +2714,30 @@ uint8_t parse_jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 cJSON *data_=cJSON_GetObjectItem(data,"tempMin"); - if(data_) + if(data_&& cJSON_IsNumber(data_) ) { tempMin=data_->valueint; } data_=cJSON_GetObjectItem(data,"iconDay"); - if(data_) + if(data_&& cJSON_IsNumber(data_) ) { iconDay=data_->valueint; } data_=cJSON_GetObjectItem(data,"fxDate"); - if(data_) + if(data_&& cJSON_IsNumber(data_) ) { fxDate=data_->valueint; } data_=cJSON_GetObjectItem(data,"textDay"); - if(data_) + if(data_&& cJSON_IsString(data_) ) { textDay=data_->valuestring; } data_=cJSON_GetObjectItem(data,"tempMax"); - if(data_) + if(data_&& cJSON_IsNumber(data_) ) { tempMax=data_->valueint; } @@ -2638,6 +2790,7 @@ uint8_t read_jsonHistory_weather(void) fclose(fp); return 0; } + char *str = fgets((char *)buf,size + 1,fp); if(str!=NULL) { @@ -2645,9 +2798,9 @@ uint8_t read_jsonHistory_weather(void) } fclose(fp); - - uint8_t check = 0; - parse_jsonCheck_weather(buf,&check); + + parse_jsonCheck_weather_post(buf); + free(buf); return 1; diff --git a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h index 7b8b25df7..675d7bb0a 100644 --- a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h +++ b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h @@ -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); -- 2.17.1