From 9009d207d85fd94bf71a9725b9c7fa9ec64803e2 Mon Sep 17 00:00:00 2001 From: Alfredo Cardigliano Date: Thu, 31 Oct 2024 18:14:56 +0100 Subject: Fix blocks with inner-json mode --- src/include/ndpi_typedefs.h | 1 + src/lib/ndpi_serializer.c | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h index b09c6bc21..4dfddc5f0 100644 --- a/src/include/ndpi_typedefs.h +++ b/src/include/ndpi_typedefs.h @@ -1695,6 +1695,7 @@ typedef enum { #define NDPI_SERIALIZER_STATUS_LIST (1 << 5) #define NDPI_SERIALIZER_STATUS_SOL (1 << 6) #define NDPI_SERIALIZER_STATUS_HDR_DONE (1 << 7) +#define NDPI_SERIALIZER_STATUS_CEOB (1 << 8) typedef struct { u_int32_t size_used; diff --git a/src/lib/ndpi_serializer.c b/src/lib/ndpi_serializer.c index ec8bfad51..f9439c8f8 100644 --- a/src/lib/ndpi_serializer.c +++ b/src/lib/ndpi_serializer.c @@ -151,11 +151,12 @@ void ndpi_reset_serializer(ndpi_serializer *_serializer) { serializer->status.buffer.size_used = 0; buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - if (serializer->multiline_json_array) { - serializer->status.buffer.size_used += ndpi_snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "{}"); - } else { + if (!serializer->multiline_json_array) { /* Note: please keep a space at the beginning as it is used for arrays when an end-of-record is used */ - serializer->status.buffer.size_used += ndpi_snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, " {}"); + serializer->buffer.data[serializer->status.buffer.size_used++] = ' '; + } + if (!serializer->inner_json) { + serializer->status.buffer.size_used += ndpi_snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "{}"); } } else if(serializer->fmt == ndpi_serialization_format_csv) { serializer->status.header.size_used = 0; @@ -765,8 +766,11 @@ static inline int ndpi_serialize_json_post(ndpi_serializer *_serializer) { if(serializer->status.buffer.size_used >= serializer->buffer.size) return -1; - if (!serializer->inner_json) + + if (!serializer->inner_json || serializer->status.flags & NDPI_SERIALIZER_STATUS_CEOB) { serializer->buffer.data[serializer->status.buffer.size_used++] = '}'; + serializer->status.flags &= ~NDPI_SERIALIZER_STATUS_CEOB; + } if (!serializer->multiline_json_array) { if(serializer->status.flags & NDPI_SERIALIZER_STATUS_ARRAY) { @@ -2375,6 +2379,7 @@ int ndpi_serialize_end_of_block(ndpi_serializer *_serializer) { serializer->status.flags &= ~NDPI_SERIALIZER_STATUS_SOB; // buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; + serializer->status.flags |= NDPI_SERIALIZER_STATUS_CEOB; if(ndpi_serialize_json_post(_serializer) != 0) return(-1); } else { @@ -2409,7 +2414,8 @@ void ndpi_serializer_rollback_snapshot(ndpi_serializer *_serializer) { } else { if (!serializer->multiline_json_array) serializer->buffer.data[0] = ' '; - serializer->buffer.data[serializer->status.buffer.size_used-1] = '}'; + if (!serializer->inner_json) + serializer->buffer.data[serializer->status.buffer.size_used-1] = '}'; } } } -- cgit v1.2.3