Author: idra Date: 2007-07-03 23:34:01 +0000 (Tue, 03 Jul 2007) New Revision: 23691
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=23691 Log: fix for bug on touching files as described here: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=243897 Modified: branches/SAMBA_3_0/source/modules/vfs_recycle.c branches/SAMBA_3_0_26/source/modules/vfs_recycle.c Changeset: Modified: branches/SAMBA_3_0/source/modules/vfs_recycle.c =================================================================== --- branches/SAMBA_3_0/source/modules/vfs_recycle.c 2007-07-03 20:00:02 UTC (rev 23690) +++ branches/SAMBA_3_0/source/modules/vfs_recycle.c 2007-07-03 23:34:01 UTC (rev 23691) @@ -386,20 +386,28 @@ /** * Touch access or modify date **/ -static void recycle_do_touch(vfs_handle_struct *handle, const char *fname, BOOL touch_mtime) +static void recycle_do_touch(vfs_handle_struct *handle, const char *fname, + BOOL touch_mtime) { SMB_STRUCT_STAT st; struct timespec ts[2]; - + int status, err; + if (SMB_VFS_NEXT_STAT(handle, fname, &st) != 0) { - DEBUG(0,("recycle: stat for %s returned %s\n", fname, strerror(errno))); + DEBUG(0,("recycle: stat for %s returned %s\n", + fname, strerror(errno))); return; } ts[0] = timespec_current(); /* atime */ ts[1] = touch_mtime ? ts[0] : get_mtimespec(&st); /* mtime */ - if (SMB_VFS_NEXT_NTIMES(handle, fname, ts) == -1 ) { - DEBUG(0, ("recycle: touching %s failed, reason = %s\n", fname, strerror(errno))); + become_root(); + status = SMB_VFS_NEXT_NTIMES(handle, fname, ts); + err = errno; + unbecome_root(); + if (status == -1 ) { + DEBUG(0, ("recycle: touching %s failed, reason = %s\n", + fname, strerror(err))); } } Modified: branches/SAMBA_3_0_26/source/modules/vfs_recycle.c =================================================================== --- branches/SAMBA_3_0_26/source/modules/vfs_recycle.c 2007-07-03 20:00:02 UTC (rev 23690) +++ branches/SAMBA_3_0_26/source/modules/vfs_recycle.c 2007-07-03 23:34:01 UTC (rev 23691) @@ -386,20 +386,28 @@ /** * Touch access or modify date **/ -static void recycle_do_touch(vfs_handle_struct *handle, const char *fname, BOOL touch_mtime) +static void recycle_do_touch(vfs_handle_struct *handle, const char *fname, + BOOL touch_mtime) { SMB_STRUCT_STAT st; struct timespec ts[2]; - + int status, err; + if (SMB_VFS_NEXT_STAT(handle, fname, &st) != 0) { - DEBUG(0,("recycle: stat for %s returned %s\n", fname, strerror(errno))); + DEBUG(0,("recycle: stat for %s returned %s\n", + fname, strerror(errno))); return; } ts[0] = timespec_current(); /* atime */ ts[1] = touch_mtime ? ts[0] : get_mtimespec(&st); /* mtime */ - if (SMB_VFS_NEXT_NTIMES(handle, fname, ts) == -1 ) { - DEBUG(0, ("recycle: touching %s failed, reason = %s\n", fname, strerror(errno))); + become_root(); + status = SMB_VFS_NEXT_NTIMES(handle, fname, ts); + err = errno; + unbecome_root(); + if (status == -1 ) { + DEBUG(0, ("recycle: touching %s failed, reason = %s\n", + fname, strerror(err))); } }