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

wusheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-rover.git


The following commit(s) were added to refs/heads/main by this push:
     new b5dadaf  fix NPE when Buffer.Slice (#173)
b5dadaf is described below

commit b5dadaf5eb28dfe7f991f7d13ec3c46a0865c1a5
Author: mrproliu <[email protected]>
AuthorDate: Thu Dec 26 21:55:19 2024 +0800

    fix NPE when Buffer.Slice (#173)
---
 pkg/tools/buffer/buffer.go | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)

diff --git a/pkg/tools/buffer/buffer.go b/pkg/tools/buffer/buffer.go
index 7a74fc8..368e1f6 100644
--- a/pkg/tools/buffer/buffer.go
+++ b/pkg/tools/buffer/buffer.go
@@ -256,40 +256,54 @@ func (r *Buffer) Clean() {
        r.endPosition = nil
 }
 
+// nolint
 func (r *Buffer) Slice(validated bool, start, end *Position) *Buffer {
        dataEvents := list.New()
        detailEvents := list.New()
        var firstDetailElement *list.Element
+       var lastBufferDataID = start.DataID()
        for nextElement := start.element; nextElement != end.element; 
nextElement = nextElement.Next() {
-               if nextElement == nil {
+               if nextElement == nil || nextElement.Value == nil {
                        break
                }
+               currentBuffer := nextElement.Value.(SocketDataBuffer)
                // found first matches detail event
                if detailEvents.Len() == 0 || firstDetailElement == nil {
                        for e := r.detailEvents.Front(); e != nil; e = e.Next() 
{
-                               if e.Value.(SocketDataDetail).DataID() >= 
nextElement.Value.(SocketDataBuffer).DataID() {
+                               if e.Value == nil {
+                                       continue
+                               }
+                               if e.Value.(SocketDataDetail).DataID() >= 
currentBuffer.DataID() {
                                        detailEvents.PushBack(e.Value)
                                        firstDetailElement = e
                                        break
                                }
                        }
                }
-               dataEvents.PushBack(nextElement.Value)
+               dataEvents.PushBack(currentBuffer)
+               lastBufferDataID = currentBuffer.DataID()
        }
        lastBuffer := end.element.Value.(SocketDataBuffer)
        dataEvents.PushBack(&SocketDataEventLimited{SocketDataBuffer: 
lastBuffer, Size: end.bufIndex})
 
        // if the first detail element been found, append the details until the 
last buffer data id
+       var lastBufferID = lastBufferDataID
+       if lastBuffer != nil {
+               lastBufferID = lastBuffer.DataID()
+       }
        if firstDetailElement == nil && r.detailEvents != nil {
                for e := r.detailEvents.Front(); e != nil; e = e.Next() {
-                       if e.Value.(SocketDataDetail).DataID() == 
lastBuffer.DataID() {
+                       if e.Value != nil && 
e.Value.(SocketDataDetail).DataID() == lastBufferID {
                                detailEvents.PushBack(e.Value)
                                break
                        }
                }
-       } else if firstDetailElement != nil && 
firstDetailElement.Value.(SocketDataDetail).DataID() != lastBuffer.DataID() {
+       } else if firstDetailElement != nil && 
firstDetailElement.Value.(SocketDataDetail).DataID() != lastBufferID {
                for tmp := firstDetailElement.Next(); tmp != nil; tmp = 
tmp.Next() {
-                       if tmp.Value.(SocketDataDetail).DataID() > 
lastBuffer.DataID() {
+                       if tmp.Value == nil {
+                               continue
+                       }
+                       if tmp.Value.(SocketDataDetail).DataID() > lastBufferID 
{
                                break
                        }
                        detailEvents.PushBack(tmp.Value)

Reply via email to