DISPATCH-343 - Fixed a regression affecting multi-frame presettled deliveries.
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 8b2b114..a9612ea 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -461,8 +461,8 @@
//
qdr_delivery_ref_t *ref = DEQ_HEAD(updated_deliveries);
while (ref) {
- qdr_del_delivery_ref(&updated_deliveries, ref);
qdr_delivery_decref(ref->dlv);
+ qdr_del_delivery_ref(&updated_deliveries, ref);
ref = DEQ_HEAD(updated_deliveries);
}
diff --git a/src/router_node.c b/src/router_node.c
index ff5c58f..10794ac 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -374,9 +374,17 @@
bool give_reference = false;
//
+ // It's important to not do any processing without a qdr_delivery. When pre-settled
+ // multi-frame deliveries arrive, it's possible for the settlement to register before
+ // the whole message arrives. Such premature settlement indications must be ignored.
+ //
+ if (!delivery)
+ return;
+
+ //
// If the delivery is settled, remove the linkage between the PN and QDR deliveries.
//
- if (pn_delivery_settled(pnd) && !!delivery) {
+ if (pn_delivery_settled(pnd)) {
pn_delivery_set_context(pnd, 0);
qdr_delivery_set_context(delivery, 0);
@@ -389,10 +397,9 @@
//
// Update the disposition of the delivery
//
- if (!!delivery)
- qdr_delivery_update_disposition(router->router_core, delivery,
- pn_delivery_remote_state(pnd), pn_delivery_settled(pnd),
- give_reference);
+ qdr_delivery_update_disposition(router->router_core, delivery,
+ pn_delivery_remote_state(pnd), pn_delivery_settled(pnd),
+ give_reference);
//
// If settled, close out the delivery