Skip to content

Commit 877b3a3

Browse files
committed
src: handle bad allocation errors
PR-URL: #20 Reviewed-by: Trevor Norris <[email protected]>
1 parent a0a32ca commit 877b3a3

File tree

1 file changed

+111
-56
lines changed

1 file changed

+111
-56
lines changed

src/nsolid.h

Lines changed: 111 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -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(
1036-
std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1039+
UserData* user_data = new (std::nothrow) UserData(
1040+
std::bind(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(
1066-
std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1074+
UserData* user_data = new (std::nothrow) UserData(
1075+
std::bind(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,22 @@ 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(
1096-
std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1109+
UserData* user_data = new (std::nothrow) UserData(
1110+
std::bind(std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1111+
1112+
if (user_data == nullptr) {
1113+
return UV_ENOMEM;
1114+
}
10971115

10981116
int er = get_cpu_profile_(envinst,
10991117
duration,
1100-
user_data.get(),
1118+
user_data,
11011119
cpu_profiler_proxy_<UserData>,
11021120
internal::delete_proxy_<UserData>);
1103-
if (!er)
1104-
user_data.release();
1121+
if (er) {
1122+
delete user_data;
1123+
}
1124+
11051125
return er;
11061126
}
11071127

@@ -1126,16 +1146,23 @@ int Snapshot::TakeSnapshot(SharedEnvInst envinst,
11261146

11271147
// _1 - int status
11281148
// _2 - std::string json
1129-
std::unique_ptr<UserData> user_data = std::make_unique<UserData>(std::bind(
1130-
std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1149+
UserData* user_data = new (std::nothrow) UserData(
1150+
std::bind(std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1151+
1152+
if (user_data == nullptr) {
1153+
return UV_ENOMEM;
1154+
}
11311155

11321156
int er = get_snapshot_(envinst,
11331157
redacted,
1134-
user_data.get(),
1158+
user_data,
11351159
snapshot_proxy_<UserData>,
11361160
internal::delete_proxy_<UserData>);
1137-
if (!er)
1138-
user_data.release();
1161+
1162+
if (er) {
1163+
delete user_data;
1164+
}
1165+
11391166
return er;
11401167
}
11411168

@@ -1151,14 +1178,20 @@ int QueueCallback(Cb&& cb, Data&&... data) {
11511178
using UserData = decltype(std::bind(
11521179
std::forward<Cb>(cb), std::forward<Data>(data)...));
11531180

1154-
std::unique_ptr<UserData> user_data = std::make_unique<UserData>(std::bind(
1155-
std::forward<Cb>(cb), std::forward<Data>(data)...));
1181+
UserData* user_data = new (std::nothrow)
1182+
UserData(std::bind(std::forward<Cb>(cb), std::forward<Data>(data)...));
1183+
1184+
if (user_data == nullptr) {
1185+
return UV_ENOMEM;
1186+
}
1187+
1188+
int er = internal::queue_callback_(user_data,
1189+
internal::queue_callback_proxy_<UserData>);
1190+
1191+
if (er) {
1192+
delete user_data;
1193+
}
11561194

1157-
int er = internal::queue_callback_(
1158-
user_data.get(),
1159-
internal::queue_callback_proxy_<UserData>);
1160-
if (!er)
1161-
user_data.release();
11621195
return er;
11631196
}
11641197

@@ -1168,15 +1201,20 @@ int QueueCallback(uint64_t timeout, Cb&& cb, Data&&... data) {
11681201
using UserData = decltype(std::bind(
11691202
std::forward<Cb>(cb), std::forward<Data>(data)...));
11701203

1171-
std::unique_ptr<UserData> user_data = std::make_unique<UserData>(std::bind(
1172-
std::forward<Cb>(cb), std::forward<Data>(data)...));
1204+
UserData* user_data = new (std::nothrow)
1205+
UserData(std::bind(std::forward<Cb>(cb), std::forward<Data>(data)...));
1206+
1207+
if (user_data == nullptr) {
1208+
return UV_ENOMEM;
1209+
}
11731210

11741211
int er = internal::queue_callback_(
1175-
timeout,
1176-
user_data.get(),
1177-
internal::queue_callback_proxy_<UserData>);
1178-
if (!er)
1179-
user_data.release();
1212+
timeout, user_data, internal::queue_callback_proxy_<UserData>);
1213+
1214+
if (er) {
1215+
delete user_data;
1216+
}
1217+
11801218
return er;
11811219
}
11821220

@@ -1191,17 +1229,20 @@ int RunCommand(SharedEnvInst envinst,
11911229
using UserData = decltype(std::bind(
11921230
std::forward<Cb>(cb), _1, std::forward<Data>(data)...));
11931231
// _1 - SharedEnvInst
1194-
std::unique_ptr<UserData> user_data = std::make_unique<UserData>(std::bind(
1195-
std::forward<Cb>(cb), _1, std::forward<Data>(data)...));
1232+
UserData* user_data = new (std::nothrow) UserData(
1233+
std::bind(std::forward<Cb>(cb), _1, std::forward<Data>(data)...));
1234+
1235+
if (user_data == nullptr) {
1236+
return UV_ENOMEM;
1237+
}
11961238

11971239
int er = internal::run_command_(
1198-
envinst,
1199-
type,
1200-
user_data.get(),
1201-
internal::run_command_proxy_<UserData>);
1240+
envinst, type, user_data, internal::run_command_proxy_<UserData>);
1241+
1242+
if (er) {
1243+
delete user_data;
1244+
}
12021245

1203-
if (!er)
1204-
user_data.release();
12051246
return 0;
12061247
}
12071248

@@ -1223,17 +1264,24 @@ int CustomCommand(SharedEnvInst envinst,
12231264
// _3 - int status
12241265
// _4 - std::pair<bool, std::string> error
12251266
// _5 - std::pair<bool, std::string> value
1226-
std::unique_ptr<UserData> user_data = std::make_unique<UserData>(std::bind(
1227-
std::forward<Cb>(cb), _1, _2, _3, _4, _5, std::forward<Data>(data)...));
1228-
int er = internal::custom_command_(
1229-
envinst,
1230-
req_id,
1231-
command,
1232-
args,
1233-
user_data.get(),
1234-
internal::custom_command_proxy_<UserData>);
1235-
if (!er)
1236-
user_data.release();
1267+
UserData* user_data = new (std::nothrow) UserData(std::bind(
1268+
std::forward<Cb>(cb), _1, _2, _3, _4, _5, std::forward<Data>(data)...));
1269+
1270+
if (user_data == nullptr) {
1271+
return UV_ENOMEM;
1272+
}
1273+
1274+
int er = internal::custom_command_(envinst,
1275+
req_id,
1276+
command,
1277+
args,
1278+
user_data,
1279+
internal::custom_command_proxy_<UserData>);
1280+
1281+
if (er) {
1282+
delete user_data;
1283+
}
1284+
12371285
return er;
12381286
}
12391287

@@ -1247,15 +1295,21 @@ int AtExitHook(Cb&& cb, Data&&... data) {
12471295

12481296
// _1 - bool on_signal
12491297
// _2 - bool profile_stopped
1250-
std::unique_ptr<UserData> user_data = std::make_unique<UserData>(std::bind(
1251-
std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1298+
UserData* user_data = new (std::nothrow) UserData(
1299+
std::bind(std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1300+
1301+
if (user_data == nullptr) {
1302+
return UV_ENOMEM;
1303+
}
1304+
1305+
int er = internal::at_exit_hook_(user_data,
1306+
internal::at_exit_hook_proxy_<UserData>,
1307+
internal::delete_proxy_<UserData>);
1308+
1309+
if (er) {
1310+
delete user_data;
1311+
}
12521312

1253-
int er = internal::at_exit_hook_(
1254-
user_data.get(),
1255-
internal::at_exit_hook_proxy_<UserData>,
1256-
internal::delete_proxy_<UserData>);
1257-
if (!er)
1258-
user_data.release();
12591313
return er;
12601314
}
12611315

@@ -1271,6 +1325,7 @@ int OnBlockedLoopHook(uint64_t threshold, Cb&& cb, Data&&... data) {
12711325
// _2 - std::string info
12721326
UserData* user_data = new (std::nothrow) UserData(std::bind(
12731327
std::forward<Cb>(cb), _1, _2, std::forward<Data>(data)...));
1328+
12741329
if (user_data == nullptr) {
12751330
return UV_ENOMEM;
12761331
}

0 commit comments

Comments
 (0)