Hello everybody,

On Wed, Aug 30, 2000 at 04:00:19PM +0300, Leonid Mamtchenkov wrote:
> Hello,
> 
>   In the archives of the lkml I have found a message from Peter Gervai
> ([EMAIL PROTECTED]) dated Tue Apr 25 2000 available here:
> http://boudicca.tux.org/hypermail/linux-kernel/2000week18/0317.html
> 
>   Unfortunately, I was not able to find any reply to that message.
> 
>   Currently, one of our servers experiences the same problem, with only
> difference of the kernel being 2.2.16 (openwall patch applied aswell).
> 
>   Is there any solutions to this problem yet/still available?

There is an inode leak in lockd, caused by a reference counting bug.
It will appear when you use DOS/Windows clients to access a knfsd+lockd
based NFS server, and it will crash the server sooner or later (a DOS
attack, literally ;).  The lockd bug is still alive in 2.4.0-test?,
so upgrading doesn't help either.

I'll attach my patch for 2.2.16.  It should apply to 2.4.0-test? too,
with one or two lines of fuzz maybe.

Ciao,
-- 
 Michael "Tired" Riepe <[EMAIL PROTECTED]>
 "All I wanna do is have a little fun before I die"
diff -rux CVS linux-2.2.16-plain/fs/lockd/svcshare.c linux-2.2.16/fs/lockd/svcshare.c
--- linux-2.2.16-plain/fs/lockd/svcshare.c      Mon Apr  7 20:35:30 1997
+++ linux-2.2.16/fs/lockd/svcshare.c    Fri Aug 11 19:04:26 2000
@@ -61,6 +61,20 @@
        return nlm_granted;
 }
 
+static inline void
+put_file(struct nlm_file *file, int mincount)
+{
+       /*
+        * XXX there may be race conditions here!
+        */
+       if (file->f_count > mincount)
+               file->f_count--;
+       else
+               printk(KERN_WARNING
+                       "lockd: f_count=%d when removing share\n",
+                       (int)file->f_count);
+}
+
 /*
  * Delete a share.
  */
@@ -75,6 +89,7 @@
                if (share->s_host == host && nlm_cmp_owner(share, oh)) {
                        *shpp = share->s_next;
                        kfree(share);
+                       put_file(file, 1);
                        return nlm_granted;
                }
        }
@@ -101,6 +116,7 @@
                        if (host == NULL || host == share->s_host) {
                                *shpp = share->s_next;
                                kfree(share);
+                               put_file(file, 0);
                                continue;
                        }
                }

Reply via email to