You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by cl...@apache.org on 2018/03/21 22:47:10 UTC
qpid-proton git commit: PROTON-1514: check for settled flag on all
frames of multi-frame transfer;
enforce sole legal transition is settled to unsettled
Repository: qpid-proton
Updated Branches:
refs/heads/master 6fb0a94a6 -> e76aa91d0
PROTON-1514: check for settled flag on all frames of multi-frame transfer; enforce sole legal transition is settled to unsettled
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/e76aa91d
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/e76aa91d
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/e76aa91d
Branch: refs/heads/master
Commit: e76aa91d08f7b99c305bab301fb5f4c68dc842ac
Parents: 6fb0a94
Author: Clifford Jansen <cl...@apache.org>
Authored: Wed Mar 21 15:46:34 2018 -0700
Committer: Clifford Jansen <cl...@apache.org>
Committed: Wed Mar 21 15:46:34 2018 -0700
----------------------------------------------------------------------
proton-c/src/core/transport.c | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/e76aa91d/proton-c/src/core/transport.c
----------------------------------------------------------------------
diff --git a/proton-c/src/core/transport.c b/proton-c/src/core/transport.c
index 8fc9a75..2090a91 100644
--- a/proton-c/src/core/transport.c
+++ b/proton-c/src/core/transport.c
@@ -1475,12 +1475,12 @@ int pn_do_transfer(pn_transport_t *transport, uint8_t frame_type, uint16_t chann
pn_sequence_t id;
bool settled;
bool more;
- bool has_type;
+ bool has_type, settled_set;
bool resume, aborted, batchable;
uint64_t type;
pn_data_clear(transport->disp_data);
- int err = pn_data_scan(args, "D.[I?Iz.oo.D?LCooo]", &handle, &id_present, &id, &tag,
- &settled, &more, &has_type, &type, transport->disp_data,
+ int err = pn_data_scan(args, "D.[I?Iz.?oo.D?LCooo]", &handle, &id_present, &id, &tag,
+ &settled_set, &settled, &more, &has_type, &type, transport->disp_data,
&resume, &aborted, &batchable);
if (err) return err;
pn_session_t *ssn = pni_channel_state(transport, channel);
@@ -1499,6 +1499,8 @@ int pn_do_transfer(pn_transport_t *transport, uint8_t frame_type, uint16_t chann
pn_delivery_t *delivery;
if (link->unsettled_tail && !link->unsettled_tail->done) {
delivery = link->unsettled_tail;
+ if (settled_set && !settled && delivery->remote.settled)
+ return pn_do_error(transport, "amqp:invalid-field", "invalid transition from settled to unsettled");
} else {
pn_delivery_map_t *incoming = &ssn->state.incoming;
@@ -1523,18 +1525,17 @@ int pn_do_transfer(pn_transport_t *transport, uint8_t frame_type, uint16_t chann
link->state.delivery_count++;
link->state.link_credit--;
link->queued++;
-
- // XXX: need to fill in remote state: delivery->remote.state = ...;
- delivery->remote.settled = settled;
- if (settled) {
- delivery->updated = true;
- pn_work_update(transport->connection, delivery);
- }
}
pn_buffer_append(delivery->bytes, payload->start, payload->size);
ssn->incoming_bytes += payload->size;
delivery->done = !more;
+ // XXX: need to fill in remote state: delivery->remote.state = ...;
+ if (settled && !delivery->remote.settled) {
+ delivery->remote.settled = settled;
+ delivery->updated = true;
+ pn_work_update(transport->connection, delivery);
+ }
ssn->state.incoming_transfer_count++;
ssn->state.incoming_window--;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org