Skip to content

Commit 2f89026

Browse files
LeeLeahy2me-no-dev
andauthored
Fix(NetworkEvents): Don't skip event callbacks in NetworkEvents::remo… (espressif#10337)
* Fix(NetworkEvents): Don't skip event callbacks in NetworkEvents::removeEvent Fixes Issue 10318 Includes pull request 10321 that fixes 10316 This change: * Adds code to find the event callbacks * Issues error when duplicate callbacks insertion attempts are made * Issues error when callbacks are not found during removal * Fix(NetworkEvents): Don't skip event callbacks in NetworkEvents::removeEvent Fixes Issue 10318 Includes pull request 10321 that fixes 10316 This change: * Adds code to find the event callbacks * Issues warning when duplicate callbacks insertion attempts are made * Issues warning when callbacks are not found during removal --------- Co-authored-by: Me No Dev <me-no-dev@users.noreply.github.com>
1 parent 3978870 commit 2f89026

File tree

2 files changed

+121
-23
lines changed

2 files changed

+121
-23
lines changed

libraries/Network/src/NetworkEvents.cpp

+118-23
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,73 @@ void NetworkEvents::checkForEvent() {
134134
free(event);
135135
}
136136

137+
uint32_t NetworkEvents::findEvent(NetworkEventCb cbEvent, arduino_event_id_t event) {
138+
uint32_t i;
139+
140+
if (!cbEvent) {
141+
return cbEventList.size();
142+
}
143+
144+
for (i = 0; i < cbEventList.size(); i++) {
145+
NetworkEventCbList_t entry = cbEventList[i];
146+
if (entry.cb == cbEvent && entry.event == event) {
147+
break;
148+
}
149+
}
150+
return i;
151+
}
152+
153+
template<typename T, typename... U> static size_t getStdFunctionAddress(std::function<T(U...)> f) {
154+
typedef T(fnType)(U...);
155+
fnType **fnPointer = f.template target<fnType *>();
156+
if (fnPointer != nullptr) {
157+
return (size_t)*fnPointer;
158+
}
159+
return (size_t)fnPointer;
160+
}
161+
162+
uint32_t NetworkEvents::findEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) {
163+
uint32_t i;
164+
165+
if (!cbEvent) {
166+
return cbEventList.size();
167+
}
168+
169+
for (i = 0; i < cbEventList.size(); i++) {
170+
NetworkEventCbList_t entry = cbEventList[i];
171+
if (getStdFunctionAddress(entry.fcb) == getStdFunctionAddress(cbEvent) && entry.event == event) {
172+
break;
173+
}
174+
}
175+
return i;
176+
}
177+
178+
uint32_t NetworkEvents::findEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) {
179+
uint32_t i;
180+
181+
if (!cbEvent) {
182+
return cbEventList.size();
183+
}
184+
185+
for (i = 0; i < cbEventList.size(); i++) {
186+
NetworkEventCbList_t entry = cbEventList[i];
187+
if (entry.scb == cbEvent && entry.event == event) {
188+
break;
189+
}
190+
}
191+
return i;
192+
}
193+
137194
network_event_handle_t NetworkEvents::onEvent(NetworkEventCb cbEvent, arduino_event_id_t event) {
138195
if (!cbEvent) {
139196
return 0;
140197
}
198+
199+
if (findEvent(cbEvent, event) < cbEventList.size()) {
200+
log_w("Attempt to add duplicate event handler!");
201+
return 0;
202+
}
203+
141204
NetworkEventCbList_t newEventHandler;
142205
newEventHandler.cb = cbEvent;
143206
newEventHandler.fcb = NULL;
@@ -151,6 +214,12 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventFuncCb cbEvent, arduin
151214
if (!cbEvent) {
152215
return 0;
153216
}
217+
218+
if (findEvent(cbEvent, event) < cbEventList.size()) {
219+
log_w("Attempt to add duplicate event handler!");
220+
return 0;
221+
}
222+
154223
NetworkEventCbList_t newEventHandler;
155224
newEventHandler.cb = NULL;
156225
newEventHandler.fcb = cbEvent;
@@ -164,6 +233,12 @@ network_event_handle_t NetworkEvents::onEvent(NetworkEventSysCb cbEvent, arduino
164233
if (!cbEvent) {
165234
return 0;
166235
}
236+
237+
if (findEvent(cbEvent, event) < cbEventList.size()) {
238+
log_w("Attempt to add duplicate event handler!");
239+
return 0;
240+
}
241+
167242
NetworkEventCbList_t newEventHandler;
168243
newEventHandler.cb = NULL;
169244
newEventHandler.fcb = NULL;
@@ -177,6 +252,12 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventCb cbEvent, arduino
177252
if (!cbEvent) {
178253
return 0;
179254
}
255+
256+
if (findEvent(cbEvent, event) < cbEventList.size()) {
257+
log_w("Attempt to add duplicate event handler!");
258+
return 0;
259+
}
260+
180261
NetworkEventCbList_t newEventHandler;
181262
newEventHandler.cb = cbEvent;
182263
newEventHandler.fcb = NULL;
@@ -190,6 +271,12 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventFuncCb cbEvent, ard
190271
if (!cbEvent) {
191272
return 0;
192273
}
274+
275+
if (findEvent(cbEvent, event) < cbEventList.size()) {
276+
log_w("Attempt to add duplicate event handler!");
277+
return 0;
278+
}
279+
193280
NetworkEventCbList_t newEventHandler;
194281
newEventHandler.cb = NULL;
195282
newEventHandler.fcb = cbEvent;
@@ -203,6 +290,12 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu
203290
if (!cbEvent) {
204291
return 0;
205292
}
293+
294+
if (findEvent(cbEvent, event) < cbEventList.size()) {
295+
log_w("Attempt to add duplicate event handler!");
296+
return 0;
297+
}
298+
206299
NetworkEventCbList_t newEventHandler;
207300
newEventHandler.cb = NULL;
208301
newEventHandler.fcb = NULL;
@@ -213,60 +306,62 @@ network_event_handle_t NetworkEvents::onSysEvent(NetworkEventSysCb cbEvent, ardu
213306
}
214307

215308
void NetworkEvents::removeEvent(NetworkEventCb cbEvent, arduino_event_id_t event) {
309+
uint32_t i;
310+
216311
if (!cbEvent) {
217312
return;
218313
}
219314

220-
for (uint32_t i = 0; i < cbEventList.size(); i++) {
221-
NetworkEventCbList_t entry = cbEventList[i];
222-
if (entry.cb == cbEvent && entry.event == event) {
223-
cbEventList.erase(cbEventList.begin() + i);
224-
}
315+
i = findEvent(cbEvent, event);
316+
if (i >= cbEventList.size()) {
317+
log_w("Event handler not found!");
318+
return;
225319
}
226-
}
227320

228-
template<typename T, typename... U> static size_t getStdFunctionAddress(std::function<T(U...)> f) {
229-
typedef T(fnType)(U...);
230-
fnType **fnPointer = f.template target<fnType *>();
231-
if (fnPointer != nullptr) {
232-
return (size_t)*fnPointer;
233-
}
234-
return (size_t)fnPointer;
321+
cbEventList.erase(cbEventList.begin() + i);
235322
}
236323

237324
void NetworkEvents::removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event) {
325+
uint32_t i;
326+
238327
if (!cbEvent) {
239328
return;
240329
}
241330

242-
for (uint32_t i = 0; i < cbEventList.size(); i++) {
243-
NetworkEventCbList_t entry = cbEventList[i];
244-
if (getStdFunctionAddress(entry.fcb) == getStdFunctionAddress(cbEvent) && entry.event == event) {
245-
cbEventList.erase(cbEventList.begin() + i);
246-
}
331+
i = findEvent(cbEvent, event);
332+
if (i >= cbEventList.size()) {
333+
log_w("Event handler not found!");
334+
return;
247335
}
336+
337+
cbEventList.erase(cbEventList.begin() + i);
248338
}
249339

250340
void NetworkEvents::removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event) {
341+
uint32_t i;
342+
251343
if (!cbEvent) {
252344
return;
253345
}
254346

255-
for (uint32_t i = 0; i < cbEventList.size(); i++) {
256-
NetworkEventCbList_t entry = cbEventList[i];
257-
if (entry.scb == cbEvent && entry.event == event) {
258-
cbEventList.erase(cbEventList.begin() + i);
259-
}
347+
i = findEvent(cbEvent, event);
348+
if (i >= cbEventList.size()) {
349+
log_w("Event handler not found!");
350+
return;
260351
}
352+
353+
cbEventList.erase(cbEventList.begin() + i);
261354
}
262355

263356
void NetworkEvents::removeEvent(network_event_handle_t id) {
264357
for (uint32_t i = 0; i < cbEventList.size(); i++) {
265358
NetworkEventCbList_t entry = cbEventList[i];
266359
if (entry.id == id) {
267360
cbEventList.erase(cbEventList.begin() + i);
361+
return;
268362
}
269363
}
364+
log_w("Event handler not found!");
270365
}
271366

272367
int NetworkEvents::setStatusBits(int bits) {

libraries/Network/src/NetworkEvents.h

+3
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,9 @@ class NetworkEvents {
155155

156156
protected:
157157
bool initNetworkEvents();
158+
uint32_t findEvent(NetworkEventCb cbEvent, arduino_event_id_t event);
159+
uint32_t findEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event);
160+
uint32_t findEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event);
158161
network_event_handle_t onSysEvent(NetworkEventCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
159162
network_event_handle_t onSysEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);
160163
network_event_handle_t onSysEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event = ARDUINO_EVENT_MAX);

0 commit comments

Comments
 (0)