summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2004-03-19 23:46:48 +0000
committerJeremy Allison <jra@samba.org>2004-03-19 23:46:48 +0000
commit7cea655424467770600a7866eb3ac909ddf8fcab (patch)
treeb6116193c20a1cd3632c10773c89c16539071a39
parent56c2626e128cf8cbd136c280288c31b13a831fe2 (diff)
downloadsamba-7cea655424467770600a7866eb3ac909ddf8fcab.tar.gz
samba-7cea655424467770600a7866eb3ac909ddf8fcab.tar.bz2
samba-7cea655424467770600a7866eb3ac909ddf8fcab.zip
Fix for #1064 - ensure truncate attribute checking is done correctly on "hidden" dot files.
Jeremy. (This used to be commit a6045c904fbe7df111c520134581bfd4f1ca67a8)
-rw-r--r--source3/smbd/dosmode.c30
-rw-r--r--source3/smbd/open.c3
2 files changed, 28 insertions, 5 deletions
diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c
index fb72a2eafc..8353baeb21 100644
--- a/source3/smbd/dosmode.c
+++ b/source3/smbd/dosmode.c
@@ -111,16 +111,14 @@ mode_t unix_mode(connection_struct *conn,int dosmode,const char *fname)
return(result);
}
-
/****************************************************************************
change a unix mode to a dos mode
****************************************************************************/
-uint32 dos_mode(connection_struct *conn,char *path,SMB_STRUCT_STAT *sbuf)
+
+uint32 dos_mode_from_sbuf(connection_struct *conn, SMB_STRUCT_STAT *sbuf)
{
int result = 0;
- DEBUG(8,("dos_mode: %s\n", path));
-
if ((sbuf->st_mode & S_IWUSR) == 0)
result |= aRONLY;
@@ -149,6 +147,30 @@ uint32 dos_mode(connection_struct *conn,char *path,SMB_STRUCT_STAT *sbuf)
#endif
#endif
+ DEBUG(8,("dos_mode_from_sbuf returning "));
+
+ if (result & aHIDDEN) DEBUG(8, ("h"));
+ if (result & aRONLY ) DEBUG(8, ("r"));
+ if (result & aSYSTEM) DEBUG(8, ("s"));
+ if (result & aDIR ) DEBUG(8, ("d"));
+ if (result & aARCH ) DEBUG(8, ("a"));
+
+ DEBUG(8,("\n"));
+ return result;
+}
+
+/****************************************************************************
+ change a unix mode to a dos mode
+****************************************************************************/
+uint32 dos_mode(connection_struct *conn,char *path,SMB_STRUCT_STAT *sbuf)
+{
+ int result = 0;
+
+ DEBUG(8,("dos_mode: %s\n", path));
+
+ result = dos_mode_from_sbuf(conn, sbuf);
+
+ /* Now do any modifications that depend on the path name. */
/* hide files with a name starting with a . */
if (lp_hide_dot_files(SNUM(conn))) {
char *p = strrchr_m(path,'/');
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index e688f8de48..084ae9a1bf 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -754,7 +754,8 @@ static BOOL open_match_attributes(connection_struct *conn, char *path, mode_t ex
old_dos_mode = dos_mode(conn, path, &sbuf);
sbuf.st_mode = new_mode;
- new_dos_mode = dos_mode(conn, path, &sbuf);
+ /* The new mode conversion shouldn't look at pathname. */
+ new_dos_mode = dos_mode_from_sbuf(conn, &sbuf);
noarch_old_dos_mode = (old_dos_mode & ~FILE_ATTRIBUTE_ARCHIVE);
noarch_new_dos_mode = (new_dos_mode & ~FILE_ATTRIBUTE_ARCHIVE);