@@ -525,11 +525,15 @@ int ctr_decode_opentelemetry_create(struct ctrace **out_ctr,
525
525
Opentelemetry__Proto__Trace__V1__ScopeSpans * otel_scope_span ;
526
526
Opentelemetry__Proto__Trace__V1__Span * otel_span ;
527
527
528
+ if (* offset >= in_size ) {
529
+ return CTR_DECODE_OPENTELEMETRY_INSUFFICIENT_DATA ;
530
+ }
531
+
528
532
service_request = opentelemetry__proto__collector__trace__v1__export_trace_service_request__unpack (NULL ,
529
533
in_size - * offset ,
530
534
(unsigned char * ) & in_buf [* offset ]);
531
535
if (service_request == NULL ) {
532
- return -1 ;
536
+ return CTR_DECODE_OPENTELEMETRY_CORRUPTED_DATA ;
533
537
}
534
538
535
539
ctr = ctr_create (NULL );
@@ -539,7 +543,7 @@ int ctr_decode_opentelemetry_create(struct ctrace **out_ctr,
539
543
if (otel_resource_span == NULL ) {
540
544
opentelemetry__proto__collector__trace__v1__export_trace_service_request__free_unpacked (service_request , NULL );
541
545
ctr_destroy (ctr );
542
- return -1 ;
546
+ return CTR_DECODE_OPENTELEMETRY_INVALID_PAYLOAD ;
543
547
}
544
548
545
549
/* resource span */
@@ -554,12 +558,23 @@ int ctr_decode_opentelemetry_create(struct ctrace **out_ctr,
554
558
555
559
for (scope_span_index = 0 ; scope_span_index < otel_resource_span -> n_scope_spans ; scope_span_index ++ ) {
556
560
otel_scope_span = otel_resource_span -> scope_spans [scope_span_index ];
561
+
557
562
if (otel_scope_span == NULL ) {
558
563
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 ;
560
567
}
561
568
562
569
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
+
563
578
ctr_scope_span_set_schema_url (scope_span , otel_scope_span -> schema_url );
564
579
565
580
if (otel_scope_span -> scope != NULL ) {
@@ -568,13 +583,23 @@ int ctr_decode_opentelemetry_create(struct ctrace **out_ctr,
568
583
569
584
for (span_index = 0 ; span_index < otel_scope_span -> n_spans ; span_index ++ ) {
570
585
otel_span = otel_scope_span -> spans [span_index ];
586
+
571
587
if (otel_span == NULL ) {
572
588
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 ;
574
592
}
575
593
576
594
span = ctr_span_create (ctr , scope_span , otel_span -> name , NULL );
577
595
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
+
578
603
/* copy data from otel span to ctraces span representation */
579
604
ctr_span_set_trace_id (span , otel_span -> trace_id .data , otel_span -> trace_id .len );
580
605
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,
587
612
ctr_span_kind_set (span , otel_span -> kind );
588
613
ctr_span_start_ts (ctr , span , otel_span -> start_time_unix_nano );
589
614
ctr_span_end_ts (ctr , span , otel_span -> end_time_unix_nano );
615
+
590
616
if (otel_span -> status ) {
591
617
ctr_span_set_status (span , otel_span -> status -> code , otel_span -> status -> message );
592
618
}
@@ -603,10 +629,13 @@ int ctr_decode_opentelemetry_create(struct ctrace **out_ctr,
603
629
}
604
630
}
605
631
632
+ * offset += opentelemetry__proto__collector__trace__v1__export_trace_service_request__get_packed_size (service_request );
633
+
606
634
opentelemetry__proto__collector__trace__v1__export_trace_service_request__free_unpacked (service_request , NULL );
635
+
607
636
* out_ctr = ctr ;
608
637
609
- return 0 ;
638
+ return CTR_DECODE_OPENTELEMETRY_SUCCESS ;
610
639
}
611
640
612
641
void ctr_decode_opentelemetry_destroy (struct ctrace * ctr )
0 commit comments