OSDN Git Service

net: Fix recursive descent in __scm_destroy().
authorDavid Miller <davem@davemloft.net>
Sun, 9 Nov 2008 14:52:12 +0000 (15:52 +0100)
committerWilly Tarreau <w@1wt.eu>
Sun, 9 Nov 2008 15:22:14 +0000 (16:22 +0100)
commit57812a4772fa73f264b59ae31c5cc277630b1ff5
treef47caef9e378fc7a1d9d801f4844621eefa537e5
parentb4343b5e489aeb2287d1f41a9cd176c987146cbe
net: Fix recursive descent in __scm_destroy().

[backport of 2.6 commit f8d570a4745835f2238a33b537218a1bb03fc671]

__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>
Signed-off-by: Willy Tarreau <w@1wt.eu>
include/linux/sched.h
include/net/scm.h
net/core/scm.c