Bugfix for leak in reference counted file struct.
authorJeremy Allison <jra@samba.org>
Sat, 5 Sep 1998 03:14:40 +0000 (03:14 +0000)
committerJeremy Allison <jra@samba.org>
Sat, 5 Sep 1998 03:14:40 +0000 (03:14 +0000)
Added "nt smb support" parameter to allow NT SMB's to be turned off.
Jeremy.

source/include/proto.h
source/param/loadparm.c
source/smbd/close.c
source/smbd/files.c
source/smbd/negprot.c
source/smbd/open.c

index 7ef9cbb67758dc24d914a5f530b88808357167e9..d5cfb281664aa94172e25011e326980acd9b2342 100644 (file)
@@ -981,6 +981,7 @@ BOOL lp_net_wksta_user_logon(void);
 BOOL lp_unix_password_sync(void);
 BOOL lp_passwd_chat_debug(void);
 BOOL lp_ole_locking_compat(void);
+BOOL lp_nt_smb_support(void);
 int lp_os_level(void);
 int lp_max_ttl(void);
 int lp_max_wins_ttl(void);
@@ -2034,6 +2035,7 @@ void file_close_user(int vuid);
 files_struct *file_find_dit(SMB_DEV_T dev, SMB_INO_T inode, struct timeval *tval);
 files_struct *file_find_print(void);
 void file_sync_all(connection_struct *conn);
+void fd_ptr_free(file_fd_struct *fd_ptr);
 void file_free(files_struct *fsp);
 files_struct *file_fsp(char *buf, int where);
 void file_chain_reset(void);
index 44db306d1b2d7c4a8e03db232ccaa6fb6a93c23a..9bf3dce6fb611f212d642da8d22cbda56a5dd3be 100644 (file)
@@ -227,6 +227,7 @@ typedef struct
   BOOL bPasswdChatDebug;
   BOOL bOleLockingCompat;
   BOOL bTimestampLogs;
+  BOOL bNTSmbSupport;
 } global;
 
 static global Globals;
@@ -566,6 +567,7 @@ static struct parm_struct parm_table[] =
   {"read raw",         P_BOOL,    P_GLOBAL, &Globals.bReadRaw,          NULL,   NULL,  0},
   {"write raw",        P_BOOL,    P_GLOBAL, &Globals.bWriteRaw,         NULL,   NULL,  0},
   {"networkstation user login", P_BOOL,P_GLOBAL, &Globals.bNetWkstaUserLogon,NULL,   NULL,  0},
+  {"nt smb support",   P_BOOL,    P_GLOBAL, &Globals.bNTSmbSupport,    NULL,   NULL,  0},
   {"announce version", P_STRING,  P_GLOBAL, &Globals.szAnnounceVersion, NULL,   NULL,  0},
   {"announce as",      P_ENUM,    P_GLOBAL, &Globals.announce_as,       NULL,   enum_announce_as, 0},
   {"max mux",          P_INTEGER, P_GLOBAL, &Globals.max_mux,           NULL,   NULL,  0},
@@ -848,6 +850,7 @@ static void init_globals(void)
   Globals.bUnixPasswdSync = False;
   Globals.bPasswdChatDebug = False;
   Globals.bOleLockingCompat = True;
+  Globals.bNTSmbSupport = True; /* Do NT SMB's by default. */
 
 #ifdef WITH_LDAP
   /* default values for ldap */
@@ -1139,6 +1142,7 @@ FN_GLOBAL_BOOL(lp_net_wksta_user_logon,&Globals.bNetWkstaUserLogon)
 FN_GLOBAL_BOOL(lp_unix_password_sync,&Globals.bUnixPasswdSync)
 FN_GLOBAL_BOOL(lp_passwd_chat_debug,&Globals.bPasswdChatDebug)
 FN_GLOBAL_BOOL(lp_ole_locking_compat,&Globals.bOleLockingCompat)
+FN_GLOBAL_BOOL(lp_nt_smb_support,&Globals.bNTSmbSupport)
 
 FN_GLOBAL_INTEGER(lp_os_level,&Globals.os_level)
 FN_GLOBAL_INTEGER(lp_max_ttl,&Globals.max_ttl)
index 42b16bc7ac32fc58730efa21d7764c4cfc94151c..e9606cdfbeda8bde6a9a322c44fabdf2b0de34d7 100644 (file)
@@ -117,7 +117,8 @@ void close_file(files_struct *fsp, BOOL normal_close)
                del_share_mode(token, fsp);
        }
 
-       fd_attempt_close(fsp->fd_ptr);
+       if(fd_attempt_close(fsp->fd_ptr) == 0)
+               fsp->fd_ptr = NULL;
 
        if (lp_share_modes(SNUM(conn)))
                unlock_share_entry(conn, dev, inode, token);
index 163e4f0cf2f0e9097ecd591c48a577f598091ab7..0b72bcf0fa065eecb8a825aaf9caf985f645b14e 100644 (file)
@@ -133,8 +133,8 @@ file_fd_struct *fd_get_already_open(SMB_STRUCT_STAT *sbuf)
                                 (unsigned int)fd_ptr->dev, (double)fd_ptr->inode, 
                                 fd_ptr->ref_count));
 #else /* LARGE_SMB_INO_T */
-                       DEBUG(3,("Re-used file_fd_struct dev = %x, inode = %x, ref_count = %d\n",
-                                (unsigned int)fd_ptr->dev, fd_ptr->inode, 
+                       DEBUG(3,("Re-used file_fd_struct dev = %x, inode = %lx, ref_count = %d\n",
+                                (unsigned int)fd_ptr->dev, (unsigned long)fd_ptr->inode, 
                                 fd_ptr->ref_count));
 #endif /* LARGE_SMB_INO_T */
                        return fd_ptr;
@@ -315,7 +315,7 @@ void file_sync_all(connection_struct *conn)
 /****************************************************************************
 free up a fd_ptr
 ****************************************************************************/
-static void fd_ptr_free(file_fd_struct *fd_ptr)
+void fd_ptr_free(file_fd_struct *fd_ptr)
 {
        DLIST_REMOVE(FileFd, fd_ptr);
 
index 8e996cac2121f4a53dc3d61271c7a9f4f6a8fb32..b1e8a65c949f8cc9fb85fa498bb0187965d8e2f3 100644 (file)
@@ -156,7 +156,8 @@ reply for the nt protocol
 static int reply_nt1(char *outbuf)
 {
   /* dual names + lock_and_read + nt SMBs + remote API calls */
-  int capabilities = CAP_NT_FIND|CAP_LOCK_AND_READ|CAP_RPC_REMOTE_APIS |CAP_NT_SMBS;
+  int capabilities = CAP_NT_FIND|CAP_LOCK_AND_READ|CAP_RPC_REMOTE_APIS |
+                     lp_nt_smb_support() ? CAP_NT_SMBS : 0;
 
 /*
   other valid capabilities which we may support at some time...
index 45d919187fb4dc3026cb2eab57344578efb327b5..a72469f2b249b5a45cce2fa5b28e61084b8ad589 100644 (file)
@@ -170,13 +170,10 @@ int fd_attempt_close(file_fd_struct *fd_ptr)
         close(fd_ptr->fd_readonly);
       if(fd_ptr->fd_writeonly != -1)
         close(fd_ptr->fd_writeonly);
-      fd_ptr->fd = -1;
-      fd_ptr->fd_readonly = -1;
-      fd_ptr->fd_writeonly = -1;
-      fd_ptr->real_open_flags = -1;
-      fd_ptr->dev = (SMB_DEV_T)-1;
-      fd_ptr->inode = (SMB_INO_T)-1;
-      fd_ptr->uid_cache_count = 0;
+      /*
+       * Delete this fd_ptr.
+       */
+      fd_ptr_free(fd_ptr);
     } else {
       fd_remove_from_uid_cache(fd_ptr, (uid_t)current_user.uid);
     }
@@ -457,10 +454,9 @@ static void open_file(files_struct *fsp,connection_struct *conn,
     if (p) *p = 0;
     if (sys_disk_free(dname,&dum1,&dum2,&dum3) < 
        lp_minprintspace(SNUM(conn))) {
-      fd_attempt_close(fd_ptr);
-      fsp->fd_ptr = 0;
-      if(fd_ptr->ref_count == 0)
+      if(fd_attempt_close(fd_ptr) == 0)
         dos_unlink(fname);
+      fsp->fd_ptr = 0;
       errno = ENOSPC;
       return;
     }