From 98f524bde4801bd0b013a6bc79c5552ef62b59f8 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 5 Sep 1998 03:14:40 +0000 Subject: 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) --- source3/smbd/close.c | 3 ++- source3/smbd/files.c | 6 +++--- source3/smbd/negprot.c | 3 ++- source3/smbd/open.c | 16 ++++++---------- 4 files changed, 13 insertions(+), 15 deletions(-) (limited to 'source3/smbd') 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; } -- cgit