MCPcopy
hub / github.com/cilium/ebpf / structOpsCopyMemberBytes

Function structOpsCopyMemberBytes

struct_ops.go:164–202  ·  view source on GitHub ↗

structOpsCopyMemberBytes copies the bytes of `m` into `km`.

(m, km btf.Member, data, kernVData []byte, size int)

Source from the content-addressed store, hash-verified

162
163// structOpsCopyMemberBytes copies the bytes of `m` into `km`.
164func structOpsCopyMemberBytes(m, km btf.Member, data, kernVData []byte, size int) error {
165 mLayout, err := newStructOpsMemberLayout(m)
166 if err != nil {
167 return fmt.Errorf("user member %s: %w", m.Name, err)
168 }
169
170 kLayout, err := newStructOpsMemberLayout(km)
171 if err != nil {
172 return fmt.Errorf("kernel member %s: %w", km.Name, err)
173 }
174
175 if mLayout.size != size {
176 return fmt.Errorf("member %q: unexpected validated size %d, got %d", m.Name, size, mLayout.size)
177 }
178 if kLayout.size != size {
179 return fmt.Errorf("member %q: unexpected validated size %d, got %d", km.Name, size, kLayout.size)
180 }
181
182 src, err := mLayout.bytes(data)
183 if err != nil {
184 return fmt.Errorf("member %q: userdata is too small", m.Name)
185 }
186
187 dst, err := kLayout.bytes(kernVData)
188 if err != nil {
189 return fmt.Errorf("member %q: value type is too small", km.Name)
190 }
191
192 switch mLayout.typ.(type) {
193 case *btf.Struct, *btf.Union:
194 if !structOpsIsMemZeroed(src) {
195 return fmt.Errorf("non-zero nested struct %s: %w", m.Name, ErrNotSupported)
196 }
197 return nil
198 }
199
200 copy(dst, src)
201 return nil
202}
203
204// structOpsCopyMember copies `m` into `km`.
205func structOpsCopyMember(m, km btf.Member, data []byte, kernVData []byte) error {

Callers 1

structOpsCopyMemberFunction · 0.85

Calls 3

newStructOpsMemberLayoutFunction · 0.85
structOpsIsMemZeroedFunction · 0.85
bytesMethod · 0.80

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…