diff options
author | Yong He <chenglang.hy@antfin.com> | 2019-06-28 22:20:57 +0800 |
---|---|---|
committer | Yong He <chenglang.hy@antfin.com> | 2019-06-28 22:20:57 +0800 |
commit | c61d7761b42392d6c28ab6932707e0d3236e0b74 (patch) | |
tree | e2f77ca266ed78b1c2ea5aeb35b68ff24e5cd56a | |
parent | b2907595e5e974d2b011ea011033aa06d796e090 (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.go | 1 |
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) { |