• Suzuki Poulose's avatar
    fix compat_sys_utimensat() · d7d7561c
    Suzuki Poulose authored
    Compat utimensat() returns EINVAL when the tv_nsec is one of UTIME_OMIT or
    UTIME_NOW and the tv_sec is set to non-zero.  As per man pages, the tv_sec
    field should be ignored.
    
    sys_utimensat() works fine in this case.
    
    Test case:
    
    #define _GNU_SOURCE
    #define _ATFILE_SOURCE
    #include <stdio.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/stat.h>
    #include <stdlib.h>
    
    main(int argc, char *argv[])
    {
    	struct timespec ts[2];
    	struct timespec *tsp;
    
    	if (argc < 2) {
    		fprintf(stderr, "Usage : %s filename\n", argv[0]);
    		exit (-1);
    	}
    
    	ts[0].tv_nsec = ts[1].tv_nsec = UTIME_NOW;
    	ts[0].tv_sec = ts[1].tv_sec = 1;
    
    	tsp = ts;
    
    	if (utimensat(AT_FDCWD, argv[1],tsp,0) == -1)
    		perror("utimensat");
    	else
    		fprintf(stdout, "utimensat success\n");
    	return 0;
    }
    mjs22lp5:~ # cc -m64 utimensat-test.c -o utimensat_test64
    mjs22lp5:~ # cc -m32 utimensat-test.c -o utimensat_test32
    mjs22lp5:~ # ./utimensat_test32 /tmp/utimensat_test
    utimensat: Invalid argument
    mjs22lp5:~ # ./utimensat_test64 /tmp/utimensat_test
    utimensat success
    mjs22lp5:~ # uname -r
    2.6.31-rc8
    
    With the patch :
    
    mjs22lp5:~ # ./utimensat_test64 /tmp/utimensat_test
    utimensat success
    mjs22lp5:~ # ./utimensat_test32 /tmp/utimensat_test
    utimensat success
    mjs22lp5:~ # uname -r
    2.6.31-rc8utimensat
    Signed-off-by: default avatarSuzuki K P <suzuki@in.ibm.com>
    Cc: Ulrich Drepper <drepper@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    d7d7561c
compat.c 55.3 KB