Subject: bin/26168: wall tries to write to non tty lines
To: None <gnats-bugs@gnats.NetBSD.org>
From: Martin Husemann <martin@duskware.de>
List: netbsd-bugs
Date: 07/05/2004 19:34:12
>Number:         26168
>Category:       bin
>Synopsis:       wall tries to write to non tty lines
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    bin-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Jul 05 17:35:00 UTC 2004
>Closed-Date:
>Last-Modified:
>Originator:     Martin Husemann
>Release:        NetBSD 2.0G
>Organization:
>Environment:
System: NetBSD night-porter.duskware.de 2.0G NetBSD 2.0G (PORTER) #5: Sun Jul 4 18:09:04 CEST 2004 martin@night-porter.duskware.de:/usr/src/sys/arch/i386/compile/PORTER i386
Architecture: i386
Machine: i386
>Description:

Some X login managers, like gdm, create an utmpx entry with the $DISPLAY as
the "line" entry. Details have been discussed in PR pkg/25879.

When wall(1) is invoked (for example from shutdown) it tries to write to such
devices - and fails. Unfortunately it complains verbosely about the failure.
The attached patch makes it skip the "illegal" line silently.

>How-To-Repeat:

Run gdm, log in, run "shutdown -r now".

>Fix:
Index: wall.c
===================================================================
RCS file: /cvsroot/src/usr.bin/wall/wall.c,v
retrieving revision 1.24
diff -c -u -p -r1.24 wall.c
--- wall.c	7 Aug 2003 11:17:14 -0000	1.24
+++ wall.c	5 Jul 2004 17:30:13 -0000
@@ -88,11 +88,12 @@ main(int argc, char **argv)
 {
 	int ch;
 	struct iovec iov;
-	char *p, **mem;
+	char *p, **mem, linedev[PATH_MAX];
 	struct utmpentry *ep;
 	gid_t egid;
 	struct wallgroup *wg;
 	struct passwd *pw;
+	struct stat sb;
 	time_t atime;
 
 	setprogname(argv[0]);
@@ -146,6 +147,10 @@ main(int argc, char **argv)
 			if (ingroup == 0)
 				continue;
 		}
+		snprintf(linedev, PATH_MAX, _PATH_DEV "%s", ep->line);
+		linedev[PATH_MAX-1] = '\0';
+		if (stat(linedev, &sb))
+			continue;
 		if ((p = ttymsg(&iov, 1, ep->line, 60*5)) != NULL)
 			warnx("%s", p);
 	}

>Release-Note:
>Audit-Trail:
>Unformatted: