diff --git a/common/include/dscreen_errcode.h b/common/include/dscreen_errcode.h index 0806f91e2d4b1fdd6c5389ca1be6e24e69c860f4..ae4b32b355c593a74136f2fe4cc6d5d2b3f22428 100644 --- a/common/include/dscreen_errcode.h +++ b/common/include/dscreen_errcode.h @@ -97,8 +97,9 @@ enum DScreenErrorCode { ERR_DH_SCREEN_SCREENCLIENT_HIDE_WINDOW_ERROR = -54004, // screen register callback ERR_DH_SCREEN_REGISTER_CALLBACK_NOT_INIT = -55000, - // screen string param empty + // screen string param empty or screen input param invalid ERR_DH_SCREEN_STRING_PARAM_EMPTY = -56000, + ERR_DH_SCREEN_INPUT_PARAM_INVALID = -56001, }; } // namespace DistributedHardware } // namespace OHOS diff --git a/interfaces/innerkits/native_cpp/screen_sink/include/dscreen_sink_proxy.h b/interfaces/innerkits/native_cpp/screen_sink/include/dscreen_sink_proxy.h index 34e9d14b7cdd8912eb282f636246919900a25d02..853f7a50c7ccbce6516b9ecdca9c65952bd81b4c 100644 --- a/interfaces/innerkits/native_cpp/screen_sink/include/dscreen_sink_proxy.h +++ b/interfaces/innerkits/native_cpp/screen_sink/include/dscreen_sink_proxy.h @@ -43,6 +43,9 @@ public: private: static inline BrokerDelegator delegator_; + + const size_t DID_MAX_SIZE = 256; + const size_t PARAM_MAX_SIZE = 50 * 1024 * 1024; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/interfaces/innerkits/native_cpp/screen_sink/src/dscreen_sink_proxy.cpp b/interfaces/innerkits/native_cpp/screen_sink/src/dscreen_sink_proxy.cpp index 1da1aeba8997fd2abd5ce34980746f0318ba0067..691982361de31c7af8e0459776eeb17d03c5faec 100644 --- a/interfaces/innerkits/native_cpp/screen_sink/src/dscreen_sink_proxy.cpp +++ b/interfaces/innerkits/native_cpp/screen_sink/src/dscreen_sink_proxy.cpp @@ -27,6 +27,10 @@ namespace OHOS { namespace DistributedHardware { int32_t DScreenSinkProxy::InitSink(const std::string ¶ms) { + if (params.empty() || params.size() > PARAM_MAX_SIZE) { + DHLOGE("InitSink error: invalid parameter."); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } sptr remote = Remote(); if (remote == nullptr) { DHLOGE("DScreenSinkProxy remote service null"); @@ -72,6 +76,10 @@ int32_t DScreenSinkProxy::ReleaseSink() int32_t DScreenSinkProxy::SubscribeLocalHardware(const std::string &dhId, const std::string ¶m) { + if (dhId.empty() || dhId.size() > DID_MAX_SIZE || param.empty() || param.size() > PARAM_MAX_SIZE) { + DHLOGE("SubscribeLocalHardware error: invalid parameter."); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } sptr remote = Remote(); if (remote == nullptr) { DHLOGE("DScreenSinkProxy remote service null"); @@ -97,6 +105,10 @@ int32_t DScreenSinkProxy::SubscribeLocalHardware(const std::string &dhId, const int32_t DScreenSinkProxy::UnsubscribeLocalHardware(const std::string &dhId) { + if (dhId.empty() || dhId.size() > DID_MAX_SIZE) { + DHLOGE("UnsubscribeLocalHardware error: invalid parameter."); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } sptr remote = Remote(); if (remote == nullptr) { DHLOGE("DScreenSinkProxy remote service null"); @@ -122,6 +134,11 @@ int32_t DScreenSinkProxy::UnsubscribeLocalHardware(const std::string &dhId) void DScreenSinkProxy::DScreenNotify(const std::string &devId, int32_t eventCode, const std::string &eventContent) { + if (devId.empty() || devId.size() > DID_MAX_SIZE || eventContent.empty() || + eventContent.size() > PARAM_MAX_SIZE) { + DHLOGE("DScreenNotify error: invalid parameter."); + return; + } sptr remote = Remote(); if (remote == nullptr) { DHLOGE("DScreenSinkProxy remote service null"); diff --git a/interfaces/innerkits/native_cpp/screen_source/include/callback/dscreen_source_callback_stub.h b/interfaces/innerkits/native_cpp/screen_source/include/callback/dscreen_source_callback_stub.h index 65a48aae1096131dc5331cafe866ea4fb8d46b36..ca7ae8aa1bdf66c63fe0afe0b7a00de699bacb08 100644 --- a/interfaces/innerkits/native_cpp/screen_source/include/callback/dscreen_source_callback_stub.h +++ b/interfaces/innerkits/native_cpp/screen_source/include/callback/dscreen_source_callback_stub.h @@ -38,11 +38,15 @@ private: using DScreenFunc = int32_t (DScreenSourceCallbackStub::*)(MessageParcel &data, MessageParcel &reply, MessageOption &option); std::map memberFuncMap_; + const size_t DID_MAX_SIZE = 256; + const size_t PARAM_MAX_SIZE = 50 * 1024 * 1024; int32_t OnNotifyRegResultInner(MessageParcel &data, MessageParcel &reply, MessageOption &option); int32_t OnNotifyUnregResultInner(MessageParcel &data, MessageParcel &reply, MessageOption &option); + bool CheckParams(const std::string &devId, const std::string &dhId, const std::string &reqId, + const std::string &resultData); }; } } diff --git a/interfaces/innerkits/native_cpp/screen_source/include/dscreen_source_proxy.h b/interfaces/innerkits/native_cpp/screen_source/include/dscreen_source_proxy.h index 13c3df828652b262a32c180b57df7ff652f77f1d..7fe69409775087205596435e4145f99e13b5f94f 100644 --- a/interfaces/innerkits/native_cpp/screen_source/include/dscreen_source_proxy.h +++ b/interfaces/innerkits/native_cpp/screen_source/include/dscreen_source_proxy.h @@ -47,6 +47,13 @@ public: private: static inline BrokerDelegator delegator_; + bool CheckRegParams(const std::string &devId, const std::string &dhId, + const EnableParam ¶m, const std::string &reqId); + bool CheckUnregParams(const std::string &devId, const std::string &dhId, const std::string &reqId); + bool CheckConfigParams(const std::string &devId, const std::string &dhId, + const std::string &key, const std::string &value); + const size_t DID_MAX_SIZE = 256; + const size_t PARAM_MAX_SIZE = 50 * 1024 * 1024; }; } } diff --git a/interfaces/innerkits/native_cpp/screen_source/src/callback/dscreen_source_callback_stub.cpp b/interfaces/innerkits/native_cpp/screen_source/src/callback/dscreen_source_callback_stub.cpp index faaf680268235531f31368db37f7b3b7e8a5d5ed..79744f0de9fdb7b73b18221e59cd476f953db852 100644 --- a/interfaces/innerkits/native_cpp/screen_source/src/callback/dscreen_source_callback_stub.cpp +++ b/interfaces/innerkits/native_cpp/screen_source/src/callback/dscreen_source_callback_stub.cpp @@ -60,6 +60,10 @@ int32_t DScreenSourceCallbackStub::OnNotifyRegResultInner(MessageParcel &data, M std::string reqId = data.ReadString(); int32_t status = data.ReadInt32(); std::string resultData = data.ReadString(); + if (!CheckParams(devId, dhId, reqId, resultData)) { + DHLOGE("OnNotifyRegResultInner error: Invalid parameter."); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } int32_t ret = OnNotifyRegResult(devId, dhId, reqId, status, resultData); return ret; } @@ -72,8 +76,26 @@ int32_t DScreenSourceCallbackStub::OnNotifyUnregResultInner(MessageParcel &data, std::string reqId = data.ReadString(); int32_t status = data.ReadInt32(); std::string resultData = data.ReadString(); + if (!CheckParams(devId, dhId, reqId, resultData)) { + DHLOGE("OnNotifyUnregResultInner error: Invalid parameter."); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } int32_t ret = OnNotifyUnregResult(devId, dhId, reqId, status, resultData); return ret; } + +bool DScreenSourceCallbackStub::CheckParams(const std::string &devId, const std::string &dhId, + const std::string &reqId, const std::string &resultData) +{ + if (devId.empty() || devId.size() > DID_MAX_SIZE || dhId.empty() || dhId.size() > DID_MAX_SIZE) { + DHLOGE("DScreenSourceCallbackStub CheckParams devId or dhId is invalid."); + return false; + } + if (reqId.empty() || reqId.size() > DID_MAX_SIZE || resultData.empty() || resultData.size() > PARAM_MAX_SIZE) { + DHLOGE("DScreenSourceCallbackStub CheckParams reqId or resultData is invalid."); + return false; + } + return true; +} } } \ No newline at end of file diff --git a/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_proxy.cpp b/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_proxy.cpp index 37fc7138256331fbbf25caf752e78801c38715ce..7daa876cca155c6b39adcc2649cfd2faf1bfd6fa 100644 --- a/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_proxy.cpp +++ b/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_proxy.cpp @@ -28,11 +28,16 @@ namespace OHOS { namespace DistributedHardware { int32_t DScreenSourceProxy::InitSource(const std::string ¶ms, const sptr &callback) { + if (params.empty() || params.size() > PARAM_MAX_SIZE || callback == nullptr) { + DHLOGE("InitSource error: invalid parameter"); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } sptr remote = Remote(); if (remote == nullptr) { DHLOGE("DScreenSourceProxy remote service null"); return DSCREEN_BAD_VALUE; } + MessageParcel data; MessageParcel reply; MessageOption option; @@ -59,6 +64,7 @@ int32_t DScreenSourceProxy::ReleaseSource() DHLOGE("DScreenSourceProxy remote service null"); return DSCREEN_BAD_VALUE; } + MessageParcel data; MessageParcel reply; MessageOption option; @@ -75,11 +81,16 @@ int32_t DScreenSourceProxy::ReleaseSource() int32_t DScreenSourceProxy::RegisterDistributedHardware(const std::string &devId, const std::string &dhId, const EnableParam ¶m, const std::string &reqId) { + if (!CheckRegParams(devId, dhId, param, reqId)) { + DHLOGE("RegisterDistributedHardware error: invalid parameter"); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } sptr remote = Remote(); if (remote == nullptr) { DHLOGE("DScreenSourceProxy remote service null"); return DSCREEN_BAD_VALUE; } + MessageParcel data; MessageParcel reply; MessageOption option; @@ -102,11 +113,16 @@ int32_t DScreenSourceProxy::RegisterDistributedHardware(const std::string &devId int32_t DScreenSourceProxy::UnregisterDistributedHardware(const std::string &devId, const std::string &dhId, const std::string &reqId) { + if (!CheckUnregParams(devId, dhId, reqId)) { + DHLOGE("UnregisterDistributedHardware error: invalid parameter"); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } sptr remote = Remote(); if (remote == nullptr) { DHLOGE("DScreenSourceProxy remote service null"); return DSCREEN_BAD_VALUE; } + MessageParcel data; MessageParcel reply; MessageOption option; @@ -128,11 +144,16 @@ int32_t DScreenSourceProxy::UnregisterDistributedHardware(const std::string &dev int32_t DScreenSourceProxy::ConfigDistributedHardware(const std::string &devId, const std::string &dhId, const std::string &key, const std::string &value) { + if (!CheckConfigParams(devId, dhId, key, value)) { + DHLOGE("ConfigDistributedHardware error: invalid parameter"); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } sptr remote = Remote(); if (remote == nullptr) { DHLOGE("DScreenSourceProxy remote service null"); return DSCREEN_BAD_VALUE; } + MessageParcel data; MessageParcel reply; MessageOption option; @@ -151,14 +172,19 @@ int32_t DScreenSourceProxy::ConfigDistributedHardware(const std::string &devId, return ret; } -void DScreenSourceProxy::DScreenNotify(const std::string &devId, - int32_t eventCode, const std::string &eventContent) +void DScreenSourceProxy::DScreenNotify(const std::string &devId, int32_t eventCode, const std::string &eventContent) { + if (devId.empty() || devId.size() > DID_MAX_SIZE || eventContent.empty() || + eventContent.size() > PARAM_MAX_SIZE) { + DHLOGE("DScreenNotify error: invalid parameter"); + return; + } sptr remote = Remote(); if (remote == nullptr) { DHLOGE("DScreenSourceProxy remote service null"); return; } + MessageParcel data; MessageParcel reply; MessageOption option = { MessageOption::TF_ASYNC }; @@ -174,5 +200,51 @@ void DScreenSourceProxy::DScreenNotify(const std::string &devId, remote->SendRequest(DSCREEN_NOTIFY, data, reply, option); } + +bool DScreenSourceProxy::CheckRegParams(const std::string &devId, const std::string &dhId, + const EnableParam ¶m, const std::string &reqId) +{ + if (devId.empty() || devId.size() > DID_MAX_SIZE || dhId.empty() || dhId.size() > DID_MAX_SIZE) { + DHLOGE("DScreenSourceProxy CheckRegParams devId or dhId is invalid."); + return false; + } + if (reqId.empty() || reqId.size() > DID_MAX_SIZE) { + DHLOGE("DScreenSourceProxy CheckRegParams reqId is invalid."); + return false; + } + if (param.version.empty() || param.version.size() > PARAM_MAX_SIZE || param.attrs.empty() || + param.attrs.size() > PARAM_MAX_SIZE) { + DHLOGE("DScreenSourceProxy CheckRegParams param is invalid."); + return false; + } + return true; +} + +bool DScreenSourceProxy::CheckUnregParams(const std::string &devId, const std::string &dhId, const std::string &reqId) +{ + if (devId.empty() || devId.size() > DID_MAX_SIZE || dhId.empty() || dhId.size() > DID_MAX_SIZE) { + DHLOGE("DScreenSourceProxy CheckUnregParams devId or dhId is invalid."); + return false; + } + if (reqId.empty() || reqId.size() > DID_MAX_SIZE) { + DHLOGE("DScreenSourceProxy CheckUnregParams reqId is invalid."); + return false; + } + return true; +} + +bool DScreenSourceProxy::CheckConfigParams(const std::string &devId, const std::string &dhId, + const std::string &key, const std::string &value) +{ + if (devId.empty() || devId.size() > DID_MAX_SIZE || dhId.empty() || dhId.size() > DID_MAX_SIZE) { + DHLOGE("DScreenSourceProxy CheckConfigParams devId or dhId is invalid."); + return false; + } + if (key.empty() || key.size() > PARAM_MAX_SIZE || value.empty() || value.size() > PARAM_MAX_SIZE) { + DHLOGE("DScreenSourceProxy CheckConfigParams key or value is invalid."); + return false; + } + return true; +} } } diff --git a/services/screenclient/src/screen_client.cpp b/services/screenclient/src/screen_client.cpp index a2b17115838b04f7a4a2c4ac913c1ef491bf35a8..5a61184e9f9f392964f449637114d34973b2e4db 100644 --- a/services/screenclient/src/screen_client.cpp +++ b/services/screenclient/src/screen_client.cpp @@ -75,7 +75,7 @@ int32_t ScreenClient::ShowWindow(int32_t windowId) int32_t ret = ScreenClientWindowAdapter::GetInstance().ShowWindow(windowId); if (DH_SUCCESS != ret) { DHLOGE("Show window (ID = %d) failed.", windowId); - return ERR_DH_SCREEN_SCREENCLIENT_SHOW_WINDOW_ERROR; + return ret; } DHLOGI("Show window (ID = %d) success.", windowId); return ret; @@ -94,7 +94,7 @@ int32_t ScreenClient::HideWindow(int32_t windowId) int32_t ret = ScreenClientWindowAdapter::GetInstance().HideWindow(windowId); if (DH_SUCCESS != ret) { DHLOGE("Hide window (ID = %d) failed.", windowId); - return ERR_DH_SCREEN_SCREENCLIENT_HIDE_WINDOW_ERROR; + return ret; } DHLOGI("Hide window (ID = %d) success.", windowId); return ret; @@ -113,7 +113,7 @@ int32_t ScreenClient::MoveWindow(int32_t windowId, int32_t startX, int32_t start int32_t ret = ScreenClientWindowAdapter::GetInstance().MoveWindow(windowId, startX, startY); if (DH_SUCCESS != ret) { DHLOGE("Move window (ID = %d) failed.", windowId); - return ERR_DH_SCREEN_SCREENCLIENT_MOVE_WINDOW_ERROR; + return ret; } DHLOGD("Move window (ID = %d) success.", windowId); return ret; @@ -153,7 +153,7 @@ int32_t ScreenClient::RemoveWindow(int32_t windowId) int32_t ret = ScreenClientWindowAdapter::GetInstance().RemoveWindow(windowId); if (ret != DH_SUCCESS) { DHLOGE("windowId (ID = %d) remove failed.", windowId); - return ERR_DH_SCREEN_SCREENCLIENT_REMOVE_WINDOW_ERROR; + return ret; } DHLOGD("windowId (ID = %d) remove success.", windowId); return DH_SUCCESS; diff --git a/services/screenservice/sinkservice/dscreenservice/include/dscreen_sink_stub.h b/services/screenservice/sinkservice/dscreenservice/include/dscreen_sink_stub.h index 7f13411fbfe8335c07e71e09ba018ae4abee472e..ce4b223a6fa233f506befe14baa9b99d991e439a 100644 --- a/services/screenservice/sinkservice/dscreenservice/include/dscreen_sink_stub.h +++ b/services/screenservice/sinkservice/dscreenservice/include/dscreen_sink_stub.h @@ -45,6 +45,9 @@ private: MessageOption &option); int32_t DScreenNotifyInner(MessageParcel &data, MessageParcel &reply, MessageOption &option); + + const size_t DID_MAX_SIZE = 256; + const size_t PARAM_MAX_SIZE = 50 * 1024 * 1024; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screenservice/sinkservice/dscreenservice/src/dscreen_sink_stub.cpp b/services/screenservice/sinkservice/dscreenservice/src/dscreen_sink_stub.cpp index e735fac05f0f561c486a93ee3599b9d9f84e2f72..6c4eaf6c7ae272464aa32ed5661f2c791855d633 100644 --- a/services/screenservice/sinkservice/dscreenservice/src/dscreen_sink_stub.cpp +++ b/services/screenservice/sinkservice/dscreenservice/src/dscreen_sink_stub.cpp @@ -53,6 +53,10 @@ int32_t DScreenSinkStub::InitSinkInner(MessageParcel &data, MessageParcel &reply MessageOption &option) { std::string param = data.ReadString(); + if (param.empty() || param.size() > PARAM_MAX_SIZE) { + DHLOGE("InitSinkInner error: invalid parameter."); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } int32_t ret = InitSink(param); reply.WriteInt32(ret); return DH_SUCCESS; @@ -71,6 +75,10 @@ int32_t DScreenSinkStub::SubscribeDistributedHardwareInner(MessageParcel &data, { std::string dhId = data.ReadString(); std::string param = data.ReadString(); + if (dhId.empty() || dhId.size() > DID_MAX_SIZE || param.empty() || param.size() > PARAM_MAX_SIZE) { + DHLOGE("SubscribeDistributedHardwareInner error: invalid parameter."); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } int32_t ret = SubscribeLocalHardware(dhId, param); reply.WriteInt32(ret); return DH_SUCCESS; @@ -80,6 +88,10 @@ int32_t DScreenSinkStub::UnsubscribeDistributedHardwareInner(MessageParcel &data MessageOption &option) { std::string dhId = data.ReadString(); + if (dhId.empty() || dhId.size() > DID_MAX_SIZE) { + DHLOGE("UnsubscribeDistributedHardwareInner error: invalid parameter."); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } int32_t ret = UnsubscribeLocalHardware(dhId); reply.WriteInt32(ret); return DH_SUCCESS; @@ -91,7 +103,11 @@ int32_t DScreenSinkStub::DScreenNotifyInner(MessageParcel &data, MessageParcel & std::string devId = data.ReadString(); int32_t eventCode = data.ReadInt32(); std::string eventContent = data.ReadString(); - + if (devId.empty() || devId.size() > DID_MAX_SIZE || eventContent.empty() || + eventContent.size() > PARAM_MAX_SIZE) { + DHLOGE("DScreenNotifyInner error: invalid parameter."); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } DScreenNotify(devId, eventCode, eventContent); return DH_SUCCESS; } diff --git a/services/screenservice/sourceservice/dscreenmgr/include/screen_manager_adapter.h b/services/screenservice/sourceservice/dscreenmgr/include/screen_manager_adapter.h index da25606f864bcb7604e40a64f492301f2cb55b07..c795dcf64b95a0c495639d8aa231c23c6ef18b64 100644 --- a/services/screenservice/sourceservice/dscreenmgr/include/screen_manager_adapter.h +++ b/services/screenservice/sourceservice/dscreenmgr/include/screen_manager_adapter.h @@ -44,7 +44,7 @@ private: ScreenMgrAdapter() = default; ~ScreenMgrAdapter(); - bool listenerRegistered = false; + bool listenerRegistered_ = false; std::map screenIdMap_; }; } // namespace DistributedHardware diff --git a/services/screenservice/sourceservice/dscreenmgr/src/dscreen.cpp b/services/screenservice/sourceservice/dscreenmgr/src/dscreen.cpp index fc4409b212f617c6d5f134c7ed10c1b0c05bcd6d..ce7e18168feb78ee18563d4b6ed585425e05c1e2 100644 --- a/services/screenservice/sourceservice/dscreenmgr/src/dscreen.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/src/dscreen.cpp @@ -184,7 +184,7 @@ void DScreen::HandleEnable(const std::string ¶m, const std::string &taskId) { DHLOGI("HandleEnable, devId: %s, dhId: %s", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str()); if (curState_ == ENABLED || curState_ == ENABLING || curState_ == CONNECTING || curState_ == CONNECTED) { - dscreenCallback_->OnRegResult(shared_from_this(), taskId, DH_SUCCESS, ""); + dscreenCallback_->OnRegResult(shared_from_this(), taskId, DH_SUCCESS, "dscreen enable success."); return; } @@ -229,7 +229,7 @@ void DScreen::HandleEnable(const std::string ¶m, const std::string &taskId) } screenId_ = screenId; SetState(ENABLED); - dscreenCallback_->OnRegResult(shared_from_this(), taskId, DH_SUCCESS, ""); + dscreenCallback_->OnRegResult(shared_from_this(), taskId, DH_SUCCESS, "dscreen enable success."); ReportRegisterScreenEvent(DSCREEN_REGISTER, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(), "dscreen enable success."); } @@ -267,9 +267,12 @@ int32_t DScreen::NegotiateCodecType(const std::string &remoteCodecInfoStr) std::vector> caps = codecList->GetVideoEncoderCaps(); for (const auto &cap : caps) { std::shared_ptr codecInfo = cap->GetCodecInfo(); + if (codecInfo == nullptr) { + continue; + } localCodecArray.push_back(codecInfo->GetName()); } - + std::vector codecTypeCandidates; for (const auto &remoteCodecType : remoteCodecArray) { if (std::find(localCodecArray.begin(), localCodecArray.end(), @@ -277,7 +280,7 @@ int32_t DScreen::NegotiateCodecType(const std::string &remoteCodecInfoStr) codecTypeCandidates.push_back(remoteCodecType); } } - + if (std::find(codecTypeCandidates.begin(), codecTypeCandidates.end(), CODEC_NAME_H264) != codecTypeCandidates.end()) { videoParam_->SetCodecType(VIDEO_CODEC_TYPE_VIDEO_H264); diff --git a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp index c3e4d3db93988fb565e997d51cb7dabd41b6fd44..35f2673e1a5a4bd48d228c0e30ab9f3120d647ed 100644 --- a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp @@ -319,7 +319,7 @@ std::shared_ptr DScreenManager::FindDScreenByScreenId(uint64_t screenId std::lock_guard lock(dScreenMapMtx_); for (const auto &iter : dScreens_) { std::shared_ptr dScreen = iter.second; - if (!dScreen) { + if (dScreen == nullptr) { continue; } @@ -346,7 +346,7 @@ void DScreenManager::GetScreenDumpInfo(std::string &result) for (const auto &iter : dScreens_) { result.append(" {\n"); std::shared_ptr dScreen = iter.second; - if (!dScreen) { + if (dScreen == nullptr) { continue; } uint64_t screenId = dScreen->GetScreenId(); @@ -389,7 +389,7 @@ int32_t DScreenManager::NotifyRemoteScreenService(const std::string &devId, int3 DHLOGI("Notify remote sink screen service, remote devId: %s, eventCode: %d", GetAnonyString(devId).c_str(), eventCode); sptr remoteSinkSA = GetDScreenSinkSA(devId); - if (!remoteSinkSA) { + if (remoteSinkSA == nullptr) { DHLOGE("get remote sink sa failed."); return ERR_DH_SCREEN_SA_GET_REMOTE_SINK_SERVICE_FAIL; } @@ -409,7 +409,7 @@ sptr DScreenManager::GetDScreenSinkSA(const std::string &devId) DHLOGI("GetDScreenSinkSA, devId: %s", GetAnonyString(devId).c_str()); sptr samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); - if (!samgr) { + if (samgr == nullptr) { DHLOGE("Failed to get system ability mgr."); return nullptr; } diff --git a/services/screenservice/sourceservice/dscreenmgr/src/screen_manager_adapter.cpp b/services/screenservice/sourceservice/dscreenmgr/src/screen_manager_adapter.cpp index 7141040bd5a049bd8468369f69fd2c092318af9e..309af680c2477c6451cb4baa643ae0be482e0a8e 100644 --- a/services/screenservice/sourceservice/dscreenmgr/src/screen_manager_adapter.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/src/screen_manager_adapter.cpp @@ -73,7 +73,7 @@ uint64_t ScreenMgrAdapter::CreateVirtualScreen(const std::string &devId, const s int32_t ScreenMgrAdapter::RegisterScreenGroupListener(sptr listener) { DHLOGI("RegisterScreenGroupListener"); - if (listenerRegistered) { + if (listenerRegistered_) { DHLOGI("already registered listener."); return DH_SUCCESS; } @@ -82,14 +82,14 @@ int32_t ScreenMgrAdapter::RegisterScreenGroupListener(sptr listener) { DHLOGI("UnregisterScreenGroupListener"); - if (!listenerRegistered) { + if (!listenerRegistered_) { DHLOGI("listener already unregistered."); return DH_SUCCESS; } @@ -98,7 +98,7 @@ int32_t ScreenMgrAdapter::UnregisterScreenGroupListener(sptr delegator_; + bool CheckParams(const std::string &devId, const std::string &dhId, const std::string &reqId, + const std::string &resultData); + const size_t DID_MAX_SIZE = 256; + const size_t PARAM_MAX_SIZE = 50 * 1024 * 1024; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_stub.h b/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_stub.h index 9ed200600a6cbba8329e08840c258e9654c5de1d..487d7e7f1632a55d53591558541c50392f68023b 100644 --- a/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_stub.h +++ b/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_stub.h @@ -42,10 +42,17 @@ private: MessageOption &option); int32_t DScreenNotifyInner(MessageParcel &data, MessageParcel &reply, MessageOption &option); - + bool CheckRegParams(const std::string &devId, const std::string &dhId, + const std::string &version, const std::string &attrs, const std::string &reqId); + bool CheckUnregParams(const std::string &devId, const std::string &dhId, const std::string &reqId); + bool CheckConfigParams(const std::string &devId, const std::string &dhId, + const std::string &key, const std::string &value); using DScreenSourceFunc = int32_t (DScreenSourceStub::*)(MessageParcel &data, MessageParcel &reply, MessageOption &option); std::map memberFuncMap_; + + const size_t DID_MAX_SIZE = 256; + const size_t PARAM_MAX_SIZE = 50 * 1024 * 1024; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screenservice/sourceservice/dscreenservice/src/callback/dscreen_source_callback_proxy.cpp b/services/screenservice/sourceservice/dscreenservice/src/callback/dscreen_source_callback_proxy.cpp index 508a0bbf148601974c2a338f712dc15e7ee94564..af76103f32695ca62b1911699f24dceaa12fdd64 100644 --- a/services/screenservice/sourceservice/dscreenservice/src/callback/dscreen_source_callback_proxy.cpp +++ b/services/screenservice/sourceservice/dscreenservice/src/callback/dscreen_source_callback_proxy.cpp @@ -26,6 +26,10 @@ namespace DistributedHardware { int32_t DScreenSourceCallbackProxy::OnNotifyRegResult(const std::string &devId, const std::string &dhId, const std::string &reqId, int32_t status, const std::string &resultData) { + if (!CheckParams(devId, dhId, reqId, resultData)) { + DHLOGE("OnNotifyRegResult error: invalid parameter."); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } sptr remote = Remote(); if (remote == nullptr) { DHLOGE("DScreenSourceCallbackProxy remote service null"); @@ -53,6 +57,10 @@ int32_t DScreenSourceCallbackProxy::OnNotifyRegResult(const std::string &devId, int32_t DScreenSourceCallbackProxy::OnNotifyUnregResult(const std::string &devId, const std::string &dhId, const std::string &reqId, int32_t status, const std::string &resultData) { + if (!CheckParams(devId, dhId, reqId, resultData)) { + DHLOGE("OnNotifyUnregResult error: invalid parameter."); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } sptr remote = Remote(); if (remote == nullptr) { DHLOGE("DScreenSourceCallbackProxy remote service null"); @@ -76,5 +84,19 @@ int32_t DScreenSourceCallbackProxy::OnNotifyUnregResult(const std::string &devId remote->SendRequest(NOTIFY_UNREG_RESULT, data, reply, option); return reply.ReadInt32(); } + +bool DScreenSourceCallbackProxy::CheckParams(const std::string &devId, const std::string &dhId, + const std::string &reqId, const std::string &resultData) +{ + if (devId.empty() || devId.size() > DID_MAX_SIZE || dhId.empty() || dhId.size() > DID_MAX_SIZE) { + DHLOGE("DScreenSourceCallbackProxy CheckParams devId or dhId is invalid."); + return false; + } + if (reqId.empty() || reqId.size() > DID_MAX_SIZE || resultData.empty() || resultData.size() > PARAM_MAX_SIZE) { + DHLOGE("DScreenSourceCallbackProxy CheckParams reqId or resultData is invalid."); + return false; + } + return true; +} } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_stub.cpp b/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_stub.cpp index d15449bf8206b4f65f97ff899b0160bcda8c69f4..e8fda0a48873a12e2d96447789c2c77a05b4d845 100644 --- a/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_stub.cpp +++ b/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_stub.cpp @@ -57,6 +57,10 @@ int32_t DScreenSourceStub::InitSourceInner(MessageParcel &data, MessageParcel &r MessageOption &option) { std::string param = data.ReadString(); + if (param.empty() || param.size() > PARAM_MAX_SIZE) { + DHLOGE("InitSourceInner error: invalid parameter"); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } sptr remoteObject = data.ReadRemoteObject(); if (remoteObject == nullptr) { DHLOGE("Read param failed."); @@ -64,6 +68,10 @@ int32_t DScreenSourceStub::InitSourceInner(MessageParcel &data, MessageParcel &r } sptr dScreenSourceCallbackProxy(new DScreenSourceCallbackProxy(remoteObject)); + if (dScreenSourceCallbackProxy == nullptr) { + DHLOGE("dScreenSourceCallbackProxy is nullptr."); + return ERR_DH_SCREEN_SA_READPARAM_FAILED; + } int32_t ret = InitSource(param, dScreenSourceCallbackProxy); reply.WriteInt32(ret); return DH_SUCCESS; @@ -85,6 +93,10 @@ int32_t DScreenSourceStub::RegisterDistributedHardwareInner(MessageParcel &data, std::string version = data.ReadString(); std::string attrs = data.ReadString(); std::string reqId = data.ReadString(); + if (!CheckRegParams(devId, dhId, version, attrs, reqId)) { + DHLOGE("RegisterDistributedHardwareInner error: invalid parameter"); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } EnableParam enableParam; enableParam.version = version; enableParam.attrs = attrs; @@ -100,6 +112,10 @@ int32_t DScreenSourceStub::UnregisterDistributedHardwareInner(MessageParcel &dat std::string devId = data.ReadString(); std::string dhId = data.ReadString(); std::string reqId = data.ReadString(); + if (!CheckUnregParams(devId, dhId, reqId)) { + DHLOGE("UnregisterDistributedHardwareInner error: invalid parameter"); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } int32_t ret = UnregisterDistributedHardware(devId, dhId, reqId); reply.WriteInt32(ret); @@ -113,6 +129,10 @@ int32_t DScreenSourceStub::ConfigDistributedHardwareInner(MessageParcel &data, M std::string dhId = data.ReadString(); std::string key = data.ReadString(); std::string value = data.ReadString(); + if (!CheckConfigParams(devId, dhId, key, value)) { + DHLOGE("ConfigDistributedHardwareInner error: invalid parameter"); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } int32_t ret = ConfigDistributedHardware(devId, dhId, key, value); reply.WriteInt32(ret); @@ -125,9 +145,59 @@ int32_t DScreenSourceStub::DScreenNotifyInner(MessageParcel &data, MessageParcel std::string devId = data.ReadString(); int32_t eventCode = data.ReadInt32(); std::string eventContent = data.ReadString(); + if (devId.empty() || devId.size() > DID_MAX_SIZE || eventContent.empty() || + eventContent.size() > PARAM_MAX_SIZE) { + DHLOGE("DScreenNotifyInner error: invalid parameter"); + return ERR_DH_SCREEN_INPUT_PARAM_INVALID; + } DScreenNotify(devId, eventCode, eventContent); return DH_SUCCESS; } + +bool DScreenSourceStub::CheckRegParams(const std::string &devId, const std::string &dhId, + const std::string &version, const std::string &attrs, const std::string &reqId) +{ + if (devId.empty() || devId.size() > DID_MAX_SIZE || dhId.empty() || dhId.size() > DID_MAX_SIZE) { + DHLOGE("DScreenSourceStub CheckRegParams devId or dhId is inlvalid."); + return false; + } + if (version.empty() || version.size() > PARAM_MAX_SIZE || attrs.empty() || attrs.size() > PARAM_MAX_SIZE) { + DHLOGE("DScreenSourceStub CheckRegParams version or attrs is inlvalid."); + return false; + } + if (reqId.empty() || reqId.size() > DID_MAX_SIZE) { + DHLOGE("DScreenSourceStub CheckRegParams reqId is inlvalid."); + return false; + } + return true; +} + +bool DScreenSourceStub::CheckUnregParams(const std::string &devId, const std::string &dhId, const std::string &reqId) +{ + if (devId.empty() || devId.size() > DID_MAX_SIZE || dhId.empty() || dhId.size() > DID_MAX_SIZE) { + DHLOGE("DScreenSourceStub CheckUnregParams devId or dhId is invalid."); + return false; + } + if (reqId.empty() || reqId.size() > DID_MAX_SIZE) { + DHLOGE("DScreenSourceStub CheckUnregParams reqId is invalid."); + return false; + } + return true; +} + +bool DScreenSourceStub::CheckConfigParams(const std::string &devId, const std::string &dhId, + const std::string &key, const std::string &value) +{ + if (devId.empty() || devId.size() > DID_MAX_SIZE || dhId.empty() || dhId.size() > DID_MAX_SIZE) { + DHLOGE("DScreenSourceStub CheckConfigParams devId or dhId is invalid."); + return false; + } + if (key.empty() || key.size() > PARAM_MAX_SIZE || value.empty() || value.size() > PARAM_MAX_SIZE) { + DHLOGE("DScreenSourceStub CheckConfigParams key or value is invalid."); + return false; + } + return true; +} } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/services/screentransport/screensinktrans/src/screen_sink_trans.cpp b/services/screentransport/screensinktrans/src/screen_sink_trans.cpp index 8a7395f5ea96001b96d5c26ec8923fb4517c8a76..0728bdb8e47504217a03762c59c1d5cf669924f9 100644 --- a/services/screentransport/screensinktrans/src/screen_sink_trans.cpp +++ b/services/screentransport/screensinktrans/src/screen_sink_trans.cpp @@ -47,7 +47,7 @@ int32_t ScreenSinkTrans::SetUp(const VideoParam &localParam, const VideoParam &r int32_t ScreenSinkTrans::Release() { DHLOGI("%s: Release.", LOG_TAG); - if (!imageProcessor_ || !screenChannel_) { + if (imageProcessor_ ==nullptr || screenChannel_ == nullptr) { DHLOGE("%s: Processor or channel is null, Setup first.", LOG_TAG); return ERR_DH_SCREEN_TRANS_NULL_VALUE; } @@ -73,7 +73,7 @@ int32_t ScreenSinkTrans::Release() int32_t ScreenSinkTrans::Start() { DHLOGI("%s: Start.", LOG_TAG); - if (!imageProcessor_ || !screenChannel_) { + if (imageProcessor_ == nullptr || screenChannel_ == nullptr) { DHLOGE("%s: Processor or channel is null, Setup first.", LOG_TAG); return ERR_DH_SCREEN_TRANS_NULL_VALUE; } @@ -91,7 +91,7 @@ int32_t ScreenSinkTrans::Start() int32_t ScreenSinkTrans::Stop() { DHLOGI("%s: Stop.", LOG_TAG); - if (!imageProcessor_ || !screenChannel_) { + if (imageProcessor_ == nullptr || screenChannel_ == nullptr) { DHLOGE("%s: Processor or channel is null, Setup first.", LOG_TAG); return ERR_DH_SCREEN_TRANS_NULL_VALUE; } @@ -123,7 +123,7 @@ int32_t ScreenSinkTrans::Stop() int32_t ScreenSinkTrans::RegisterStateCallback(const std::shared_ptr &callback) { DHLOGI("%s:RegisterStateCallback.", LOG_TAG); - if (!callback) { + if (callback == nullptr) { DHLOGE("%s: Trans callback is null.", LOG_TAG); return ERR_DH_SCREEN_TRANS_NULL_VALUE; } @@ -134,7 +134,7 @@ int32_t ScreenSinkTrans::RegisterStateCallback(const std::shared_ptr &surface) { - if (!surface) { + if (surface == nullptr) { DHLOGE("%s: Image surface is null.", LOG_TAG); return ERR_DH_SCREEN_TRANS_NULL_VALUE; } @@ -208,7 +208,7 @@ int32_t ScreenSinkTrans::InitScreenTrans(const VideoParam &localParam, const Vid const std::string &peerDevId) { screenChannel_ = std::make_shared(peerDevId); - if (!screenChannel_) { + if (screenChannel_ == nullptr) { DHLOGE("%s: Create screen data channel failed.", LOG_TAG); return ERR_DH_SCREEN_TRANS_NULL_VALUE; } @@ -220,7 +220,7 @@ int32_t ScreenSinkTrans::InitScreenTrans(const VideoParam &localParam, const Vid } imageProcessor_ = std::make_shared(); - if (!imageProcessor_) { + if (imageProcessor_ == nullptr) { DHLOGE("%s: Create image processor failed.", LOG_TAG); screenChannel_ = nullptr; return ERR_DH_SCREEN_TRANS_NULL_VALUE; @@ -240,7 +240,7 @@ int32_t ScreenSinkTrans::RegisterChannelListener() { DHLOGI("%s: RegisterChannelListener.", LOG_TAG); std::shared_ptr listener = shared_from_this(); - if (!listener) { + if (listener == nullptr) { DHLOGE("%s: Channel Listener is null.", LOG_TAG); return ERR_DH_SCREEN_TRANS_NULL_VALUE; } @@ -260,7 +260,7 @@ int32_t ScreenSinkTrans::RegisterProcessorListener(const VideoParam &localParam, { DHLOGI("%s: RegisterProcessorListener.", LOG_TAG); std::shared_ptr listener = shared_from_this(); - if (!listener) { + if (listener == nullptr) { DHLOGE("%s: Channel listener to null.", LOG_TAG); return ERR_DH_SCREEN_TRANS_NULL_VALUE; } @@ -289,7 +289,7 @@ void ScreenSinkTrans::OnSessionClosed() { DHLOGI("%s:OnChannelSessionClosed.", LOG_TAG); std::shared_ptr callback = transCallback_.lock(); - if (!callback) { + if (callback == nullptr) { DHLOGE("%s: Trans callback is null.", LOG_TAG); return; } @@ -309,7 +309,7 @@ void ScreenSinkTrans::OnProcessorStateNotify(int32_t state) { DHLOGI("%s: OnProcessorStateNotify.", LOG_TAG); std::shared_ptr callback = transCallback_.lock(); - if (!callback) { + if (callback == nullptr) { DHLOGE("%s: Trans callback is null.", LOG_TAG); return; } diff --git a/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h b/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h index 88c6ce5fed0d0760646781efbb778037b1e1ef6c..781ba1719e2451c31263f74e8d5014ee52c0c9cf 100644 --- a/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h +++ b/services/screentransport/screensourceprocessor/encoder/include/image_source_encoder.h @@ -66,6 +66,7 @@ private: std::shared_ptr videoSharedMemory_; std::shared_ptr encodeVideoCallback_; std::weak_ptr imageProcessorListener_; + const size_t DATA_BUFFER_MAX_SIZE = 10 * 1024 * 1024; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp index 77c04caa7f578d452c284faca45cdd914ec5d243..a265b8dca412a41f98d49063c2d616ddd2d8327d 100644 --- a/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp +++ b/services/screentransport/screensourceprocessor/encoder/src/image_source_encoder.cpp @@ -231,6 +231,10 @@ void ImageSourceEncoder::OnOutputBufferAvailable(uint32_t index, Media::AVCodecB } size_t dataSize = static_cast(info.size); + if (dataSize <= 0 || dataSize > DATA_BUFFER_MAX_SIZE) { + DHLOGE("%s:OnOutputBufferAvailable params invalid, size: %d.", LOG_TAG, dataSize); + return; + } auto dataBuf = std::make_shared(dataSize); if (dataBuf == nullptr) { DHLOGE("%s: Create buffer failed.", LOG_TAG); diff --git a/services/softbusadapter/src/softbus_adapter.cpp b/services/softbusadapter/src/softbus_adapter.cpp index 503c226ffa09e2cbb8f5665e566f79ee19a31e1d..c4814ab4acc6565ab222ef7415f5a64d649837e1 100644 --- a/services/softbusadapter/src/softbus_adapter.cpp +++ b/services/softbusadapter/src/softbus_adapter.cpp @@ -78,6 +78,10 @@ SoftbusAdapter::~SoftbusAdapter() int32_t SoftbusAdapter::RegisterSoftbusListener(const std::shared_ptr &listener, const std::string &sessionName, const std::string &peerDevId) { + if (listener == nullptr) { + DHLOGE("%s: listener is nullptr.", LOG_TAG); + return ERR_DH_SCREEN_ADAPTER_REGISTER_SOFTBUS_LISTENER_FAIL; + } DHLOGI("%s: RegisterListener sess:%s id:%s.", LOG_TAG, sessionName.c_str(), GetAnonyString(peerDevId).c_str()); std::string strListenerKey = sessionName + "_" + peerDevId;