diff options
author | Jeremy Allison <jra@samba.org> | 2007-10-31 15:45:45 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2007-10-31 15:45:45 -0700 |
commit | 8f1f2f04c796a8659d93bafadefca4a98fee00f0 (patch) | |
tree | 48921021ab7133572ee5540d5613c1352f05801a | |
parent | 695c4a7a741f1a8a00a4dc867cc3ef731bfc093f (diff) | |
download | samba-8f1f2f04c796a8659d93bafadefca4a98fee00f0.tar.gz samba-8f1f2f04c796a8659d93bafadefca4a98fee00f0.tar.bz2 samba-8f1f2f04c796a8659d93bafadefca4a98fee00f0.zip |
Fix some cases where file_set_dosmode was being passed
False instead of NULL. Fix more of the notifications to
be correct for Samba4 RAW-NOTIFY torture (we had missed
one when calling set_ea_dos_attribute().
Jeremy.
(This used to be commit 39d265375cf55eedddef2c4faa65398df73d5ed2)
-rwxr-xr-x | source3/script/tests/selftest.sh | 2 | ||||
-rw-r--r-- | source3/smbd/dosmode.c | 19 | ||||
-rw-r--r-- | source3/smbd/fileio.c | 9 | ||||
-rw-r--r-- | source3/smbd/nttrans.c | 2 | ||||
-rw-r--r-- | source3/smbd/open.c | 6 | ||||
-rw-r--r-- | source3/smbd/reply.c | 2 | ||||
-rw-r--r-- | source3/smbd/trans2.c | 2 |
7 files changed, 30 insertions, 12 deletions
diff --git a/source3/script/tests/selftest.sh b/source3/script/tests/selftest.sh index 8de6420b10..30355a829d 100755 --- a/source3/script/tests/selftest.sh +++ b/source3/script/tests/selftest.sh @@ -139,6 +139,8 @@ cat >$SERVERCONFFILE<<EOF printing = bsd printcap name = /dev/null +# min receivefile size = 4000 + [tmp] path = $PREFIX_ABS/tmp read only = no diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c index ed622d3730..18e6439be4 100644 --- a/source3/smbd/dosmode.c +++ b/source3/smbd/dosmode.c @@ -425,7 +425,8 @@ uint32 dos_mode(connection_struct *conn, const char *path,SMB_STRUCT_STAT *sbuf) int file_set_dosmode(connection_struct *conn, const char *fname, uint32 dosmode, SMB_STRUCT_STAT *st, - const char *parent_dir) + const char *parent_dir, + bool newfile) { SMB_STRUCT_STAT st1; int mask=0; @@ -455,6 +456,10 @@ int file_set_dosmode(connection_struct *conn, const char *fname, /* Store the DOS attributes in an EA by preference. */ if (set_ea_dos_attribute(conn, fname, st, dosmode)) { + if (!newfile) { + notify_fname(conn, NOTIFY_ACTION_MODIFIED, + FILE_NOTIFY_CHANGE_ATTRIBUTES, fname); + } return 0; } @@ -491,8 +496,10 @@ int file_set_dosmode(connection_struct *conn, const char *fname, } if ((ret = SMB_VFS_CHMOD(conn,fname,unixmode)) == 0) { - notify_fname(conn, NOTIFY_ACTION_MODIFIED, - FILE_NOTIFY_CHANGE_ATTRIBUTES, fname); + if (!newfile) { + notify_fname(conn, NOTIFY_ACTION_MODIFIED, + FILE_NOTIFY_CHANGE_ATTRIBUTES, fname); + } return 0; } @@ -523,8 +530,10 @@ int file_set_dosmode(connection_struct *conn, const char *fname, ret = SMB_VFS_FCHMOD(fsp, fsp->fh->fd, unixmode); unbecome_root(); close_file_fchmod(fsp); - notify_fname(conn, NOTIFY_ACTION_MODIFIED, - FILE_NOTIFY_CHANGE_ATTRIBUTES, fname); + if (!newfile) { + notify_fname(conn, NOTIFY_ACTION_MODIFIED, + FILE_NOTIFY_CHANGE_ATTRIBUTES, fname); + } } return( ret ); diff --git a/source3/smbd/fileio.c b/source3/smbd/fileio.c index 9e296f2204..74f2c6774f 100644 --- a/source3/smbd/fileio.c +++ b/source3/smbd/fileio.c @@ -230,8 +230,13 @@ ssize_t write_file(struct smb_request *req, if (SMB_VFS_FSTAT(fsp,fsp->fh->fd,&st) == 0) { int dosmode = dos_mode(fsp->conn,fsp->fsp_name,&st); - if ((lp_store_dos_attributes(SNUM(fsp->conn)) || MAP_ARCHIVE(fsp->conn)) && !IS_DOS_ARCHIVE(dosmode)) { - file_set_dosmode(fsp->conn,fsp->fsp_name,dosmode | aARCH,&st, False); + if ((lp_store_dos_attributes(SNUM(fsp->conn)) || + MAP_ARCHIVE(fsp->conn)) && + !IS_DOS_ARCHIVE(dosmode)) { + file_set_dosmode(fsp->conn,fsp->fsp_name, + dosmode | aARCH,&st, + NULL, + false); } /* diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index bbbde06619..da926d1bce 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -1971,7 +1971,7 @@ static NTSTATUS copy_internals(TALLOC_CTX *ctx, creates the file. This isn't the correct thing to do in the copy case. JRA */ file_set_dosmode(conn, newname, fattr, &sbuf2, - parent_dirname(newname)); + parent_dirname(newname),false); if (ret < (SMB_OFF_T)sbuf1.st_size) { return NT_STATUS_DISK_FULL; diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 4ed3a70411..53fc1be586 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -1866,7 +1866,8 @@ NTSTATUS open_file_ntcreate(connection_struct *conn, if (!posix_open) { file_set_dosmode(conn, fname, new_dos_attributes | aARCH, NULL, - parent_dir); + parent_dir, + true); } } } @@ -2035,7 +2036,8 @@ static NTSTATUS mkdir_internal(connection_struct *conn, if (!posix_open) { file_set_dosmode(conn, name, file_attributes | aDIR, NULL, - parent_dir); + parent_dir, + true); } } diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 531e71fe73..d2aa6c6929 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -1114,7 +1114,7 @@ void reply_setatr(connection_struct *conn, struct smb_request *req) else mode &= ~aDIR; - if (file_set_dosmode(conn,fname,mode,&sbuf,False) != 0) { + if (file_set_dosmode(conn,fname,mode,&sbuf,NULL,false) != 0) { reply_unixerror(req, ERRDOS, ERRnoaccess); END_PROFILE(SMBsetatr); return; diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index d75f6a29fd..58d44a856b 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -4563,7 +4563,7 @@ static NTSTATUS smb_set_file_dosmode(connection_struct *conn, DEBUG(10,("smb_set_file_dosmode: file %s : setting dos mode 0x%x\n", fname, (unsigned int)dosmode )); - if(file_set_dosmode(conn, fname, dosmode, psbuf, False)) { + if(file_set_dosmode(conn, fname, dosmode, psbuf, NULL, false)) { DEBUG(2,("smb_set_file_dosmode: file_set_dosmode of %s failed (%s)\n", fname, strerror(errno))); return map_nt_error_from_unix(errno); |