Hopefully last part of the fix for bug 6651 - smbd SIGSEGV when breaking oplocks...
authorJeremy Allison <jra@samba.org>
Thu, 3 Sep 2009 14:40:48 +0000 (07:40 -0700)
committerKarolin Seeger <kseeger@samba.org>
Wed, 9 Sep 2009 10:27:18 +0000 (12:27 +0200)
commit95cc5af5fd6150f3c54cd344b66393dbc186c2df
tree8bb08b798c496c87d90d11aa1f4b3f053a474e01
parent6b9d518b9f1244c99fbaa2812886d02635caff14
Hopefully last part of the fix for bug 6651 - smbd SIGSEGV when breaking oplocks. This one is subtle. There is a race condition where a signal can be queued for oplock break, and then the file can be closed by the client before the signal can be processed. Currently if this occurs we panic (we can't match an incoming signal fd with a fsp pointer). Simply log the error (at debug level 10 right now, might be too much) and then return without processing the break request. It looks like there is another race condition with this fix, but here's why it won't happen. If the signal was pending (caused by a kernel oplock break from a local file open), and the client closed the file and then re-opened another file which happened to use the same file descriptor as the file just closed, then theoretically the oplock break requests could be processed on the wrong fd. Here's why this should be very rare.. Processing a pending signal always take precedence over an incoming network request, so as long as the client close request is non-chained then the break signal should always be harmlessly processed *before* the open can be called. If the open is chained onto the close, and the fd on the new open is the same as the old closed fd, then it's possible this race will occur. However, all that will happen is that we'll lose the oplock on this file. A shame, but not a fatal event. Jeremy. (cherry picked from commit bdc7bdb0d3e02d04477906dbda8995bc5789ce22)
source3/smbd/oplock_linux.c