From f80556d21c76b248be091ea8b03107761275b46b Mon Sep 17 00:00:00 2001 From: "M. Mert Yildiran" Date: Thu, 2 Jun 2022 00:28:42 +0300 Subject: [PATCH] Bring back `len` and `cap` fields --- tap/tlstapper/bpf/golang_uprobes.c | 6 ++++++ tap/tlstapper/tls_poller.go | 8 ++++---- tap/tlstapper/tlstapper_bpfeb.go | 4 +++- tap/tlstapper/tlstapper_bpfeb.o | Bin 130352 -> 130744 bytes tap/tlstapper/tlstapper_bpfel.go | 4 +++- tap/tlstapper/tlstapper_bpfel.o | Bin 130352 -> 130744 bytes 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/tap/tlstapper/bpf/golang_uprobes.c b/tap/tlstapper/bpf/golang_uprobes.c index c095a3662..7e189f861 100644 --- a/tap/tlstapper/bpf/golang_uprobes.c +++ b/tap/tlstapper/bpf/golang_uprobes.c @@ -18,6 +18,8 @@ struct golang_read_write { __u32 conn_addr; bool is_request; bool is_gzip_chunk; + __u32 len; + __u32 cap; __u8 data[BUFFER_SIZE_READ_WRITE]; }; @@ -56,6 +58,8 @@ static __always_inline int golang_crypto_tls_write_uprobe(struct pt_regs *ctx) { b->conn_addr = ctx->rsi; // go.itab.*net.TCPConn,net.Conn address b->is_request = true; b->is_gzip_chunk = false; + b->len = ctx->rcx; + b->cap = ctx->rdi; struct socket x = { .pid = s->pid, @@ -103,6 +107,8 @@ static __always_inline int golang_crypto_tls_read_uprobe(struct pt_regs *ctx) { b->conn_addr = ctx->rsi; // go.itab.*net.TCPConn,net.Conn address b->is_request = false; b->is_gzip_chunk = false; + b->len = ctx->rcx; + b->cap = ctx->rcx; // no cap info void* stack_addr = (void*)ctx->rsp; __u64 data_p; diff --git a/tap/tlstapper/tls_poller.go b/tap/tlstapper/tls_poller.go index 281621a19..6ecdd7e85 100644 --- a/tap/tlstapper/tls_poller.go +++ b/tap/tlstapper/tls_poller.go @@ -185,12 +185,12 @@ func (p *tlsPoller) pollGolangReadWrite(rd *ringbuf.Reader, emitter api.Emitter, go dissect(p.extension, connection.ClientReader, options) go dissect(p.extension, connection.ServerReader, options) - request := make([]byte, len(b.Data[:])) - copy(request, b.Data[:]) + request := make([]byte, len(b.Data[:b.Len])) + copy(request, b.Data[:b.Len]) connection.ClientReader.send(request) } else { - response := make([]byte, len(b.Data[:])) - copy(response, b.Data[:]) + response := make([]byte, len(b.Data[:b.Len])) + copy(response, b.Data[:b.Len]) connection.ServerReader.send(response) } } diff --git a/tap/tlstapper/tlstapper_bpfeb.go b/tap/tlstapper/tlstapper_bpfeb.go index 27adb327f..c12fd05fd 100644 --- a/tap/tlstapper/tlstapper_bpfeb.go +++ b/tap/tlstapper/tlstapper_bpfeb.go @@ -19,8 +19,10 @@ type tlsTapperGolangReadWrite struct { ConnAddr uint32 IsRequest bool IsGzipChunk bool - Data [524288]uint8 _ [2]byte + Len uint32 + Cap uint32 + Data [524288]uint8 } type tlsTapperTlsChunk struct { diff --git a/tap/tlstapper/tlstapper_bpfeb.o b/tap/tlstapper/tlstapper_bpfeb.o index a2e760e26d000880f72fe58312a847d6697c8ed0..17a9b9e909c078139b0c7889dd0b642c08cda315 100644 GIT binary patch delta 8033 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 delta 7210 zcmb7|e{faB701usd!tDJ^MF7eBqR?>NKzC6gb+-S7Y!N^Y^=W?g=$dJM$3=*tCP+k zi3pfhY=e(>Upt8DKpjSYg@N{^mP$G@P8_ku7VWb@Nz^}5)S5adQG)h+cK5=4cLt~3 znfG=-_ndon&)IYKZPIz+%8oCuY@2F*GH{?|>3VTTbo2V`34wSCskTvfPabL1gE5V? zIC^ybqJt$*o)hA#Xwk-{X*ooqJ>EienOEz~t96taJ-TsLbmXR+#8n3)n_wUit!n!j6;+Ht3^cF z7tqhqGvthkial8c#h?m&x`=YFMGvV!moqaJ-)PriJSRGL&oogRU9~4`TzMcs3HBFww+y z(dYK&OlEq&{i-_{y{(mMOxi8ns|1dgzUsl1e|7qq``|_rT%*?kT#E+QS zGBG=caTG5D&zteZ;}FKJ(Le3W`d-vLX~C1{t^%Oljt|}{dcnt?K7P%|eLnsq+P5#S zDvXxtkfE<+OE>*2XXxz!%7 z!p@BM@J&c7-XLs-Y74P@`CL2hgIkFvPd|9zM z7(PwZG!`7v9KiEdSvOVWRkd=))S1Wk6SYHyZLygEGgnrVhYP{jhl_IA#b$P*P`H%U z<1<9N(!f22zb4uP7VVlxBBEW)Mm}-}(NP(iCh~4O&MDn*)LtP$Z1|oG>`>JiP1#f48m`#+^{PT8%7Qd!HQMmlh
  • 2VqxnGr9t6z`%rNK_Y0eCgsK#0Cgf)v#Nz@|e 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 N>5GmF|5tqGe*qRwlF|SG delta 7569 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 bk$aVw8=+6d@~e=)@~JIfFiO05g-`fDz8@^y