The current implementation of rexec() uses fstat() and it seems
to pick up the wrong values for st_mode. As a consequence
the code keeps complaining about the permissions for ~/.netrc
and won't complete successfully.

I don't know enough about the how the re-mapping of stat/stat64
works within cygwin1.dll itself, but changing to fstat64()
like libc/iruserok.c resolves the problem.




winsup/cygwin/Changlog

    * libc/rexec.cc: Use fstat64() instead of fstat().


--- winsup/cygwin/libc/rexec.cc.orig    2009-04-06 12:11:02.046875000 -0700
+++ winsup/cygwin/libc/rexec.cc 2009-04-06 12:12:31.578125000 -0700
@@ -159,7 +159,7 @@
        char myname[INTERNET_MAX_HOST_NAME_LENGTH + 1];
        const char *mydomain;
        int t, i, c, usedefault = 0;
-       struct stat stb;
+       struct __stat64 stb;

        hdir = getenv("HOME");
        if (hdir == NULL)
@@ -218,7 +218,7 @@
                        break;
                case PASSWD:
                        if ((*aname == 0 || strcmp(*aname, "anonymous")) &&
-                           fstat(fileno(cfile), &stb) >= 0 &&
+                           fstat64(fileno(cfile), &stb) >= 0 &&
                            (stb.st_mode & 077) != 0) {
        warnx("Error: .netrc file is readable by others.");
        warnx("Remove password or make file unreadable by others.");
@@ -230,7 +230,7 @@
                        }
                        break;
                case ACCOUNT:
-                       if (fstat(fileno(cfile), &stb) >= 0
+                       if (fstat64(fileno(cfile), &stb) >= 0
                            && (stb.st_mode & 077) != 0) {
        warnx("Error: .netrc file is readable by others.");
        warnx("Remove account or make file unreadable by others.");




Reply via email to