aboutsummaryrefslogtreecommitdiffstats
path: root/src/afb-xreq.c
diff options
context:
space:
mode:
authorJose Bollo <jose.bollo@iot.bzh>2019-07-10 15:18:02 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2019-07-12 18:26:00 +0200
commitbc38af3e79fbd6256c209a0673601832429e7418 (patch)
tree4d9d14c0abce569585cf71fd36b56e3f0560df53 /src/afb-xreq.c
parentc8cc0d6f3df5bb3eac75ee2665639fc0ab2c35fe (diff)
afb-xreq: Forbids (un)subscribes after reply
Allowing to subscribe to a request that was replied was possible and lead to problem revealed by issues SPEC-2542 and SPEC-2599 (these issues are more related to processing unordered incoming messages). The choice was - fix the bug and authorize (un)subscribe after reply - forbids to (un)subscribe after reply Second solution was chosen for its simplicity and its networking efficiency. Bug-AGL: SPEC-2542 Bug-AGL: SPEC-2599 Change-Id: I09f48b760b1fd6f70d42b80df3c8053696c45966 Signed-off-by: Jose Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'src/afb-xreq.c')
-rw-r--r--src/afb-xreq.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/src/afb-xreq.c b/src/afb-xreq.c
index 8cc22c3f..790a384f 100644
--- a/src/afb-xreq.c
+++ b/src/afb-xreq.c
@@ -202,12 +202,17 @@ static int xreq_legacy_subscribe_event_x1_cb(struct afb_req_x2 *closure, struct
int afb_xreq_subscribe(struct afb_xreq *xreq, struct afb_event_x2 *event)
{
- if (xreq->listener)
- return afb_evt_event_x2_add_watch(xreq->listener, event);
- if (xreq->queryitf->subscribe)
- return xreq->queryitf->subscribe(xreq, event);
- ERROR("no event listener, subscription impossible");
- errno = EINVAL;
+ if (xreq->replied) {
+ ERROR("request replied, subscription impossible");
+ errno = EINVAL;
+ } else {
+ if (xreq->listener)
+ return afb_evt_event_x2_add_watch(xreq->listener, event);
+ if (xreq->queryitf->subscribe)
+ return xreq->queryitf->subscribe(xreq, event);
+ ERROR("no event listener, subscription impossible");
+ errno = ENOTSUP;
+ }
return -1;
}
@@ -224,12 +229,17 @@ static int xreq_legacy_unsubscribe_event_x1_cb(struct afb_req_x2 *closure, struc
int afb_xreq_unsubscribe(struct afb_xreq *xreq, struct afb_event_x2 *event)
{
- if (xreq->listener)
- return afb_evt_event_x2_remove_watch(xreq->listener, event);
- if (xreq->queryitf->unsubscribe)
- return xreq->queryitf->unsubscribe(xreq, event);
- ERROR("no event listener, unsubscription impossible");
- errno = EINVAL;
+ if (xreq->replied) {
+ ERROR("request replied, unsubscription impossible");
+ errno = EINVAL;
+ } else {
+ if (xreq->listener)
+ return afb_evt_event_x2_remove_watch(xreq->listener, event);
+ if (xreq->queryitf->unsubscribe)
+ return xreq->queryitf->unsubscribe(xreq, event);
+ ERROR("no event listener, unsubscription impossible");
+ errno = ENOTSUP;
+ }
return -1;
}