1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-02-13 10:52:09 +02:00

who --mesg (-T) can use a more accurate test for TTY writability

Enabled when coreutils is configured with --with-tty-group.
Based on a patch written by Piotr Gackiewicz.  Details at
http://bugzilla.redhat.com/454261

* src/who.c (is_tty_writable): A new function returning true if a TTY
device is writable by the group.  Additionally it checks the group to be
the same as TTY_GROUP_NAME when compiled with --with-tty-group.
* m4/jm-macros.m4: Introduce a new configure option --with-tty-group.
* NEWS: Mention the change.
This commit is contained in:
Kamil Dudka
2010-01-22 15:17:19 +01:00
committed by Jim Meyering
parent 0caead1ea0
commit aad0bde0b5
4 changed files with 53 additions and 1 deletions

12
NEWS
View File

@@ -2,6 +2,18 @@ GNU coreutils NEWS -*- outline -*-
* Noteworthy changes in release ?.? (????-??-??) [?]
** New features
who: the "+/-" --mesg (-T) indicator of whether a user/tty is accepting
messages could be incorrectly listed as "+", when in fact, the user was
not accepting messages (mesg no). Before, who would examine only the
permission bits, and not consider the group of the TTY device file.
Thus, if a login tty's group would change somehow e.g., to "root",
that would make it unwritable (via write(1)) by normal users, in spite
of whatever the permission bits might imply. Now, when configured
using the --with-tty-group[=NAME] option, who also compares the group
of the TTY device with NAME (or "tty" if no group name is specified).
* Noteworthy changes in release 8.4 (2010-01-13) [stable]

1
THANKS
View File

@@ -495,6 +495,7 @@ Philippe Schnoebelen Philippe.Schnoebelen@imag.fr
Phillip Jones mouse@datastacks.com
Piergiorgio Sartor sartor@sony.de
Pieter Bowman bowman@math.utah.edu
Piotr Gackiewicz gacek@intertele.pl
Piotr Kwapulinski kwap@univ.gda.pl
Prashant TR tr@eth.net
Priit Jõerüüt jemm4jemm@yahoo.com

View File

@@ -144,6 +144,25 @@ AC_DEFUN([coreutils_MACROS],
])
AC_REQUIRE([AM_LANGINFO_CODESET])
# Accept configure options: --with-tty-group[=GROUP], --without-tty-group
# You can determine the group of a TTY via 'stat --format %G /dev/tty'
# Omitting this option is equivalent to using --without-tty-group.
AC_ARG_WITH([tty-group],
AS_HELP_STRING([--with-tty-group[[[=NAME]]]],
[group used by system for TTYs, "tty" when not specified]
[ (default: do not rely on any group used for TTYs)]),
[tty_group_name=$withval],
[tty_group_name=no])
if test "x$tty_group_name" != xno; then
if test "x$tty_group_name" = xyes; then
tty_group_name=tty
fi
AC_MSG_NOTICE([TTY group used by system set to "$tty_group_name"])
AC_DEFINE_UNQUOTED([TTY_GROUP_NAME], ["$tty_group_name"],
[group used by system for TTYs])
fi
])
AC_DEFUN([gl_CHECK_ALL_HEADERS],

View File

@@ -37,6 +37,10 @@
#include "hard-locale.h"
#include "quote.h"
#ifdef TTY_GROUP_NAME
# include <grp.h>
#endif
/* The official name of this program (e.g., no `g' prefix). */
#define PROGRAM_NAME "who"
@@ -308,6 +312,22 @@ print_line (int userlen, const char *user, const char state,
free (x_exitstr);
}
/* Return true if a terminal device given as PSTAT allows other users
to send messages to; false otherwise */
static bool
is_tty_writable (struct stat const *pstat)
{
#ifdef TTY_GROUP_NAME
/* Ensure the group of the TTY device matches TTY_GROUP_NAME, more info at
https://bugzilla.redhat.com/454261 */
struct group *ttygr = getgrnam (TTY_GROUP_NAME);
if (!ttygr || (pstat->st_gid != ttygr->gr_gid))
return false;
#endif
return pstat->st_mode & S_IWGRP;
}
/* Send properly parsed USER_PROCESS info to print_line. The most
recent boot time is BOOTTIME. */
static void
@@ -346,7 +366,7 @@ print_user (const STRUCT_UTMP *utmp_ent, time_t boottime)
if (stat (line, &stats) == 0)
{
mesg = (stats.st_mode & S_IWGRP) ? '+' : '-';
mesg = is_tty_writable (&stats) ? '+' : '-';
last_change = stats.st_atime;
}
else