aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorDavid Miller <davem@davemloft.net>2008-11-06 03:37:40 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2008-11-06 16:51:50 -0500
commitf8d570a4745835f2238a33b537218a1bb03fc671 (patch)
tree776c2909523c684f0954949a2947ff0a792ba457 /include
parent75fa67706cce5272bcfc51ed646f2da21f3bdb6e (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')
-rw-r--r--include/linux/sched.h2
-rw-r--r--include/net/scm.h5
2 files changed, 5 insertions, 2 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h
index b483f39a7112..295b7c756ca6 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1349,6 +1349,8 @@ struct task_struct {
1349 */ 1349 */
1350 unsigned long timer_slack_ns; 1350 unsigned long timer_slack_ns;
1351 unsigned long default_timer_slack_ns; 1351 unsigned long default_timer_slack_ns;
1352
1353 struct list_head *scm_work_list;
1352}; 1354};
1353 1355
1354/* 1356/*
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
15struct scm_fp_list 15struct 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
21struct scm_cookie 22struct scm_cookie