diff options
-rw-r--r-- | src/lib/ndpi_serializer.c | 109 |
1 files changed, 62 insertions, 47 deletions
diff --git a/src/lib/ndpi_serializer.c b/src/lib/ndpi_serializer.c index bfbd56eb6..850973eaf 100644 --- a/src/lib/ndpi_serializer.c +++ b/src/lib/ndpi_serializer.c @@ -130,6 +130,21 @@ static int ndpi_json_string_escape(const char *src, int src_len, char *dst, int /* ********************************** */ +/* Similar to snprintf, this returns the number of bytes actually written + * in any case (unlike snprintf which returns, if the output is truncated, + * the number of bytes which *would have been* written) + */ +static inline int ndpi_snappend(char *buf, size_t size, const char *fmt, ...) { + size_t wlen; + va_list va; + va_start (va, fmt); + wlen = snprintf(buf, size, fmt, va); + va_end (va); + return ndpi_min(size, wlen); +} + +/* ********************************** */ + void ndpi_reset_serializer(ndpi_serializer *_serializer) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; @@ -142,7 +157,7 @@ void ndpi_reset_serializer(ndpi_serializer *_serializer) { buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; /* 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 += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, " {}"); + serializer->status.buffer.size_used += ndpi_snappend((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; serializer->status.buffer.size_used = 0; @@ -258,7 +273,7 @@ static inline int ndpi_serializer_header_uint32(ndpi_private_serializer *seriali if (room < 0) return -1; - serializer->status.header.size_used += snprintf((char *) &serializer->header.data[serializer->status.header.size_used], + serializer->status.header.size_used += ndpi_snappend((char *) &serializer->header.data[serializer->status.header.size_used], room, "%s%u", (serializer->status.header.size_used > 0) ? serializer->csv_separator : "", key); return 0; @@ -607,7 +622,7 @@ int ndpi_serialize_end_of_record(ndpi_serializer *_serializer) { } else if(serializer->fmt == ndpi_serialization_format_json) { if(!(serializer->status.flags & NDPI_SERIALIZER_STATUS_ARRAY)) { serializer->buffer.data[0] = '['; - serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "]"); } @@ -631,7 +646,7 @@ static inline void ndpi_serialize_csv_pre(ndpi_private_serializer *serializer) { /* nothing to do */ } else { u_int32_t buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s", serializer->csv_separator); } @@ -727,13 +742,13 @@ int ndpi_serialize_uint32_uint32(ndpi_serializer *_serializer, ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%u", value); @@ -742,7 +757,7 @@ int ndpi_serialize_uint32_uint32(ndpi_serializer *_serializer, if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%u", value); } else { @@ -795,13 +810,13 @@ int ndpi_serialize_uint32_uint64(ndpi_serializer *_serializer, ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%llu", (unsigned long long)value); @@ -810,7 +825,7 @@ int ndpi_serialize_uint32_uint64(ndpi_serializer *_serializer, if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%llu", (unsigned long long)value); } else { @@ -859,13 +874,13 @@ int ndpi_serialize_uint32_int32(ndpi_serializer *_serializer, ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%d", value); @@ -874,7 +889,7 @@ int ndpi_serialize_uint32_int32(ndpi_serializer *_serializer, if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%d", value); } else { @@ -927,13 +942,13 @@ int ndpi_serialize_uint32_int64(ndpi_serializer *_serializer, ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%lld", (long long int)value); @@ -942,7 +957,7 @@ int ndpi_serialize_uint32_int64(ndpi_serializer *_serializer, if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%lld", (long long int)value); } @@ -993,18 +1008,18 @@ int ndpi_serialize_uint32_float(ndpi_serializer *_serializer, ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, format, value); + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, format, value); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, format, value); + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, format, value); } else { ndpi_serialization_type kt; @@ -1049,7 +1064,7 @@ static int ndpi_serialize_uint32_binary(ndpi_serializer *_serializer, ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } @@ -1061,7 +1076,7 @@ static int ndpi_serialize_uint32_binary(ndpi_serializer *_serializer, if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s", value); } else { @@ -1112,13 +1127,13 @@ int ndpi_serialize_uint32_boolean(ndpi_serializer *_serializer, ndpi_serialize_json_pre(_serializer); if (!(serializer->status.flags & NDPI_SERIALIZER_STATUS_LIST)) { - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "\"%u\":", key); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s", value ? "true" : "false"); @@ -1127,7 +1142,7 @@ int ndpi_serialize_uint32_boolean(ndpi_serializer *_serializer, if (ndpi_serializer_header_uint32(serializer, key) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s", value ? "true" : "false"); } @@ -1170,12 +1185,12 @@ int ndpi_serialize_binary_int32(ndpi_serializer *_serializer, serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%d", value); ndpi_serialize_json_post(_serializer); @@ -1183,7 +1198,7 @@ int ndpi_serialize_binary_int32(ndpi_serializer *_serializer, if (ndpi_serializer_header_string(serializer, key, klen) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%d", value); } else { @@ -1248,13 +1263,13 @@ int ndpi_serialize_binary_int64(ndpi_serializer *_serializer, serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%lld", (long long int)value); @@ -1263,7 +1278,7 @@ int ndpi_serialize_binary_int64(ndpi_serializer *_serializer, if (ndpi_serializer_header_string(serializer, key, klen) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%lld", (long long int)value); } else { if ((value & 0xFFFFFFFF) == value) { @@ -1320,13 +1335,13 @@ int ndpi_serialize_binary_uint32(ndpi_serializer *_serializer, (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%u", value); @@ -1335,7 +1350,7 @@ int ndpi_serialize_binary_uint32(ndpi_serializer *_serializer, if (ndpi_serializer_header_string(serializer, key, klen) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%u", value); } else { @@ -1382,7 +1397,7 @@ int ndpi_serialize_string_uint32_format(ndpi_serializer *_serializer, } else { char buf[16]; - snprintf(buf, sizeof(buf), format, value); + ndpi_snappend(buf, sizeof(buf), format, value); return(ndpi_serialize_string_string(_serializer, key, buf)); } } @@ -1421,13 +1436,13 @@ int ndpi_serialize_binary_uint64(ndpi_serializer *_serializer, serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%llu", (unsigned long long)value); @@ -1436,7 +1451,7 @@ int ndpi_serialize_binary_uint64(ndpi_serializer *_serializer, if (ndpi_serializer_header_string(serializer, key, klen) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%llu", (unsigned long long)value); } else { @@ -1500,14 +1515,14 @@ int ndpi_serialize_binary_float(ndpi_serializer *_serializer, serializer->status.buffer.size_used++; } - serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, format, value); + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, format, value); ndpi_serialize_json_post(_serializer); } else if(serializer->fmt == ndpi_serialization_format_csv) { if (ndpi_serializer_header_string(serializer, key, klen) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, format, value); + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, format, value); } else { serializer->buffer.data[serializer->status.buffer.size_used++] = (ndpi_serialization_string << 4) | ndpi_serialization_float; @@ -1564,7 +1579,7 @@ static int ndpi_serialize_binary_raw(ndpi_serializer *_serializer, serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } @@ -1572,7 +1587,7 @@ static int ndpi_serialize_binary_raw(ndpi_serializer *_serializer, serializer->status.buffer.size_used += ndpi_json_string_escape(value, vlen, (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); else - serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, value, vlen); ndpi_serialize_json_post(_serializer); @@ -1580,7 +1595,7 @@ static int ndpi_serialize_binary_raw(ndpi_serializer *_serializer, if (ndpi_serializer_header_string(serializer, key, klen) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s", value); } else { @@ -1667,12 +1682,12 @@ int ndpi_serialize_string_boolean(ndpi_serializer *_serializer, serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ":"); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; } - serializer->status.buffer.size_used += snprintf((char *) + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s", value ? "true" : "false"); @@ -1681,7 +1696,7 @@ int ndpi_serialize_string_boolean(ndpi_serializer *_serializer, if (ndpi_serializer_header_string(serializer, key, strlen(key)) < 0) return(-1); ndpi_serialize_csv_pre(serializer); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, "%s", value ? "true" : "false"); } @@ -1715,7 +1730,7 @@ int ndpi_serialize_start_of_list(ndpi_serializer *_serializer, (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ": ["); + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ": ["); serializer->status.flags |= NDPI_SERIALIZER_STATUS_LIST | NDPI_SERIALIZER_STATUS_SOL; @@ -1767,7 +1782,7 @@ int ndpi_serialize_start_of_block_binary(ndpi_serializer *_serializer, serializer->status.buffer.size_used += ndpi_json_string_escape(key, klen, (char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; - serializer->status.buffer.size_used += snprintf((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ": {"); + serializer->status.buffer.size_used += ndpi_snappend((char *) &serializer->buffer.data[serializer->status.buffer.size_used], buff_diff, ": {"); buff_diff = serializer->buffer.size - serializer->status.buffer.size_used; ndpi_serialize_json_post(_serializer); |