summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYong He <chenglang.hy@antfin.com>2019-06-28 22:20:57 +0800
committerYong He <chenglang.hy@antfin.com>2019-06-28 22:20:57 +0800
commitc61d7761b42392d6c28ab6932707e0d3236e0b74 (patch)
treee2f77ca266ed78b1c2ea5aeb35b68ff24e5cd56a
parentb2907595e5e974d2b011ea011033aa06d796e090 (diff)
Fix deadloop in proc subtask list
Readdir of /proc/x/task/ will get direntry entries from tasks of specified taskgroup. Now the tasks slice is unsorted, use sort.SearchInts search entry from the slice may cause infinity loops. The fix is sort the slice before search. This issue could be easily reproduced via following steps, revise Readdir in pkg/sentry/fs/proc/task.go, force set taskInts into test slice []int{1, 11, 7, 5, 10, 6, 8, 3, 9, 2, 4}, then run docker image and run ls /proc/1/task, the command will cause infinity loops.
-rw-r--r--pkg/sentry/fs/proc/task.go1
1 files changed, 1 insertions, 0 deletions
diff --git a/pkg/sentry/fs/proc/task.go b/pkg/sentry/fs/proc/task.go
index b2e36aeee..fc4c9ea4f 100644
--- a/pkg/sentry/fs/proc/task.go
+++ b/pkg/sentry/fs/proc/task.go
@@ -184,6 +184,7 @@ func (f *subtasksFile) Readdir(ctx context.Context, file *fs.File, ser fs.Dentry
taskInts = append(taskInts, int(tid))
}
+ sort.Sort(sort.IntSlice(taskInts))
// Find the task to start at.
idx := sort.SearchInts(taskInts, int(offset))
if idx == len(taskInts) {