Fixed crash bug which was assuming that fd_ptr was always non-null
authorJeremy Allison <jra@samba.org>
Wed, 18 Nov 1998 19:06:51 +0000 (19:06 +0000)
committerJeremy Allison <jra@samba.org>
Wed, 18 Nov 1998 19:06:51 +0000 (19:06 +0000)
(which is not the case with open directories).
Jeremy.
(This used to be commit c154b1601f5891d664fc538ec8874fa8ef2061e6)

source3/smbd/files.c
source3/smbd/oplock.c
source3/smbd/trans2.c

index e58c3834a00f02c3178aeac9574cfc7b9fa80c2d..3a41c837669dea4754c3297a060b5b588e50a26a 100644 (file)
@@ -263,6 +263,7 @@ files_struct *file_find_dit(SMB_DEV_T dev, SMB_INO_T inode, struct timeval *tval
 
        for (fsp=Files;fsp;fsp=fsp->next,count++) {
                if (fsp->open && 
+                       fsp->fd_ptr != NULL &&
                    fsp->fd_ptr->dev == dev && 
                    fsp->fd_ptr->inode == inode &&
                    (tval ? (fsp->open_time.tv_sec == tval->tv_sec) : True ) &&
@@ -287,6 +288,7 @@ files_struct *file_find_di_first(SMB_DEV_T dev, SMB_INO_T inode)
 
     for (fsp=Files;fsp;fsp=fsp->next) {
         if (fsp->open &&
+                       fsp->fd_ptr != NULL &&
             fsp->fd_ptr->dev == dev &&
             fsp->fd_ptr->inode == inode )
             return fsp;
@@ -305,6 +307,7 @@ files_struct *file_find_di_next(files_struct *start_fsp)
 
     for (fsp = start_fsp->next;fsp;fsp=fsp->next) {
         if (fsp->open &&
+                       fsp->fd_ptr != NULL &&
             fsp->fd_ptr->dev == start_fsp->fd_ptr->dev &&
             fsp->fd_ptr->inode == start_fsp->fd_ptr->inode )
             return fsp;
@@ -337,7 +340,7 @@ void file_sync_all(connection_struct *conn)
 
        for (fsp=Files;fsp;fsp=next) {
                next=fsp->next;
-               if (fsp->open && conn == fsp->conn) {
+               if (fsp->open && (conn == fsp->conn) && (fsp->fd_ptr != NULL)) {
                        sync_file(conn,fsp);
                }
        }
@@ -371,7 +374,7 @@ void file_free(files_struct *fsp)
 
        string_free(&fsp->fsp_name);
 
-       if (fsp->fd_ptr && fsp->fd_ptr->ref_count == 0) {
+       if ((fsp->fd_ptr != NULL) && fsp->fd_ptr->ref_count == 0) {
                fd_ptr_free(fsp->fd_ptr);
        }
 
index 1d38b362ec042308defd14a2fc933f41f8fe8aa7..96afb127aa538e3cb6abe5b254d8e6abd1ff820f 100644 (file)
@@ -1008,7 +1008,7 @@ BOOL attempt_close_oplocked_file(files_struct *fsp)
 
   DEBUG(5,("attempt_close_oplocked_file: checking file %s.\n", fsp->fsp_name));
 
-  if (fsp->open && fsp->granted_oplock && !fsp->sent_oplock_break) {
+  if (fsp->open && fsp->granted_oplock && !fsp->sent_oplock_break && (fsp->fd_ptr != NULL)) {
 
     /* Try and break the oplock. */
     file_fd_struct *fd_ptr = fsp->fd_ptr;
index 81ba511c77d32b91d738c83518c19505a1f7b6c6..db2be094b198c34f2161419c730db46db3da5515 100644 (file)
@@ -1756,7 +1756,7 @@ file %s as a share exists that was not opened with FILE_DELETE access.\n",
                                     (iterate_fsp->share_mode | DELETE_ON_CLOSE_FLAG) :
                                     (iterate_fsp->share_mode & ~DELETE_ON_CLOSE_FLAG) );
 
-              DEBUG(10,("call_trans2setfilepathinfo: Changing share mode for fnum %d, file %s\
+              DEBUG(10,("call_trans2setfilepathinfo: Changing share mode for fnum %d, file %s \
 dev = %x, inode = %.0f from %x to %x\n", 
                     iterate_fsp->fnum, iterate_fsp->fsp_name, (unsigned int)dev, 
                     (double)inode, iterate_fsp->share_mode, new_share_mode ));
@@ -1771,9 +1771,12 @@ dev = %x, inode = %.0f\n", iterate_fsp->fnum, (unsigned int)dev, (double)inode))
              * counted struct. Delete when the last reference
              * goes away.
              */
-            fsp->fd_ptr->delete_on_close = delete_on_close;
+           fsp->fd_ptr->delete_on_close = delete_on_close;
 
-            unlock_share_entry(fsp->conn, dev, inode, token);
+           unlock_share_entry(fsp->conn, dev, inode, token);
+
+           DEBUG(10, ("call_trans2setfilepathinfo: %s delete on close flag for fnum = %d, file %s\n",
+                 delete_on_close ? "Added" : "Removed", fsp->fnum, fsp->fsp_name ));
 
           } /* end if(delete_on_close && !GET_DELETE_ON_CLOSE_FLAG(fsp->share_mode)) */
         } /* end if lp_share_modes() */