]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
write: change determination can user write to a terminal
authorSami Kerola <kerolasa@iki.fi>
Sun, 18 Aug 2013 09:44:13 +0000 (10:44 +0100)
committerSami Kerola <kerolasa@iki.fi>
Thu, 29 Aug 2013 17:14:07 +0000 (18:14 +0100)
Earlier test failed when user had write permission, but was not in
special group that owns terminal devices, usually tty.

This made write(1) to fail for root, if the root did not happen to be in
tty group.  In this commit root is granted ot write to anyone, even if
they have mesg(1) turned off.  For an user who is trying to write to own
other session the group write bit is significant only for whether mesg(1)
are enabled.

Signed-off-by: Sami Kerola <kerolasa@iki.fi>
term-utils/write.c

index cb3b0444d7aab1c78e6348cc0f5dcc5300ab63e3..1738694655d0c02f6b12f891122a644d40b95e2c 100644 (file)
@@ -73,7 +73,7 @@ static void __attribute__ ((__noreturn__)) done(int);
 int term_chk(char *, int *, time_t *, int);
 int utmp_chk(char *, char *);
 
-static gid_t myegid;
+static gid_t root_access;
 
 static void __attribute__ ((__noreturn__)) usage(FILE * out)
 {
@@ -120,7 +120,7 @@ int main(int argc, char **argv)
                        usage(stderr);
                }
 
-       myegid = getegid();
+       root_access = !getegid();
 
        /* check that sender has write enabled */
        if (isatty(fileno(stdin)))
@@ -299,8 +299,9 @@ int term_chk(char *tty, int *msgsokP, time_t * atimeP, int showerror)
                return 1;
        }
 
-       /* group write bit and group ownership */
-       *msgsokP = (s.st_mode & (S_IWRITE >> 3)) && myegid == s.st_gid;
+       *msgsokP = !access(path, W_OK);
+       if (!root_access && *msgsokP)
+               *msgsokP = s.st_mode & S_IWGRP;
        *atimeP = s.st_atime;
        return 0;
 }