[Mono-bugs] [Bug 494253] New: Mono.Unix.Native.Syscall.utimes, .lutimes, .futimes use atime as mtime
    bugzilla_noreply at novell.com 
    bugzilla_noreply at novell.com
       
    Mon Apr 13 00:15:07 EDT 2009
    
    
  
http://bugzilla.novell.com/show_bug.cgi?id=494253
           Summary: Mono.Unix.Native.Syscall.utimes, .lutimes, .futimes
                    use atime as mtime
    Classification: Mono
           Product: Mono: Class Libraries
           Version: SVN
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: Mono.POSIX
        AssignedTo: miguel at novell.com
        ReportedBy: wsstefz8f9 at sxipper.net
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---
User-Agent:       Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.8)
Gecko/2009032609 Firefox/3.0.8 (.NET CLR 3.5.30729)
In the Mono.Unix.Native.Syscall class, in at least 2.0.1 through SVN, the
functions utimes, lutimes, and futimes all have the same bug.  In accordance
with the documentation for the respective system calls, they each take a
Timeval[] which is expected to have length 2, the first being the atime (last
access time) and the second being the mtime (last write time).  However, they
actually set both the atime and the mtime to the time specified by the first
entry in the array.
A glance at the source code in SVN makes it pretty clear that the problem is in
support/sys-time.c in the function copy_utimes, which is used by all 3 of these
functions:
static inline struct timeval*
copy_utimes (struct timeval* to, struct Mono_Posix_Timeval *from)
{
        if (from) {
                to[0].tv_sec  = from->tv_sec;
                to[0].tv_usec = from->tv_usec;
                to[1].tv_sec  = from->tv_sec;    //< WRONG
                to[1].tv_usec = from->tv_usec;   //< WRONG
                return to;
        }
        return NULL;
}
I would change this to
static inline struct timeval*
copy_utimes (struct timeval* to, struct Mono_Posix_Timeval *from)
{
        if (from) {
                to[0].tv_sec  = from[0].tv_sec;
                to[0].tv_usec = from[0].tv_usec;
                to[1].tv_sec  = from[1].tv_sec;    //< WRONG
                to[1].tv_usec = from[1].tv_usec;   //< WRONG
                return to;
        }
        return NULL;
}
Reproducible: Always
Steps to Reproduce:
// C# code snippet
string path = "t.txt";
var times = new Mono.Unix.Native.Timeval[] { 
    new Mono.Unix.Native.Timeval { tv_sec = 1000 * 1000000 },
    new Mono.Unix.Native.Timeval { tv_sec = 1100 * 1000000 } };
if (Mono.Unix.Native.Syscall.lutimes(path, times) != 0)
    throw new IOException("Failed to set utimes for " + path + ".", new
Mono.Unix.UnixIOException());
// Then stat t.txt at the command line
Actual Results:  
Access: 2001-09-09 01:46:40.000000000 +0000
Modify: 2001-09-09 01:46:40.000000000 +0000
Change: 2009-04-13 03:14:31.284572623 +0000
Expected Results:  
Access: 2001-09-09 01:46:40.000000000 +0000
Modify: 2004-11-09 11:33:20.000000000 +0000
Change: 2009-04-13 03:14:31.284572623 +0000
-- 
Configure bugmail: http://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
    
    
More information about the mono-bugs
mailing list