Memleak fix for cache code.
authorJeremy Allison <jra@samba.org>
Mon, 2 Oct 2000 21:03:46 +0000 (21:03 +0000)
committerJeremy Allison <jra@samba.org>
Mon, 2 Oct 2000 21:03:46 +0000 (21:03 +0000)
Jeremy.

source/include/proto.h
source/smbd/close.c
source/smbd/fileio.c

index c79db02a4a972514b42c08387f5e70030aa1ca5f..f06a0a790fe8e1b8e2e15b7a9a37210c39d2dc54 100644 (file)
@@ -3368,7 +3368,6 @@ BOOL check_plaintext_password(char *user, char *old_passwd,
 /*The following definitions come from  smbd/close.c  */
 
 #if OLD_NTDOMAIN
-void close_filestruct(files_struct *fsp);
 int close_file(files_struct *fsp, BOOL normal_close);
 #endif
 
index 0b7b5f794e88b8822ac85402522a6111b0ef1529..f71b6b04f11b6f68aa4dc4236e287eaef0d26aa2 100644 (file)
@@ -68,11 +68,15 @@ static void check_magic(files_struct *fsp,connection_struct *conn)
   Common code to close a file or a directory.
 ****************************************************************************/
 
-void close_filestruct(files_struct *fsp)
+static int close_filestruct(files_struct *fsp)
 {   
        connection_struct *conn = fsp->conn;
+       int ret = 0;
     
-    flush_write_cache(fsp, CLOSE_FLUSH);
+       if(flush_write_cache(fsp, CLOSE_FLUSH) == -1)
+               ret = -1;
+
+       delete_write_cache(fsp);
 
        fsp->is_directory = False; 
        fsp->stat_open = False; 
@@ -82,6 +86,8 @@ void close_filestruct(files_struct *fsp)
                free((char *)fsp->wbmpx_ptr);
                fsp->wbmpx_ptr = NULL; 
        }  
+
+       return ret;
 }    
 
 /****************************************************************************
@@ -98,10 +104,17 @@ static int close_normal_file(files_struct *fsp, BOOL normal_close)
        BOOL delete_on_close = fsp->delete_on_close;
        connection_struct *conn = fsp->conn;
        int err = 0;
+       int err1 = 0;
 
        remove_pending_lock_requests_by_fid(fsp);
 
-       close_filestruct(fsp);
+       /*
+        * If we're flushing on a close we can get a write
+        * error here, we must remember this.
+        */
+
+       if (close_filestruct(fsp) == -1)
+               err1 = -1;
 
        if (normal_close && fsp->print_file) {
                print_fsp_end(fsp);
@@ -156,7 +169,10 @@ with error %s\n", fsp->fsp_name, strerror(errno) ));
 
        file_free(fsp);
 
-       return err;
+       if (err == -1 || err1 == -1)
+               return -1;
+       else
+               return 0;
 }
 
 /****************************************************************************
index 7fbf6e2a378efa90c74ea99f789a71ce5dd3fe92..3ebc46e86ba46d8c8a7c7d15a742488a081930d6 100644 (file)
@@ -186,7 +186,7 @@ ssize_t write_file(files_struct *fsp, char *data, SMB_OFF_T pos, size_t n)
        * the write cache.
        */
 
-      if ((fsp->oplock_type == EXCLUSIVE_OPLOCK) && !wcp) {
+      if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && !wcp) {
         setup_write_cache(fsp, st.st_size);
         wcp = fsp->wcp;
       } 
@@ -569,6 +569,9 @@ void delete_write_cache(files_struct *fsp)
   free(wcp);
 
   fsp->wcp = NULL;
+
+  DEBUG(10,("delete_write_cache: File %s deleted write cache\n", fsp->fsp_name ));
+
 }
 
 /****************************************************************************
@@ -604,6 +607,9 @@ static BOOL setup_write_cache(files_struct *fsp, SMB_OFF_T file_size)
   fsp->wcp = wcp;
   allocated_write_caches++;
 
+  DEBUG(10,("setup_write_cache: File %s allocated write cache size %u\n",
+               fsp->fsp_name, wcp->alloc_size ));
+
   return True;
 }