diff --git a/frameworks/native/include/sensor_agent_proxy.h b/frameworks/native/include/sensor_agent_proxy.h index 9313d814e020bfea91aee939046aed9d691d5757..7c2353c0cc58aea412a058644d0e57492e2d7375 100644 --- a/frameworks/native/include/sensor_agent_proxy.h +++ b/frameworks/native/include/sensor_agent_proxy.h @@ -67,6 +67,13 @@ private: static std::mutex createChannelMutex_; }; +const int32_t CHECK_CODE = 0x00ABCDEF; + +struct SensorInfoCheck { + int32_t checkCode = CHECK_CODE; + SensorInfo *sensorInfos = nullptr; +}; + #define SENSOR_AGENT_IMPL OHOS::DelayedSingleton::GetInstance() } // namespace Sensors } // namespace OHOS diff --git a/frameworks/native/src/sensor_agent_proxy.cpp b/frameworks/native/src/sensor_agent_proxy.cpp index 092c164f8f8f6a92d0bb6a33e130bcae54f465e7..dfb11bc27ea87c65d5e184e255383add3718f3b7 100644 --- a/frameworks/native/src/sensor_agent_proxy.cpp +++ b/frameworks/native/src/sensor_agent_proxy.cpp @@ -26,7 +26,7 @@ namespace Sensors { namespace { constexpr uint32_t MAX_SENSOR_LIST_SIZE = 0Xffff; std::mutex sensorInfoMutex_; -SensorInfo *sensorInfos_ = nullptr; +SensorInfoCheck sensorInfoCheck_; std::mutex sensorActiveInfoMutex_; SensorActiveInfo *sensorActiveInfos_ = nullptr; int32_t sensorInfoCount_ = 0; @@ -366,9 +366,11 @@ void SensorAgentProxy::ClearSensorInfos() const free(sensorActiveInfos_); sensorActiveInfos_ = nullptr; } - CHKPV(sensorInfos_); - free(sensorInfos_); - sensorInfos_ = nullptr; + CHKPV(sensorInfoCheck_.sensorInfos); + free(sensorInfoCheck_.sensorInfos); + sensorInfoCheck_.sensorInfos = nullptr; + sensorInfoCheck_.checkCode = CHECK_CODE; + sensorInfoCount_ = 0; } int32_t SensorAgentProxy::ConvertSensorInfos() const @@ -390,15 +392,20 @@ int32_t SensorAgentProxy::ConvertSensorInfos() const } if (sensorInfoCount_ > 0 && sensorInfoCount_ == static_cast(count)) { return SUCCESS; - } else if (sensorInfoCount_ > 0 && sensorInfoCount_ != static_cast(count)) { + } else if (sensorInfoCount_ > 0 && sensorInfoCount_ != static_cast(count) && + sensorInfoCheck_.checkCode == CHECK_CODE) { SEN_HILOGW("sensorInfos_ error, sensorInfoCount_:%{public}d, sensorListCount:%{public}d", sensorInfoCount_, static_cast(count)); ClearSensorInfos(); + } else if (sensorInfoCheck_.checkCode != CHECK_CODE) { + SEN_HILOGE("CheckCode has been modified, %{public}d", sensorInfoCheck_.checkCode); + ClearSensorInfos(); } - sensorInfos_ = (SensorInfo *)malloc(sizeof(SensorInfo) * count); - CHKPR(sensorInfos_, ERROR); + sensorInfoCheck_.sensorInfos = (SensorInfo *)malloc(sizeof(SensorInfo) * count); + CHKPR(sensorInfoCheck_.sensorInfos, ERROR); + SEN_HILOGI("Sensor count is %{public}zu", count); for (size_t i = 0; i < count; ++i) { - SensorInfo *sensorInfo = sensorInfos_ + i; + SensorInfo *sensorInfo = sensorInfoCheck_.sensorInfos + i; errno_t ret = strcpy_s(sensorInfo->sensorName, NAME_MAX_LEN, sensorList[i].GetSensorName().c_str()); CHKCR(ret == EOK, ERROR); @@ -418,6 +425,8 @@ int32_t SensorAgentProxy::ConvertSensorInfos() const sensorInfo->power = sensorList[i].GetPower(); sensorInfo->minSamplePeriod = sensorList[i].GetMinSamplePeriodNs(); sensorInfo->maxSamplePeriod = sensorList[i].GetMaxSamplePeriodNs(); + SEN_HILOGI("Sensor %{public}zu: sensorId is %{public}d, sensorTypeId is %{public}d", + i, sensorInfo->sensorId, sensorInfo->sensorTypeId); } sensorInfoCount_ = static_cast(count); return SUCCESS; @@ -435,9 +444,15 @@ int32_t SensorAgentProxy::GetAllSensors(SensorInfo **sensorInfo, int32_t *count) ClearSensorInfos(); return ERROR; } - *sensorInfo = sensorInfos_; + if (sensorInfoCheck_.checkCode != CHECK_CODE) { + SEN_HILOGE("CheckCode has been modified, %{public}d", sensorInfoCheck_.checkCode); + ClearSensorInfos(); + return ERROR; + } + CHKPR(sensorInfoCheck_.sensorInfos, OHOS::Sensors::ERROR); + *sensorInfo = sensorInfoCheck_.sensorInfos; *count = sensorInfoCount_; - PrintSensorData::GetInstance().PrintSensorInfo(sensorInfos_, sensorInfoCount_); + PrintSensorData::GetInstance().PrintSensorInfo(sensorInfoCheck_.sensorInfos, sensorInfoCount_); return SUCCESS; }