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]

Reply via email to