@@ -989,9 +989,13 @@ int ThreadMetrics::Update(Cb&& cb, Data&&... data) {
989989 }
990990
991991 // _1 - ThreadMetrics*
992- UserData* user_data = new UserData (
992+ UserData* user_data = new (std::nothrow) UserData (
993993 std::bind (std::forward<Cb>(cb), _1, std::forward<Data>(data)...));
994994
995+ if (user_data == nullptr ) {
996+ return UV_ENOMEM;
997+ }
998+
995999 user_data_ = user_data;
9961000 proxy_ = thread_metrics_proxy_<UserData>;
9971001 stor_.thread_id = thread_id_;
@@ -1032,8 +1036,13 @@ MetricsStream* MetricsStream::CreateInstance(uint32_t flags,
10321036 std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
10331037 // _1 - MetricsStream* metrics_stream
10341038 // _2 - const metrics_stream_bucket& bucket
1035- UserData* user_data = new UserData (std::bind (
1039+ UserData* user_data = new (std::nothrow) UserData (std::bind (
10361040 std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1041+
1042+ if (user_data == nullptr ) {
1043+ return nullptr ;
1044+ }
1045+
10371046 stream->DoSetup (flags,
10381047 metrics_stream_proxy_<UserData>,
10391048 internal::delete_proxy_<UserData>,
@@ -1062,8 +1071,13 @@ Tracer* Tracer::CreateInstance(uint32_t flags, Cb&& cb, Data&&... data) {
10621071 std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
10631072 // _1 - Tracer*
10641073 // _2 - const SpanStor&
1065- UserData* user_data = new UserData (std::bind (
1074+ UserData* user_data = new (std::nothrow) UserData (std::bind (
10661075 std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1076+
1077+ if (user_data == nullptr ) {
1078+ return nullptr ;
1079+ }
1080+
10671081 tracer->DoSetup (flags,
10681082 trace_proxy_<UserData>,
10691083 internal::delete_proxy_<UserData>,
@@ -1092,16 +1106,23 @@ int CpuProfiler::TakeProfile(SharedEnvInst envinst,
10921106
10931107 // _1 - int status
10941108 // _2 - std::string json
1095- std::unique_ptr< UserData> user_data = std::make_unique< UserData> (std::bind (
1109+ UserData* user_data = new ( std::nothrow) UserData (std::bind (
10961110 std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
10971111
1112+ if (user_data == nullptr ) {
1113+ return UV_ENOMEM;
1114+ }
1115+
1116+
10981117 int er = get_cpu_profile_ (envinst,
10991118 duration,
1100- user_data. get () ,
1119+ user_data,
11011120 cpu_profiler_proxy_<UserData>,
11021121 internal::delete_proxy_<UserData>);
1103- if (!er)
1104- user_data.release ();
1122+ if (er) {
1123+ delete user_data;
1124+ }
1125+
11051126 return er;
11061127}
11071128
@@ -1126,16 +1147,23 @@ int Snapshot::TakeSnapshot(SharedEnvInst envinst,
11261147
11271148 // _1 - int status
11281149 // _2 - std::string json
1129- std::unique_ptr< UserData> user_data = std::make_unique< UserData> (std::bind (
1150+ UserData* user_data = new ( std::nothrow) UserData (std::bind (
11301151 std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
11311152
1153+ if (user_data == nullptr ) {
1154+ return UV_ENOMEM;
1155+ }
1156+
11321157 int er = get_snapshot_ (envinst,
11331158 redacted,
1134- user_data. get () ,
1159+ user_data,
11351160 snapshot_proxy_<UserData>,
11361161 internal::delete_proxy_<UserData>);
1137- if (!er)
1138- user_data.release ();
1162+
1163+ if (er) {
1164+ delete user_data;
1165+ }
1166+
11391167 return er;
11401168}
11411169
@@ -1151,14 +1179,21 @@ int QueueCallback(Cb&& cb, Data&&... data) {
11511179 using UserData = decltype (std::bind (
11521180 std::forward<Cb>(cb), std::forward<Data>(data)...));
11531181
1154- std::unique_ptr< UserData> user_data = std::make_unique< UserData> (std::bind (
1182+ UserData* user_data = new ( std::nothrow) UserData (std::bind (
11551183 std::forward<Cb>(cb), std::forward<Data>(data)...));
11561184
1185+ if (user_data == nullptr ) {
1186+ return UV_ENOMEM;
1187+ }
1188+
11571189 int er = internal::queue_callback_ (
1158- user_data. get () ,
1190+ user_data,
11591191 internal::queue_callback_proxy_<UserData>);
1160- if (!er)
1161- user_data.release ();
1192+
1193+ if (er) {
1194+ delete user_data;
1195+ }
1196+
11621197 return er;
11631198}
11641199
@@ -1168,15 +1203,22 @@ int QueueCallback(uint64_t timeout, Cb&& cb, Data&&... data) {
11681203 using UserData = decltype (std::bind (
11691204 std::forward<Cb>(cb), std::forward<Data>(data)...));
11701205
1171- std::unique_ptr< UserData> user_data = std::make_unique< UserData> (std::bind (
1206+ UserData* user_data = new ( std::nothrow) UserData (std::bind (
11721207 std::forward<Cb>(cb), std::forward<Data>(data)...));
11731208
1209+ if (user_data == nullptr ) {
1210+ return UV_ENOMEM;
1211+ }
1212+
11741213 int er = internal::queue_callback_ (
11751214 timeout,
1176- user_data. get () ,
1215+ user_data,
11771216 internal::queue_callback_proxy_<UserData>);
1178- if (!er)
1179- user_data.release ();
1217+
1218+ if (er) {
1219+ delete user_data;
1220+ }
1221+
11801222 return er;
11811223}
11821224
@@ -1191,17 +1233,23 @@ int RunCommand(SharedEnvInst envinst,
11911233 using UserData = decltype (std::bind (
11921234 std::forward<Cb>(cb), _1, std::forward<Data>(data)...));
11931235 // _1 - SharedEnvInst
1194- std::unique_ptr< UserData> user_data = std::make_unique< UserData> (std::bind (
1236+ UserData* user_data = new ( std::nothrow) UserData (std::bind (
11951237 std::forward<Cb>(cb), _1, std::forward<Data>(data)...));
11961238
1239+ if (user_data == nullptr ) {
1240+ return UV_ENOMEM;
1241+ }
1242+
11971243 int er = internal::run_command_ (
11981244 envinst,
11991245 type,
1200- user_data. get () ,
1246+ user_data,
12011247 internal::run_command_proxy_<UserData>);
12021248
1203- if (!er)
1204- user_data.release ();
1249+ if (er) {
1250+ delete user_data;
1251+ }
1252+
12051253 return 0 ;
12061254}
12071255
@@ -1223,17 +1271,25 @@ int CustomCommand(SharedEnvInst envinst,
12231271 // _3 - int status
12241272 // _4 - std::pair<bool, std::string> error
12251273 // _5 - std::pair<bool, std::string> value
1226- std::unique_ptr< UserData> user_data = std::make_unique< UserData> (std::bind (
1274+ UserData* user_data = new ( std::nothrow) UserData (std::bind (
12271275 std::forward<Cb>(cb), _1, _2, _3, _4, _5, std::forward<Data>(data)...));
1276+
1277+ if (user_data == nullptr ) {
1278+ return UV_ENOMEM;
1279+ }
1280+
12281281 int er = internal::custom_command_ (
12291282 envinst,
12301283 req_id,
12311284 command,
12321285 args,
1233- user_data. get () ,
1286+ user_data,
12341287 internal::custom_command_proxy_<UserData>);
1235- if (!er)
1236- user_data.release ();
1288+
1289+ if (er) {
1290+ delete user_data;
1291+ }
1292+
12371293 return er;
12381294}
12391295
@@ -1247,15 +1303,22 @@ int AtExitHook(Cb&& cb, Data&&... data) {
12471303
12481304 // _1 - bool on_signal
12491305 // _2 - bool profile_stopped
1250- std::unique_ptr< UserData> user_data = std::make_unique< UserData> (std::bind (
1306+ UserData* user_data = new ( std::nothrow) UserData (std::bind (
12511307 std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
12521308
1309+ if (user_data == nullptr ) {
1310+ return UV_ENOMEM;
1311+ }
1312+
12531313 int er = internal::at_exit_hook_ (
1254- user_data. get () ,
1314+ user_data,
12551315 internal::at_exit_hook_proxy_<UserData>,
12561316 internal::delete_proxy_<UserData>);
1257- if (!er)
1258- user_data.release ();
1317+
1318+ if (er) {
1319+ delete user_data;
1320+ }
1321+
12591322 return er;
12601323}
12611324
@@ -1271,6 +1334,7 @@ int OnBlockedLoopHook(uint64_t threshold, Cb&& cb, Data&&... data) {
12711334 // _2 - std::string info
12721335 UserData* user_data = new (std::nothrow) UserData (std::bind (
12731336 std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1337+
12741338 if (user_data == nullptr ) {
12751339 return UV_ENOMEM;
12761340 }
0 commit comments