summaryrefslogtreecommitdiff
path: root/source3/smbd/reply.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>1997-10-03 20:36:06 +0000
committerJeremy Allison <jra@samba.org>1997-10-03 20:36:06 +0000
commit2f7b04061e61df7dcc1029b71fe12ca4dfca5f10 (patch)
tree332e217c0435dba1ace5bef198d69443c2e48e68 /source3/smbd/reply.c
parent2534e0688ba703423c9d18b3296b00c097aa351d (diff)
downloadsamba-2f7b04061e61df7dcc1029b71fe12ca4dfca5f10.tar.gz
samba-2f7b04061e61df7dcc1029b71fe12ca4dfca5f10.tar.bz2
samba-2f7b04061e61df7dcc1029b71fe12ca4dfca5f10.zip
locking.c: Fixed incorrect parameter count in debug statements. May explain
solaris crashes. reply.c: Added NT specific error code. Put oplock break code in correct place in reply_lockingX. server.c: Removed unneeded error mapping stuff. Fixed race condition in oplock code. trans2.c: Added NT specific error code. util.c: Added paranoia check in interpret_addr. Some core dumps reported here. Upped fcntl debug levels. Andrew. Please check the NT specific error code handling (search for the string "/* Ugly - NT specific hack - but needed (JRA) */", this makes NT and 95 clients behave correctly here - please check your Visual Basic apps with this code. Jeremy (jallison@whistle.com). (This used to be commit 97ee4a5f69bd9cfbbc8710a1a04d80db0ee40104)
Diffstat (limited to 'source3/smbd/reply.c')
-rw-r--r--source3/smbd/reply.c34
1 files changed, 29 insertions, 5 deletions
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index aa3f43a813..a8f674183c 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -640,6 +640,15 @@ int reply_chkpth(char *inbuf,char *outbuf)
unix_ERR_class = ERRDOS;
unix_ERR_code = ERRbadpath;
}
+
+ /* Ugly - NT specific hack - but needed (JRA) */
+ if((errno == ENOTDIR) && (Protocol >= PROTOCOL_NT1) &&
+ (get_remote_arch() == RA_WINNT))
+ {
+ unix_ERR_class = ERRDOS;
+ unix_ERR_code = ERRbaddirectory;
+ }
+
return(UNIXERROR(ERRDOS,ERRbadpath));
}
@@ -3390,22 +3399,37 @@ int reply_lockingX(char *inbuf,char *outbuf,int length,int bufsize)
(num_ulocks == 0) && (num_locks == 0) &&
(CVAL(inbuf,smb_vwv0) == 0xFF))
{
+ share_lock_token token;
+ files_struct *fsp = &Files[fnum];
+ uint32 dev = fsp->fd_ptr->dev;
+ uint32 inode = fsp->fd_ptr->inode;
+
DEBUG(5,("reply_lockingX: oplock break reply from client for fnum = %d\n",
fnum));
/*
* Make sure we have granted an oplock on this file.
*/
- if(!Files[fnum].granted_oplock)
+ if(!fsp->granted_oplock)
{
DEBUG(0,("reply_lockingX: Error : oplock break from client for fnum = %d and \
-oplock granted on this file.\n", fnum));
+no oplock granted on this file.\n", fnum));
return ERROR(ERRDOS,ERRlock);
}
- /* Just clear the granted flag and return. oplock_break()
- will handle changing the share_mode_entry. */
+ /* Remove the oplock flag from the sharemode. */
+ lock_share_entry(fsp->cnum, dev, inode, &token);
+ if(remove_share_oplock( fnum, token)==False)
+ {
+ DEBUG(0,("reply_lockingX: failed to remove share oplock for fnum %d, \
+dev = %x, inode = %x\n", fnum, dev, inode));
+ unlock_share_entry(fsp->cnum, dev, inode, token);
+ return -1;
+ }
+ unlock_share_entry(fsp->cnum, dev, inode, token);
+
+ /* Clear the granted flag and return. */
- Files[fnum].granted_oplock = 0;
+ fsp->granted_oplock = False;
return -1;
}
#endif /* USE_OPLOCKS */