From dd763d6d8e999b03164cef79a97c1350a556fef7 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 20 Jun 2012 15:50:00 -0700 Subject: Fix bug #8974 - Kernel oplocks are broken when uid(file) != uid(process). Based on a fix from "Etienne Dechamps " Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Thu Jun 21 21:53:58 CEST 2012 on sn-devel-104 --- source3/smbd/oplock_linux.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'source3/smbd/oplock_linux.c') diff --git a/source3/smbd/oplock_linux.c b/source3/smbd/oplock_linux.c index 190578e0cc..7fa9b7cb2c 100644 --- a/source3/smbd/oplock_linux.c +++ b/source3/smbd/oplock_linux.c @@ -76,9 +76,22 @@ int linux_setlease(int fd, int leasetype) { int ret; + /* First set the signal handler. */ + if (linux_set_lease_sighandler(fd) == -1) { + return -1; + } ret = fcntl(fd, F_SETLEASE, leasetype); if (ret == -1 && errno == EACCES) { set_effective_capability(LEASE_CAPABILITY); + /* + * Bug 8974 - work around Linux kernel bug + * https://bugzilla.kernel.org/show_bug.cgi?id=43336. + * "fcntl(F_SETLEASE) resets signal number when + * called multiple times" + */ + if (linux_set_lease_sighandler(fd) == -1) { + return -1; + } ret = fcntl(fd, F_SETLEASE, leasetype); } -- cgit