diff options
author | Jeremy Allison <jra@samba.org> | 1998-09-05 03:14:40 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 1998-09-05 03:14:40 +0000 |
commit | 98f524bde4801bd0b013a6bc79c5552ef62b59f8 (patch) | |
tree | 1c42d63977a2a82aa87228ecf1d57742ac8f6fb0 | |
parent | 1546ccfd24a712973c82fcd2064d3c48381f1360 (diff) | |
download | samba-98f524bde4801bd0b013a6bc79c5552ef62b59f8.tar.gz samba-98f524bde4801bd0b013a6bc79c5552ef62b59f8.tar.bz2 samba-98f524bde4801bd0b013a6bc79c5552ef62b59f8.zip |
Bugfix for leak in reference counted file struct.
Added "nt smb support" parameter to allow NT SMB's to be turned off.
Jeremy.
(This used to be commit 63f65f5027d5022153fa2757b49c56829db1725b)
-rw-r--r-- | source3/include/proto.h | 2 | ||||
-rw-r--r-- | source3/param/loadparm.c | 4 | ||||
-rw-r--r-- | source3/smbd/close.c | 3 | ||||
-rw-r--r-- | source3/smbd/files.c | 6 | ||||
-rw-r--r-- | source3/smbd/negprot.c | 3 | ||||
-rw-r--r-- | source3/smbd/open.c | 16 |
6 files changed, 19 insertions, 15 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index 7ef9cbb677..d5cfb28166 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -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); diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 44db306d1b..9bf3dce6fb 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -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) diff --git a/source3/smbd/close.c b/source3/smbd/close.c index 42b16bc7ac..e9606cdfbe 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -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); diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 163e4f0cf2..0b72bcf0fa 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -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); diff --git a/source3/smbd/negprot.c b/source3/smbd/negprot.c index 8e996cac21..b1e8a65c94 100644 --- a/source3/smbd/negprot.c +++ b/source3/smbd/negprot.c @@ -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... diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 45d919187f..a72469f2b2 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -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; } |