diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2013-10-06 17:14:25 +0400 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2013-10-06 17:14:25 +0400 |
commit | cd256e1c407aa70dfefb7178ed2c0e4201f1aaf7 (patch) | |
tree | fefa7b99ae531051123281cc5673e0022940de5c /miscutils/wall.c | |
parent | 3eab2b7675fc7e2889cd69285a2a31980a4bf504 (diff) |
wall: access FILE under real user's credentials
While at it, move applet/config/kbuild bits into wall.c.
(This way, it's more visible that applet is suid'ed).
function old new delta
wall_main 87 138 +51
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'miscutils/wall.c')
-rw-r--r-- | miscutils/wall.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/miscutils/wall.c b/miscutils/wall.c index 762f53b72..c74f4f27b 100644 --- a/miscutils/wall.c +++ b/miscutils/wall.c @@ -6,6 +6,18 @@ * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ +//config:config WALL +//config: bool "wall" +//config: default y +//config: depends on FEATURE_UTMP +//config: help +//config: Write a message to all users that are logged in. + +/* Needs to be run by root or be suid root - needs to write to /dev/TTY: */ +//applet:IF_WALL(APPLET(wall, BB_DIR_USR_BIN, BB_SUID_REQUIRE)) + +//kbuild:lib-$(CONFIG_WALL) += wall.o + //usage:#define wall_trivial_usage //usage: "[FILE]" //usage:#define wall_full_usage "\n\n" @@ -22,8 +34,19 @@ int wall_main(int argc UNUSED_PARAM, char **argv) { struct utmp *ut; char *msg; - int fd = argv[1] ? xopen(argv[1], O_RDONLY) : STDIN_FILENO; + int fd; + fd = STDIN_FILENO; + if (argv[1]) { + /* The applet is setuid. + * Access to the file must be under user's uid/gid. + */ + setfsuid(getuid()); + setfsgid(getgid()); + fd = xopen(argv[1], O_RDONLY); + setfsuid(geteuid()); + setfsgid(getegid()); + } msg = xmalloc_read(fd, NULL); if (ENABLE_FEATURE_CLEAN_UP && argv[1]) close(fd); |