PROTON-771: Validate performative against frame type
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/d8e99db5 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/d8e99db5 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/d8e99db5 Branch: refs/heads/master Commit: d8e99db54449f22ea2b77c2d9ee4203c9f049e45 Parents: fc9b88e Author: Andrew Stitcher <[email protected]> Authored: Wed Nov 26 18:31:04 2014 -0500 Committer: Andrew Stitcher <[email protected]> Committed: Wed Dec 10 17:00:12 2014 -0500 ---------------------------------------------------------------------- proton-c/src/dispatch_actions.h | 4 +++ proton-c/src/dispatcher/dispatcher.c | 52 ++++++++++++++++++++----------- 2 files changed, 37 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d8e99db5/proton-c/src/dispatch_actions.h ---------------------------------------------------------------------- diff --git a/proton-c/src/dispatch_actions.h b/proton-c/src/dispatch_actions.h index c3a8aab..bae8438 100644 --- a/proton-c/src/dispatch_actions.h +++ b/proton-c/src/dispatch_actions.h @@ -24,6 +24,10 @@ #include "dispatcher/dispatcher.h" +#define AMQP_FRAME_TYPE (0) +#define SASL_FRAME_TYPE (1) + + /* AMQP actions */ int pn_do_open(pn_transport_t *transport, uint8_t frame_type, uint16_t channel, pn_data_t *args, const pn_bytes_t *payload); int pn_do_begin(pn_transport_t *transport, uint8_t frame_type, uint16_t channel, pn_data_t *args, const pn_bytes_t *payload); http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/d8e99db5/proton-c/src/dispatcher/dispatcher.c ---------------------------------------------------------------------- diff --git a/proton-c/src/dispatcher/dispatcher.c b/proton-c/src/dispatcher/dispatcher.c index ae04706..3b96a67 100644 --- a/proton-c/src/dispatcher/dispatcher.c +++ b/proton-c/src/dispatcher/dispatcher.c @@ -33,30 +33,44 @@ int pni_bad_frame(pn_transport_t *transport, uint8_t frame_type, uint16_t channe return PN_ERR; } +int pni_bad_frame_type(pn_transport_t *transport, uint8_t frame_type, uint16_t channel, pn_data_t *args, const pn_bytes_t *payload) { + pn_transport_logf(transport, "Error dispatching frame: Unknown frame type: %d", frame_type); + return PN_ERR; +} + // We could use a table based approach here if we needed to dynamically // add new performatives static inline int pni_dispatch_action(pn_transport_t* transport, uint64_t lcode, uint8_t frame_type, uint16_t channel, pn_data_t *args, const pn_bytes_t *payload) { pn_action_t *action; - switch (lcode) { - /* Regular AMQP fames */ - case OPEN: action = pn_do_open; break; - case BEGIN: action = pn_do_begin; break; - case ATTACH: action = pn_do_attach; break; - case FLOW: action = pn_do_flow; break; - case TRANSFER: action = pn_do_transfer; break; - case DISPOSITION: action = pn_do_disposition; break; - case DETACH: action = pn_do_detach; break; - case END: action = pn_do_end; break; - case CLOSE: action = pn_do_close; break; - - /* SASL frames */ - case SASL_MECHANISMS: action = pn_do_mechanisms; break; - case SASL_INIT: action = pn_do_init; break; - case SASL_CHALLENGE: action = pn_do_challenge; break; - case SASL_RESPONSE: action = pn_do_response; break; - case SASL_OUTCOME: action = pn_do_outcome; break; - default: action = pni_bad_frame; break; + switch (frame_type) { + case AMQP_FRAME_TYPE: + /* Regular AMQP fames */ + switch (lcode) { + case OPEN: action = pn_do_open; break; + case BEGIN: action = pn_do_begin; break; + case ATTACH: action = pn_do_attach; break; + case FLOW: action = pn_do_flow; break; + case TRANSFER: action = pn_do_transfer; break; + case DISPOSITION: action = pn_do_disposition; break; + case DETACH: action = pn_do_detach; break; + case END: action = pn_do_end; break; + case CLOSE: action = pn_do_close; break; + default: action = pni_bad_frame; break; + }; + break; + case SASL_FRAME_TYPE: + /* SASL frames */ + switch (lcode) { + case SASL_MECHANISMS: action = pn_do_mechanisms; break; + case SASL_INIT: action = pn_do_init; break; + case SASL_CHALLENGE: action = pn_do_challenge; break; + case SASL_RESPONSE: action = pn_do_response; break; + case SASL_OUTCOME: action = pn_do_outcome; break; + default: action = pni_bad_frame; break; + }; + break; + default: action = pni_bad_frame_type; break; }; return action(transport, frame_type, channel, args, payload); } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
