Skip to content

Commit 449d2f5

Browse files
committed
Revert "Revert "[CWS] remove cgroup pointers" (#44065)"
This reverts commit 3cfd55b.
1 parent 8316336 commit 449d2f5

File tree

6 files changed

+43
-32
lines changed

6 files changed

+43
-32
lines changed

pkg/security/probe/field_handlers_ebpf.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ func (fh *EBPFFieldHandlers) ResolveCGroupID(ev *model.Event, cont *model.CGroup
578578
}
579579

580580
if cgroupContext, _, err := fh.resolvers.ResolveCGroupContext(cont.CGroupFile); err == nil {
581-
ev.ProcessContext.CGroup = *cgroupContext
581+
ev.ProcessContext.CGroup = cgroupContext
582582
}
583583
}
584584
}

pkg/security/probe/probe_ebpf.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -991,9 +991,17 @@ func (p *EBPFProbe) unmarshalProcessCacheEntry(ev *model.Event, data []byte) (in
991991
return n, err
992992
}
993993

994-
entry.Process.ContainerContext.ContainerID = ev.ProcessContext.Process.ContainerContext.ContainerID
994+
// Important : ev.ProcessContext is populated from the unmarshaling of the event.
995995

996-
entry.Process.CGroup.Merge(&ev.ProcessContext.Process.CGroup)
996+
if !ev.ProcessContext.Process.CGroup.CGroupFile.IsNull() {
997+
cgroupContext, _, err := p.Resolvers.ResolveCGroupContext(ev.ProcessContext.Process.CGroup.CGroupFile)
998+
if err != nil {
999+
return n, err
1000+
}
1001+
p.Resolvers.ProcessResolver.SetProcessCGroupContext(entry, cgroupContext)
1002+
} else {
1003+
seclog.Debugf("no cgroup file available for process %d", entry.Pid)
1004+
}
9971005

9981006
entry.Source = model.ProcessCacheEntryFromEvent
9991007

@@ -1044,14 +1052,14 @@ func (p *EBPFProbe) zeroEvent() *model.Event {
10441052
return p.event
10451053
}
10461054

1047-
func (p *EBPFProbe) resolveCGroup(pid uint32, cgroupPathKey model.PathKey, newEntryCb func(entry *model.ProcessCacheEntry, err error)) (*model.CGroupContext, error) {
1055+
func (p *EBPFProbe) resolveCGroup(pid uint32, cgroupPathKey model.PathKey, newEntryCb func(entry *model.ProcessCacheEntry, err error)) (model.CGroupContext, error) {
10481056
cgroupContext, _, err := p.Resolvers.ResolveCGroupContext(cgroupPathKey)
10491057
if err != nil {
1050-
return nil, fmt.Errorf("failed to resolve cgroup for pid %d: %w", pid, err)
1058+
return cgroupContext, fmt.Errorf("failed to resolve cgroup for pid %d: %w", pid, err)
10511059
}
10521060
updated := p.Resolvers.ProcessResolver.UpdateProcessCGroupContext(pid, cgroupContext, newEntryCb)
10531061
if !updated {
1054-
return nil, fmt.Errorf("failed to update cgroup for pid %d", pid)
1062+
return cgroupContext, fmt.Errorf("failed to update cgroup for pid %d", pid)
10551063
}
10561064

10571065
return cgroupContext, nil
@@ -1651,8 +1659,8 @@ func (p *EBPFProbe) handleEarlyReturnEvents(event *model.Event, offset int, data
16511659
if cgroupContext, err := p.resolveCGroup(event.CgroupTracing.Pid, event.CgroupTracing.CGroupContext.CGroupFile, newEntryCb); err != nil {
16521660
seclog.Debugf("Failed to resolve cgroup: %s", err.Error())
16531661
} else {
1654-
event.CgroupTracing.CGroupContext = *cgroupContext
1655-
event.ProcessContext.Process.CGroup = *cgroupContext
1662+
event.CgroupTracing.CGroupContext = cgroupContext
1663+
event.ProcessContext.Process.CGroup = cgroupContext
16561664
containerID := containerutils.FindContainerID(cgroupContext.CGroupID)
16571665
if containerID != "" {
16581666
event.CgroupTracing.ContainerContext.ContainerID = containerID

pkg/security/resolvers/cgroup/resolver.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -316,16 +316,14 @@ func (cr *Resolver) AddPID(process *model.ProcessCacheEntry) {
316316
}
317317

318318
// GetCGroupContext returns the cgroup context with the specified path key
319-
func (cr *Resolver) GetCGroupContext(cgroupPath model.PathKey) (*model.CGroupContext, bool) {
319+
func (cr *Resolver) GetCGroupContext(cgroupPath model.PathKey) (model.CGroupContext, bool) {
320320
cr.Lock()
321321
defer cr.Unlock()
322322

323323
if cgroupContext, found := cr.cgroups.Get(cgroupPath.Inode); found {
324-
// Return a copy to avoid race conditions when dereferencing the shared pointer
325-
cgroupContextCopy := *cgroupContext
326-
return &cgroupContextCopy, true
324+
return *cgroupContext, true
327325
}
328-
return nil, false
326+
return model.CGroupContext{}, false
329327
}
330328

331329
// Iterate iterates on all cached cgroups, callback may return 'true' to break iteration

pkg/security/resolvers/process/resolver_ebpf.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1557,18 +1557,9 @@ func (p *EBPFResolver) Walk(callback func(entry *model.ProcessCacheEntry)) {
15571557
}
15581558
}
15591559

1560-
// UpdateProcessCGroupContext updates the cgroup context and container ID of the process matching the provided PID
1561-
func (p *EBPFResolver) UpdateProcessCGroupContext(pid uint32, cgroupContext *model.CGroupContext, newEntryCb func(entry *model.ProcessCacheEntry, err error)) bool {
1562-
p.Lock()
1563-
defer p.Unlock()
1564-
1565-
pce := p.resolve(pid, pid, 0, false, newEntryCb)
1566-
if pce == nil {
1567-
return false
1568-
}
1569-
1570-
pce.Process.CGroup = *cgroupContext
1571-
pce.CGroup = *cgroupContext
1560+
// SetProcessCGroupContext sets the cgroup context and container ID of the process matching the provided PID
1561+
func (p *EBPFResolver) SetProcessCGroupContext(pce *model.ProcessCacheEntry, cgroupContext model.CGroupContext) {
1562+
pce.Process.CGroup = cgroupContext
15721563

15731564
if cgroupContext.CGroupID != "" {
15741565
pce.Process.ContainerContext.ContainerID = containerutils.FindContainerID(cgroupContext.CGroupID)
@@ -1578,6 +1569,19 @@ func (p *EBPFResolver) UpdateProcessCGroupContext(pid uint32, cgroupContext *mod
15781569
p.cgroupResolver.AddPID(pce)
15791570
}
15801571
}
1572+
}
1573+
1574+
// UpdateProcessCGroupContext updates the cgroup context and container ID of the process matching the provided PID
1575+
func (p *EBPFResolver) UpdateProcessCGroupContext(pid uint32, cgroupContext model.CGroupContext, newEntryCb func(entry *model.ProcessCacheEntry, err error)) bool {
1576+
p.Lock()
1577+
defer p.Unlock()
1578+
1579+
pce := p.resolve(pid, pid, 0, false, newEntryCb)
1580+
if pce == nil {
1581+
return false
1582+
}
1583+
1584+
p.SetProcessCGroupContext(pce, cgroupContext)
15811585

15821586
return true
15831587
}

pkg/security/resolvers/process/resolver_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -885,7 +885,7 @@ func TestCGroupContext(t *testing.T) {
885885
cgroupID = containerutils.CGroupID("/kubepods/besteffort/pod8bbdd97b-f902-4e16-8235-4ac18307cef6/" + string(containerID))
886886
)
887887

888-
resolver.UpdateProcessCGroupContext(node.ProcessCacheEntry.Pid, &model.CGroupContext{
888+
resolver.UpdateProcessCGroupContext(node.ProcessCacheEntry.Pid, model.CGroupContext{
889889
Releasable: &model.Releasable{},
890890
CGroupID: cgroupID,
891891
CGroupFile: model.PathKey{

pkg/security/resolvers/resolvers_ebpf.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -256,19 +256,20 @@ func (r *EBPFResolvers) Start(ctx context.Context) error {
256256
}
257257

258258
// ResolveCGroupContext resolves the cgroup context from a cgroup path key
259-
func (r *EBPFResolvers) ResolveCGroupContext(pathKey model.PathKey) (*model.CGroupContext, bool, error) {
260-
if cgroupContext, found := r.CGroupResolver.GetCGroupContext(pathKey); found {
259+
func (r *EBPFResolvers) ResolveCGroupContext(pathKey model.PathKey) (model.CGroupContext, bool, error) {
260+
cgroupContext, found := r.CGroupResolver.GetCGroupContext(pathKey)
261+
if found {
261262
return cgroupContext, true, nil
262263
}
263264

264-
cgroup, err := r.DentryResolver.Resolve(pathKey, false)
265+
cgroupPath, err := r.DentryResolver.Resolve(pathKey, false)
265266
if err != nil {
266-
return nil, false, fmt.Errorf("failed to resolve cgroup file %v: %w", pathKey, err)
267+
return cgroupContext, false, fmt.Errorf("failed to resolve cgroup file %v: %w", pathKey, err)
267268
}
268269

269-
cgroupContext := &model.CGroupContext{
270+
cgroupContext = model.CGroupContext{
270271
Releasable: &model.Releasable{},
271-
CGroupID: containerutils.CGroupID(cgroup),
272+
CGroupID: containerutils.CGroupID(cgroupPath),
272273
CGroupFile: pathKey,
273274
}
274275

0 commit comments

Comments
 (0)