summaryrefslogtreecommitdiffhomepage
path: root/pkg/tcpip/transport
diff options
context:
space:
mode:
authorZhaozhong Ni <nzz@google.com>2018-12-04 13:13:13 -0800
committerShentubot <shentubot@google.com>2018-12-04 13:14:24 -0800
commitad8f293e1af99f3c04d1020bb51b46c0dba60e45 (patch)
tree7272b7ef2f7f083c60b93879e329b402fb24388a /pkg/tcpip/transport
parent54dd0d0dc5ee452890628c537e6ebd1ac8c9d699 (diff)
sentry: save copy of tcp segment's delivered views to avoid in-struct pointers.
PiperOrigin-RevId: 224033238 Change-Id: Ie5b1854b29340843b02c123766d290a8738d7631
Diffstat (limited to 'pkg/tcpip/transport')
-rw-r--r--pkg/tcpip/transport/tcp/segment.go2
-rw-r--r--pkg/tcpip/transport/tcp/segment_state.go11
2 files changed, 11 insertions, 2 deletions
diff --git a/pkg/tcpip/transport/tcp/segment.go b/pkg/tcpip/transport/tcp/segment.go
index fc87a05fd..87c6d7d20 100644
--- a/pkg/tcpip/transport/tcp/segment.go
+++ b/pkg/tcpip/transport/tcp/segment.go
@@ -46,7 +46,7 @@ type segment struct {
data buffer.VectorisedView `state:".(buffer.VectorisedView)"`
// views is used as buffer for data when its length is large
// enough to store a VectorisedView.
- views [8]buffer.View
+ views [8]buffer.View `state:"nosave"`
// viewToDeliver keeps track of the next View that should be
// delivered by the Read endpoint.
viewToDeliver int
diff --git a/pkg/tcpip/transport/tcp/segment_state.go b/pkg/tcpip/transport/tcp/segment_state.go
index 46b6d85a6..d4bd6cf95 100644
--- a/pkg/tcpip/transport/tcp/segment_state.go
+++ b/pkg/tcpip/transport/tcp/segment_state.go
@@ -22,7 +22,16 @@ import (
func (s *segment) saveData() buffer.VectorisedView {
// We cannot save s.data directly as s.data.views may alias to s.views,
// which is not allowed by state framework (in-struct pointer).
- return s.data.Clone(nil)
+ v := make([]buffer.View, len(s.data.Views()))
+ // For views already delivered, we cannot save them directly as they may
+ // have already been sliced and saved elsewhere (e.g., readViews).
+ for i := 0; i < s.viewToDeliver; i++ {
+ v[i] = append([]byte(nil), s.data.Views()[i]...)
+ }
+ for i := s.viewToDeliver; i < len(v); i++ {
+ v[i] = s.data.Views()[i]
+ }
+ return buffer.NewVectorisedView(s.data.Size(), v)
}
// loadData is invoked by stateify.