On Tue, 2015-06-09 at 16:58 +0200, Samuel Thibault wrote: > Svante Signell, le Tue 09 Jun 2015 16:46:14 +0200, a écrit : > > On Tue, 2015-06-09 at 14:20 +0200, Samuel Thibault wrote: > > > Svante Signell, le Tue 09 Jun 2015 11:41:01 +0200, a écrit : > > > > On Tue, 2015-06-09 at 11:11 +0200, Samuel Thibault wrote: > > > > > > > > > So the package is actually doing something stupid (yes, that's what > > > > > you > > > > > should have written in your mail to explain what is happening, > > > > > actually > > > > > :) ). But it does work as root as specified by POSIX, so we have to > > > > > support it. > > > > > > > > Yes I think there is a package bug (it's up to the package maintainer to > > > > write good code, not me pointing fingers): > > > > > > Well, the code is supposed to be run by root, so it's actually sorta > > > "correct" :) > > > > The difference is that real root can change the directory mode to > > drw-r--r-- and still access everything below, but fakeroot has to do at > > least drwxr--r- for anybody except root itself to read that directory. > > Yes, that's what I meant. > > > New patch attached using the IS_ISDIR macro. Better now? > > Yes, except that > > > - if (nn->openmodes & O_EXEC) > > - real_mode |= S_IXUSR; > > + real_mode = mode | S_IRUSR | S_IWUSR; > > + if (S_ISDIR (mode)) > > + real_mode |= S_IXUSR;
Sorry I forgot to hit <TAB> on that line. New patch attached for convenience. > This should be 2-space indentation like the rest of the file. > > I'm also wondering whether we'd want to set IXUSR when > openmodes & O_EXEC. > > BTW, I guess you have tested the patch? I've built pycorrfit and hurd so far, no issues yet. Will build glibc, gnat-4.9 and gcc-5 to be sure.
Index: hurd-0.6.git20150523/trans/fakeroot.c =================================================================== --- hurd-0.6.git20150523.orig/trans/fakeroot.c +++ hurd-0.6.git20150523/trans/fakeroot.c @@ -548,7 +548,6 @@ real_from_fake_mode (mode_t mode) error_t netfs_attempt_chmod (struct iouser *cred, struct node *np, mode_t mode) { - struct netnode *nn; mode_t real_mode; if ((mode & S_IFMT) == 0) @@ -558,18 +557,13 @@ netfs_attempt_chmod (struct iouser *cred /* Make sure that `check_openmodes' will still always be able to reopen it. */ - real_mode = mode; - nn = netfs_node_netnode (np); - if (nn->openmodes & O_READ) - real_mode |= S_IRUSR; - if (nn->openmodes & O_WRITE) - real_mode |= S_IWUSR; - if (nn->openmodes & O_EXEC) + real_mode = mode | S_IRUSR | S_IWUSR; + if (S_ISDIR (mode)) real_mode |= S_IXUSR; /* We don't bother with error checking since the fake mode change should always succeed--worst case a later open will get EACCES. */ - (void) file_chmod (nn->file, real_mode); + (void) file_chmod (netfs_node_netnode (np)->file, real_mode); set_faked_attribute (np, FAKE_MODE); np->nn_stat.st_mode = mode; return 0;