aboutsummaryrefslogtreecommitdiff
path: root/src/lib/ndpi_utils.c
diff options
context:
space:
mode:
authorIvan Nardi <nardi.ivan@gmail.com>2025-03-04 12:48:47 +0100
committerIvan Nardi <12729895+IvanNardi@users.noreply.github.com>2025-03-04 13:23:58 +0100
commit85fb7eb2e5e352acf772c8513bd1e48d54093d68 (patch)
tree7e8d6b671bd970f991f8131bced86a23ac4b2c26 /src/lib/ndpi_utils.c
parentf3dcae88dc2ac7cdd38f23d3ffa3a814f71ef925 (diff)
Flow risk infos are always exported "in order" (by flow risk id)
This way, the `ndpiReader` output doesn't change if we change the internal logic about the order we set/check the various flow risks. Note that the flow risk *list* is already printed by `ndpiReader` in order.
Diffstat (limited to 'src/lib/ndpi_utils.c')
-rw-r--r--src/lib/ndpi_utils.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/lib/ndpi_utils.c b/src/lib/ndpi_utils.c
index 69eaeb052..99fabbc96 100644
--- a/src/lib/ndpi_utils.c
+++ b/src/lib/ndpi_utils.c
@@ -3525,28 +3525,48 @@ int ndpi_snprintf(char * str, size_t size, char const * format, ...) {
/* ******************************************* */
+static int risk_infos_pair_cmp (const void *_a, const void *_b)
+{
+ struct ndpi_risk_information *a = (struct ndpi_risk_information *)_a;
+ struct ndpi_risk_information *b = (struct ndpi_risk_information *)_b;
+
+ return b->id - a->id;
+}
+
+/* ******************************************* */
+
char* ndpi_get_flow_risk_info(struct ndpi_flow_struct *flow,
char *out, u_int out_len,
u_int8_t use_json) {
u_int i, offset = 0;
+ struct ndpi_risk_information *ordered_risk_infos;
if((out == NULL)
|| (flow == NULL)
|| (flow->num_risk_infos == 0))
return(NULL);
+ /* Ordered list of flow risk infos */
+ ordered_risk_infos = ndpi_malloc(sizeof(flow->risk_infos));
+ if(!ordered_risk_infos)
+ return(NULL);
+ memcpy(ordered_risk_infos, flow->risk_infos, sizeof(flow->risk_infos));
+ qsort(ordered_risk_infos, flow->num_risk_infos, sizeof(struct ndpi_risk_information), risk_infos_pair_cmp);
+
if(use_json) {
ndpi_serializer serializer;
u_int32_t buffer_len;
char *buffer;
- if(ndpi_init_serializer(&serializer, ndpi_serialization_format_json) == -1)
+ if(ndpi_init_serializer(&serializer, ndpi_serialization_format_json) == -1) {
+ ndpi_free(ordered_risk_infos);
return(NULL);
+ }
for(i=0; i<flow->num_risk_infos; i++)
ndpi_serialize_uint32_string(&serializer,
- flow->risk_infos[i].id,
- flow->risk_infos[i].info);
+ ordered_risk_infos[i].id,
+ ordered_risk_infos[i].info);
buffer = ndpi_serializer_get_buffer(&serializer, &buffer_len);
@@ -3559,6 +3579,7 @@ char* ndpi_get_flow_risk_info(struct ndpi_flow_struct *flow,
ndpi_term_serializer(&serializer);
+ ndpi_free(ordered_risk_infos);
return(out);
} else {
out[0] = '\0', out_len--;
@@ -3566,7 +3587,7 @@ char* ndpi_get_flow_risk_info(struct ndpi_flow_struct *flow,
for(i=0; (i<flow->num_risk_infos) && (out_len > offset); i++) {
int rc = snprintf(&out[offset], out_len-offset, "%s%s",
(i == 0) ? "" : " / ",
- flow->risk_infos[i].info);
+ ordered_risk_infos[i].info);
if(rc <= 0)
break;
@@ -3578,6 +3599,7 @@ char* ndpi_get_flow_risk_info(struct ndpi_flow_struct *flow,
out[offset] = '\0';
+ ndpi_free(ordered_risk_infos);
return(out[0] == '\0' ? NULL : out);
}
}