Bug#332198: [Pkg-shadow-devel] Bug#332198: Status of this bug

Alexander Gattin xrgtn at yandex.ru
Fri Jan 6 22:24:01 UTC 2006


Hi!

On Fri, Jan 06, 2006 at 06:50:07PM +0100, Christian Perrier wrote:
> I absolutely don't know whether someone is still investigating it. I
> even don't know if it happens with recent releases of shadow.

I suspect it does. Sometimes. Actually I think the bug
is caused by /var/tmp/utmp file being corrupt from time
to time.

> In short, this seems to be a nice piece of nasty nightmare which could
> lie around for a very long time until someone is really  annoyed by
> this again.
> 
> So, what do we do?

I propose to add syslog debug statements in the code
which will provide more information about tty when bug
_happens_. I think we could enable this debugging code
and just distribute the shadow with it compiled in,
because it will increase shadow's verbosity only a bit.

P.S. I have already patched/modified source
(libmisc/chowntty.c) in my working directory of
Tomasz's CVS. Diff against most recent CVS is attached.

You can see that even when error happens the code uses
LOG_DEBUG level.

If you agree upon this behaviour, I'll generate quilt
patch and enable it.

-- 
WBR,
xrgtn
-------------- next part --------------
Index: libmisc/chowntty.c
===================================================================
RCS file: /cvsroot/shadow/libmisc/chowntty.c,v
retrieving revision 1.13
diff -u -r1.13 chowntty.c
--- libmisc/chowntty.c	31 Aug 2005 17:24:57 -0000	1.13
+++ libmisc/chowntty.c	6 Jan 2006 22:17:10 -0000
@@ -40,6 +40,7 @@
 #include "defines.h"
 #include <pwd.h>
 #include "getdef.h"
+#include <sys/sysmacros.h>
 /*
  * is_my_tty -- determine if "tty" is the same as TTY stdin is using
  */
@@ -47,12 +48,31 @@
 {
 	struct stat by_name, by_fd;
 
-	if (stat (tty, &by_name) || fstat (0, &by_fd))
+	if (stat (tty, &by_name)) {
+		SYSLOG ((LOG_DEBUG,
+			 "can't stat(`%s') - error #%i\n", tty, errno));
+		closelog ();
 		return 0;
+	}
 
-	if (by_name.st_rdev != by_fd.st_rdev)
+	if (fstat (0, &by_fd)) {
+		SYSLOG ((LOG_DEBUG,
+			 "can't fstat(stdin) - error #%i\n", errno));
+		closelog ();
 		return 0;
-	else
+	}
+
+	if (by_name.st_rdev != by_fd.st_rdev) {
+		SYSLOG ((LOG_DEBUG,
+			 "`%s'.st_rdev(%u,%u) != stdin.st_rdev(%u,%u)\n",
+			 tty,
+			 /* XXX: dev_t is 64bit, gnu_dev_mXXor are used
+			  * which are GNU extn */
+			 major(by_name.st_rdev), minor(by_name.st_rdev),
+			 major(by_fd.st_rdev), minor(by_fd.st_rdev)));
+		closelog ();
+		return 0;
+	} else
 		return 1;
 }
 


More information about the Pkg-shadow-devel mailing list