This is an automated email from the ASF dual-hosted git repository.

astitcher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git

commit 3b7610a6409f6f41461360bf5a18eb39e266b4eb
Author: Andrew Stitcher <astitc...@apache.org>
AuthorDate: Thu Jul 20 10:58:09 2023 -0400

    PROTON-2838: Correctly handle null when decoding AMQP to raw
    
    Also add in raw encoding
---
 c/src/core/consumers.h |  6 +++---
 c/src/core/emitters.h  | 18 ++++++++++++++++++
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/c/src/core/consumers.h b/c/src/core/consumers.h
index 94d2a6e02..e9d685de7 100644
--- a/c/src/core/consumers.h
+++ b/c/src/core/consumers.h
@@ -265,9 +265,9 @@ static inline bool consume_single_value(pni_consumer_t* 
consumer, uint8_t* type)
 
 static inline bool consume_raw(pni_consumer_t* consumer, pn_bytes_t* raw) {
   size_t start = consumer->position;
-  uint8_t dummy;
-  bool succeed = consume_single_value(consumer, &dummy);
-  if (succeed) {
+  uint8_t type;
+  bool succeed = consume_single_value(consumer, &type);
+  if (succeed && type!=PNE_NULL) {
     *raw = (pn_bytes_t){.size=consumer->position-start, .start=(const 
char*)consumer->output_start+start};
   } else {
     *raw = (pn_bytes_t) {0, NULL};
diff --git a/c/src/core/emitters.h b/c/src/core/emitters.h
index 46cec39db..68ddeb9d0 100644
--- a/c/src/core/emitters.h
+++ b/c/src/core/emitters.h
@@ -159,6 +159,13 @@ static inline void pni_emitter_writev32(pni_emitter_t* 
emitter, const pn_bytes_t
   emitter->position += value.size;
 }
 
+static inline void pni_emitter_raw(pni_emitter_t* emitter, const pn_bytes_t 
raw)
+{
+  if (pni_emitter_remaining(emitter, raw.size))
+    memcpy(emitter->output_start+emitter->position, raw.start, raw.size);
+  emitter->position += raw.size;
+}
+
 
///////////////////////////////////////////////////////////////////////////////////////////////////
 
 static inline void emit_null(pni_emitter_t* emitter, pni_compound_context* 
compound) {
@@ -540,6 +547,17 @@ static inline void emit_copy(pni_emitter_t* emitter, 
pni_compound_context* compo
   compound->count++;
 }
 
+static inline void emit_raw(pni_emitter_t* emitter, pni_compound_context* 
compound, const pn_bytes_t bytes) {
+  if (bytes.size==0 || bytes.start == 0) {
+    emit_null(emitter, compound);
+    return;
+  }
+
+  emit_accumulated_nulls(emitter, compound);
+  pni_emitter_raw(emitter, bytes);
+  compound->count++;
+}
+
 static inline void emit_multiple(pni_emitter_t* emitter, pni_compound_context* 
compound, pn_data_t* data) {
   if (!data || pn_data_size(data) == 0) {
     emit_null(emitter, compound);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org
For additional commands, e-mail: commits-h...@qpid.apache.org

Reply via email to