diff options
author | David Miller <davem@davemloft.net> | 2008-11-06 03:37:40 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-11-06 16:51:50 -0500 |
commit | f8d570a4745835f2238a33b537218a1bb03fc671 (patch) | |
tree | 776c2909523c684f0954949a2947ff0a792ba457 /include/net | |
parent | 75fa67706cce5272bcfc51ed646f2da21f3bdb6e (diff) |
net: Fix recursive descent in __scm_destroy().
__scm_destroy() walks the list of file descriptors in the scm_fp_list
pointed to by the scm_cookie argument.
Those, in turn, can close sockets and invoke __scm_destroy() again.
There is nothing which limits how deeply this can occur.
The idea for how to fix this is from Linus. Basically, we do all of
the fput()s at the top level by collecting all of the scm_fp_list
objects hit by an fput(). Inside of the initial __scm_destroy() we
keep running the list until it is empty.
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/net')
-rw-r--r-- | include/net/scm.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/include/net/scm.h b/include/net/scm.h index 06df126103ca..33e9986beb86 100644 --- a/include/net/scm.h +++ b/include/net/scm.h | |||
@@ -14,8 +14,9 @@ | |||
14 | 14 | ||
15 | struct scm_fp_list | 15 | struct scm_fp_list |
16 | { | 16 | { |
17 | int count; | 17 | struct list_head list; |
18 | struct file *fp[SCM_MAX_FD]; | 18 | int count; |
19 | struct file *fp[SCM_MAX_FD]; | ||
19 | }; | 20 | }; |
20 | 21 | ||
21 | struct scm_cookie | 22 | struct scm_cookie |