You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ke...@apache.org on 2020/07/01 15:25:39 UTC

[skywalking-python] branch defense/carrier-validation created (now 43a1c2c)

This is an automated email from the ASF dual-hosted git repository.

kezhenxu94 pushed a change to branch defense/carrier-validation
in repository https://gitbox.apache.org/repos/asf/skywalking-python.git.


      at 43a1c2c  [Core][Defect] Validate carrier before using it

This branch includes the following new commits:

     new 43a1c2c  [Core][Defect] Validate carrier before using it

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[skywalking-python] 01/01: [Core][Defect] Validate carrier before using it

Posted by ke...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kezhenxu94 pushed a commit to branch defense/carrier-validation
in repository https://gitbox.apache.org/repos/asf/skywalking-python.git

commit 43a1c2ce951e60c1d47557e25f354af90ce7e3bc
Author: kezhenxu94 <ke...@163.com>
AuthorDate: Wed Jul 1 23:25:25 2020 +0800

    [Core][Defect] Validate carrier before using it
---
 skywalking/trace/carrier/__init__.py | 14 +++++++++++++-
 skywalking/trace/context/__init__.py |  2 +-
 skywalking/trace/span/__init__.py    |  2 +-
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/skywalking/trace/carrier/__init__.py b/skywalking/trace/carrier/__init__.py
index 0b95861..0634b83 100644
--- a/skywalking/trace/carrier/__init__.py
+++ b/skywalking/trace/carrier/__init__.py
@@ -74,14 +74,26 @@ class Carrier(CarrierItem):
         if not val:
             return
         parts = val.split('-')
+        if len(parts) != 8:
+            return
         self.trace_id = b64decode(parts[1])
         self.segment_id = b64decode(parts[2])
-        self.span_id = int(parts[3])
+        self.span_id = int(parts[3]) if parts[3].isnumeric() else -1
         self.service = b64decode(parts[4])
         self.service_instance = b64decode(parts[5])
         self.endpoint = b64decode(parts[6])
         self.client_address = b64decode(parts[7])
 
+    @property
+    def is_valid(self):
+        # type: () -> bool
+        return len(self.trace_id) > 0 and \
+               len(self.segment_id) > 0 and \
+               len(self.service) > 0 and \
+               len(self.service_instance) > 0 and \
+               len(self.endpoint) > 0 and \
+               len(self.client_address) > 0
+
     def __iter__(self):
         self.__iter_index = 0
         return self
diff --git a/skywalking/trace/context/__init__.py b/skywalking/trace/context/__init__.py
index dce8d68..190121f 100644
--- a/skywalking/trace/context/__init__.py
+++ b/skywalking/trace/context/__init__.py
@@ -55,7 +55,7 @@ class SpanContext(object):
         )
         span.op = op
 
-        if carrier is not None:
+        if carrier is not None and carrier.is_valid:
             span.extract(carrier=carrier)
 
         return span
diff --git a/skywalking/trace/span/__init__.py b/skywalking/trace/span/__init__.py
index e448424..529edd9 100644
--- a/skywalking/trace/span/__init__.py
+++ b/skywalking/trace/span/__init__.py
@@ -165,7 +165,7 @@ class EntrySpan(StackedSpan):
     def extract(self, carrier: 'Carrier') -> 'Span':
         Span.extract(self, carrier)
 
-        if carrier is None:
+        if carrier is None or not carrier.is_valid:
             return self
 
         ref = SegmentRef(carrier=carrier)