Stat opens can have fsp->fd == -1 and will have a share entry. Ensure
authorJeremy Allison <jra@samba.org>
Thu, 22 May 2003 20:31:35 +0000 (20:31 +0000)
committerJeremy Allison <jra@samba.org>
Thu, 22 May 2003 20:31:35 +0000 (20:31 +0000)
that file_find_dif will find them. Fixes a core dump in smbd/open.c.
Jeremy.
(This used to be commit 0e2165630d2ce31076fef6d7098e45c8fd327e23)

source3/smbd/files.c

index 4d1409feac20e255dd1b77e6133ed5f4543b9515..f0fd6b7a736e781cee587e6b3d2e1f4f8f1dcd72 100644 (file)
@@ -231,13 +231,21 @@ files_struct *file_find_dif(SMB_DEV_T dev, SMB_INO_T inode, unsigned long file_i
        files_struct *fsp;
 
        for (fsp=Files;fsp;fsp=fsp->next,count++) {
-               if (fsp->fd != -1 &&
-                   fsp->dev == dev && 
+               /* We can have a fsp->fd == -1 here as it could be a stat open. */
+               if (fsp->dev == dev && 
                    fsp->inode == inode &&
                    fsp->file_id == file_id ) {
                        if (count > 10) {
                                DLIST_PROMOTE(Files, fsp);
                        }
+                       /* Paranoia check. */
+                       if (fsp->fd == -1 && fsp->oplock_type != NO_OPLOCK) {
+                               DEBUG(0,("file_find_dif: file %s dev = %x, inode = %.0f, file_id = %u \
+oplock_type = %u is a stat open with oplock type !\n", fsp->fsp_name, (unsigned int)fsp->dev,
+                                               (double)fsp->inode, (unsigned int)fsp->file_id,
+                                               (unsigned int)fsp->oplock_type ));
+                               smb_panic("file_find_dif\n");
+                       }
                        return fsp;
                }
        }