summaryrefslogtreecommitdiff
path: root/source3/smbd
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>1998-09-05 03:14:40 +0000
committerJeremy Allison <jra@samba.org>1998-09-05 03:14:40 +0000
commit98f524bde4801bd0b013a6bc79c5552ef62b59f8 (patch)
tree1c42d63977a2a82aa87228ecf1d57742ac8f6fb0 /source3/smbd
parent1546ccfd24a712973c82fcd2064d3c48381f1360 (diff)
downloadsamba-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)
Diffstat (limited to 'source3/smbd')
-rw-r--r--source3/smbd/close.c3
-rw-r--r--source3/smbd/files.c6
-rw-r--r--source3/smbd/negprot.c3
-rw-r--r--source3/smbd/open.c16
4 files changed, 13 insertions, 15 deletions
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;
}