Skip to content

Commit f236cbc

Browse files
leonardo-albertovichedsiper
authored andcommitted
decode_opentelemetry: fixed assorted bugs
Missing result checks with proper handling added Proper handling of the offset out argument added Proper error type constants added Signed-off-by: Leonardo Alminana <[email protected]>
1 parent 4dc8b39 commit f236cbc

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

include/ctraces/ctr_decode_opentelemetry.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@
2020
#ifndef CTR_DECODE_OPENTELEMETRY_H
2121
#define CTR_DECODE_OPENTELEMETRY_H
2222

23+
#define CTR_DECODE_OPENTELEMETRY_SUCCESS 0
24+
#define CTR_DECODE_OPENTELEMETRY_INSUFFICIENT_DATA -1
25+
#define CTR_DECODE_OPENTELEMETRY_INVALID_ARGUMENT -2
26+
#define CTR_DECODE_OPENTELEMETRY_CORRUPTED_DATA -3
27+
#define CTR_DECODE_OPENTELEMETRY_INVALID_PAYLOAD -4
28+
#define CTR_DECODE_OPENTELEMETRY_ALLOCATION_ERROR -5
29+
30+
2331
typedef enum {
2432
CTR_OPENTELEMETRY_TYPE_ATTRIBUTE = 0,
2533
CTR_OPENTELEMETRY_TYPE_ARRAY = 1,

src/ctr_decode_opentelemetry.c

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -525,11 +525,15 @@ int ctr_decode_opentelemetry_create(struct ctrace **out_ctr,
525525
Opentelemetry__Proto__Trace__V1__ScopeSpans *otel_scope_span;
526526
Opentelemetry__Proto__Trace__V1__Span *otel_span;
527527

528+
if (*offset >= in_size) {
529+
return CTR_DECODE_OPENTELEMETRY_INSUFFICIENT_DATA;
530+
}
531+
528532
service_request = opentelemetry__proto__collector__trace__v1__export_trace_service_request__unpack(NULL,
529533
in_size - *offset,
530534
(unsigned char *) &in_buf[*offset]);
531535
if (service_request == NULL) {
532-
return -1;
536+
return CTR_DECODE_OPENTELEMETRY_CORRUPTED_DATA;
533537
}
534538

535539
ctr = ctr_create(NULL);
@@ -539,7 +543,7 @@ int ctr_decode_opentelemetry_create(struct ctrace **out_ctr,
539543
if (otel_resource_span == NULL) {
540544
opentelemetry__proto__collector__trace__v1__export_trace_service_request__free_unpacked(service_request, NULL);
541545
ctr_destroy(ctr);
542-
return -1;
546+
return CTR_DECODE_OPENTELEMETRY_INVALID_PAYLOAD;
543547
}
544548

545549
/* resource span */
@@ -554,12 +558,23 @@ int ctr_decode_opentelemetry_create(struct ctrace **out_ctr,
554558

555559
for (scope_span_index = 0; scope_span_index < otel_resource_span->n_scope_spans; scope_span_index++) {
556560
otel_scope_span = otel_resource_span->scope_spans[scope_span_index];
561+
557562
if (otel_scope_span == NULL) {
558563
opentelemetry__proto__collector__trace__v1__export_trace_service_request__free_unpacked(service_request, NULL);
559-
return -1;
564+
ctr_destroy(ctr);
565+
566+
return CTR_DECODE_OPENTELEMETRY_INVALID_PAYLOAD;
560567
}
561568

562569
scope_span = ctr_scope_span_create(resource_span);
570+
571+
if (scope_span == NULL) {
572+
opentelemetry__proto__collector__trace__v1__export_trace_service_request__free_unpacked(service_request, NULL);
573+
ctr_destroy(ctr);
574+
575+
return CTR_DECODE_OPENTELEMETRY_ALLOCATION_ERROR;
576+
}
577+
563578
ctr_scope_span_set_schema_url(scope_span, otel_scope_span->schema_url);
564579

565580
if (otel_scope_span->scope != NULL) {
@@ -568,13 +583,23 @@ int ctr_decode_opentelemetry_create(struct ctrace **out_ctr,
568583

569584
for (span_index = 0; span_index < otel_scope_span->n_spans; span_index++) {
570585
otel_span = otel_scope_span->spans[span_index];
586+
571587
if (otel_span == NULL) {
572588
opentelemetry__proto__collector__trace__v1__export_trace_service_request__free_unpacked(service_request, NULL);
573-
return -1;
589+
ctr_destroy(ctr);
590+
591+
return CTR_DECODE_OPENTELEMETRY_INVALID_PAYLOAD;
574592
}
575593

576594
span = ctr_span_create(ctr, scope_span, otel_span->name, NULL);
577595

596+
if (span == NULL) {
597+
opentelemetry__proto__collector__trace__v1__export_trace_service_request__free_unpacked(service_request, NULL);
598+
ctr_destroy(ctr);
599+
600+
return CTR_DECODE_OPENTELEMETRY_ALLOCATION_ERROR;
601+
}
602+
578603
/* copy data from otel span to ctraces span representation */
579604
ctr_span_set_trace_id(span, otel_span->trace_id.data, otel_span->trace_id.len);
580605
ctr_span_set_span_id(span, otel_span->span_id.data, otel_span->span_id.len);
@@ -587,6 +612,7 @@ int ctr_decode_opentelemetry_create(struct ctrace **out_ctr,
587612
ctr_span_kind_set(span, otel_span->kind);
588613
ctr_span_start_ts(ctr, span, otel_span->start_time_unix_nano);
589614
ctr_span_end_ts(ctr, span, otel_span->end_time_unix_nano);
615+
590616
if (otel_span->status) {
591617
ctr_span_set_status(span, otel_span->status->code, otel_span->status->message);
592618
}
@@ -603,10 +629,13 @@ int ctr_decode_opentelemetry_create(struct ctrace **out_ctr,
603629
}
604630
}
605631

632+
*offset += opentelemetry__proto__collector__trace__v1__export_trace_service_request__get_packed_size(service_request);
633+
606634
opentelemetry__proto__collector__trace__v1__export_trace_service_request__free_unpacked(service_request, NULL);
635+
607636
*out_ctr = ctr;
608637

609-
return 0;
638+
return CTR_DECODE_OPENTELEMETRY_SUCCESS;
610639
}
611640

612641
void ctr_decode_opentelemetry_destroy(struct ctrace *ctr)

0 commit comments

Comments
 (0)