PROTON-920: checks for valid channel and handle
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/6e7e04d2 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/6e7e04d2 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/6e7e04d2 Branch: refs/heads/cjansen-cpp-client Commit: 6e7e04d2e4d554ba5515aa07f3d05203edbfa3de Parents: f646079 Author: Gordon Sim <[email protected]> Authored: Wed Jun 24 19:25:19 2015 +0100 Committer: Gordon Sim <[email protected]> Committed: Wed Jun 24 19:25:33 2015 +0100 ---------------------------------------------------------------------- proton-c/src/transport/transport.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/6e7e04d2/proton-c/src/transport/transport.c ---------------------------------------------------------------------- diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c index ff80e21..4cf935b 100644 --- a/proton-c/src/transport/transport.c +++ b/proton-c/src/transport/transport.c @@ -1279,7 +1279,7 @@ int pn_do_attach(pn_transport_t *transport, uint8_t frame_type, uint16_t channel pn_session_t *ssn = pni_channel_state(transport, channel); if (!ssn) { - pn_do_error(transport, "amqp:connection:no-session", "attach without a session"); + pn_do_error(transport, "amqp:not-allowed", "no such channel: %u", channel); if (strheap) free(strheap); return PN_EOS; } @@ -1395,12 +1395,18 @@ int pn_do_transfer(pn_transport_t *transport, uint8_t frame_type, uint16_t chann &settled, &more, &has_type, &type, transport->disp_data); if (err) return err; pn_session_t *ssn = pni_channel_state(transport, channel); + if (!ssn) { + return pn_do_error(transport, "amqp:not-allowed", "no such channel: %u", channel); + } if (!ssn->state.incoming_window) { return pn_do_error(transport, "amqp:session:window-violation", "incoming session window exceeded"); } pn_link_t *link = pni_handle_state(ssn, handle); + if (!link) { + return pn_do_error(transport, "amqp:invalid-field", "no such handle: %u", handle); + } pn_delivery_t *delivery; if (link->unsettled_tail && !link->unsettled_tail->done) { delivery = link->unsettled_tail; @@ -1465,6 +1471,9 @@ int pn_do_flow(pn_transport_t *transport, uint8_t frame_type, uint16_t channel, if (err) return err; pn_session_t *ssn = pni_channel_state(transport, channel); + if (!ssn) { + return pn_do_error(transport, "amqp:not-allowed", "no such channel: %u", channel); + } if (inext_init) { ssn->state.remote_incoming_window = inext + iwin - ssn->state.outgoing_transfer_count; @@ -1474,6 +1483,9 @@ int pn_do_flow(pn_transport_t *transport, uint8_t frame_type, uint16_t channel, if (handle_init) { pn_link_t *link = pni_handle_state(ssn, handle); + if (!link) { + return pn_do_error(transport, "amqp:invalid-field", "no such handle: %u", handle); + } if (link->endpoint.type == SENDER) { pn_sequence_t receiver_count; if (dcount_init) { @@ -1535,6 +1547,10 @@ int pn_do_disposition(pn_transport_t *transport, uint8_t frame_type, uint16_t ch if (!last_init) last = first; pn_session_t *ssn = pni_channel_state(transport, channel); + if (!ssn) { + return pn_do_error(transport, "amqp:not-allowed", "no such channel: %u", channel); + } + pn_delivery_map_t *deliveries; if (role) { deliveries = &ssn->state.outgoing; @@ -1608,7 +1624,7 @@ int pn_do_detach(pn_transport_t *transport, uint8_t frame_type, uint16_t channel pn_session_t *ssn = pni_channel_state(transport, channel); if (!ssn) { - return pn_do_error(transport, "amqp:invalid-field", "no such channel: %u", channel); + return pn_do_error(transport, "amqp:not-allowed", "no such channel: %u", channel); } pn_link_t *link = pni_handle_state(ssn, handle); if (!link) { @@ -1633,6 +1649,9 @@ int pn_do_detach(pn_transport_t *transport, uint8_t frame_type, uint16_t channel int pn_do_end(pn_transport_t *transport, uint8_t frame_type, uint16_t channel, pn_data_t *args, const pn_bytes_t *payload) { pn_session_t *ssn = pni_channel_state(transport, channel); + if (!ssn) { + return pn_do_error(transport, "amqp:not-allowed", "no such channel: %u", channel); + } int err = pn_scan_error(args, &ssn->endpoint.remote_condition, SCAN_ERROR_DEFAULT); if (err) return err; PN_SET_REMOTE(ssn->endpoint.state, PN_REMOTE_CLOSED); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
