ports/125739: net/samba3: After changing of dos attributes stored in extended attributes, file modification time is also changing
Alexander Zagrebin
alexz at visp.ru
Fri Jul 18 09:50:02 UTC 2008
>Number: 125739
>Category: ports
>Synopsis: net/samba3: After changing of dos attributes stored in extended attributes, file modification time is also changing
>Confidential: no
>Severity: serious
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Jul 18 09:50:01 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator: Alexander Zagrebin
>Release: 7.0-RELEASE-p1
>Organization:
>Environment:
FreeBSD <hidden> 7.0-RELEASE-p1 FreeBSD 7.0-RELEASE-p1 #0: Mon Jun 23 16:07:06 MSD 2008 root@<hidden>:/usr/src/sys/i386/compile/KERNEL i386
>Description:
I'm using extended attributes for storing dos attributes on samba's shares.
So smb.conf contains:
store dos attributes = yes
map system = no
map hidden = no
map archive = no
map read only = no
I have noticed, that after change of dos attribute of a file its modification time is changing also. This isn't a dos/windows behavior.
It seems the reason is in extattr_set_<...>, which changes the file's modification time on setting extending attribute.
>How-To-Repeat:
1. Add "store dos attributes = yes" to /usr/local/etc/smb.conf
2. Select an any file on samba share
3. Look at the modification time of this file
4. Change any dos attribute (readonly, archive, hidden, system) of this file
5. Look at the file modification time again
>Fix:
Samba may use an extended attributes for storing dos attributes, acl inheritance flag, and so on. So i wrote the patch for lib/system.c instead smbd/dosmode.c.
This patch stores file's access and modification times before extattr_set_...
and restores its after.
See the attached file
Patch attached with submission follows:
--- lib/system.c.orig 2008-07-03 10:16:55.000000000 +0400
+++ lib/system.c 2008-07-18 11:18:58.000000000 +0400
@@ -2250,7 +2250,22 @@
}
}
}
- retval = extattr_set_file(path, attrnamespace, attrname, value, size);
+ {
+ int rv;
+ SMB_STRUCT_STAT st;
+ struct timeval tv[2];
+
+ if (rv = sys_stat(path, &st))
+ DEBUG(1, ("sys_setxattr: sys_stat on %s failed (%s)\n", path, strerror(errno)));
+ retval = extattr_set_file(path, attrnamespace, attrname, value, size);
+ if (!rv && retval != -1)
+ {
+ TIMESPEC_TO_TIMEVAL(&tv[0], &st.st_atimespec);
+ TIMESPEC_TO_TIMEVAL(&tv[1], &st.st_mtimespec);
+ if (utimes(path, tv))
+ DEBUG(1, ("sys_setxattr: utimes on %s failed (%s)\n", path, strerror(errno)));
+ }
+ }
return (retval < 0) ? -1 : 0;
#elif defined(HAVE_ATTR_SET)
int myflags = 0;
@@ -2314,7 +2329,22 @@
}
}
- retval = extattr_set_link(path, attrnamespace, attrname, value, size);
+ {
+ int rv;
+ SMB_STRUCT_STAT st;
+ struct timeval tv[2];
+
+ if (rv = sys_lstat(path, &st))
+ DEBUG(1, ("sys_lsetxattr: sys_lstat on %s failed (%s)\n", path, strerror(errno)));
+ retval = extattr_set_link(path, attrnamespace, attrname, value, size);
+ if (!rv && retval != -1)
+ {
+ TIMESPEC_TO_TIMEVAL(&tv[0], &st.st_atimespec);
+ TIMESPEC_TO_TIMEVAL(&tv[1], &st.st_mtimespec);
+ if (lutimes(path, tv))
+ DEBUG(1, ("sys_lsetxattr: lutimes on %s failed (%s)\n", path, strerror(errno)));
+ }
+ }
return (retval < 0) ? -1 : 0;
#elif defined(HAVE_ATTR_SET)
int myflags = ATTR_DONTFOLLOW;
@@ -2379,7 +2409,22 @@
}
}
}
- retval = extattr_set_fd(filedes, attrnamespace, attrname, value, size);
+ {
+ int rv;
+ SMB_STRUCT_STAT st;
+ struct timeval tv[2];
+
+ if (rv = sys_fstat(filedes, &st))
+ DEBUG(1, ("sys_fsetxattr: sys_fstat on fd %i failed (%s)\n", filedes, strerror(errno)));
+ retval = extattr_set_fd(filedes, attrnamespace, attrname, value, size);
+ if (!rv && retval != -1)
+ {
+ TIMESPEC_TO_TIMEVAL(&tv[0], &st.st_atimespec);
+ TIMESPEC_TO_TIMEVAL(&tv[1], &st.st_mtimespec);
+ if (futimes(filedes, tv))
+ DEBUG(1, ("sys_fsetxattr: futimes on fd %i failed (%s)\n", filedes, strerror(errno)));
+ }
+ }
return (retval < 0) ? -1 : 0;
#elif defined(HAVE_ATTR_SETF)
int myflags = 0;
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list