Hello,

On Sun, May 10, 2009 at 05:29:28PM +0200, l...@dooz.org wrote:
> 
>  Following these steps, I systematically am prevented to deluser foobar:
>  - on tty1 as root, adduser foobar, password foo
>  - on tty2, login as foobar/foo, then ^D to logout
>  - on tty1 as root, deluser foobar:
>     Removing user `foobar' ...
>     Warning: group `foobar' has no more members.
>     userdel: user foobar is currently logged in
>     /usr/sbin/deluser: `/usr/sbin/userdel foobar' returned error code 8. 
> Exiting.

I cannot reproduce it.

I just remember already reading about this kind of bug, so it would be
nice to have more information.

Did you make changes in one of:
/etc/login.defs
/etc/pam.d/login
/etc/pam.d/common-session
(and maybe some other pam.d files)

>  I reproduce with "userdel foobar" and if I strace it, I see one of the
>  last actions before the message is to open /var/run/utmp.
> 
>  pgrep -u foobar yields no process and "who" and "w" don't show any
>  session from foobar; "last foobar" doesn't show this user as logged in
>  either.
> 
>  If I login on tty2 with another user, I can deluser foobar.
> 
>  I suspect the parsing of utmp is broken since both w and who get it
>  right.

it would be nice to get the utmp entry for tty2.

Can check with the attached C file, after you have logged out foobar?


Best Regards,
-- 
Nekral
#include <stdio.h>
#include <strings.h>
#include <unistd.h>
#include <utmp.h>

int main (void)
{
	struct utmp *utent;

	setutent ();
	while ((utent = getutent ()) != NULL)
	{
		if (strcmp (utent->ut_line, "tty2") == 0)
		{
			printf ("ut_type: %d\n", utent->ut_type);
			printf ("ut_user: %s\n", utent->ut_user);
			printf ("ut_id: %.4s\n", utent->ut_id);
		}
	}
	endutent ();

	/* Here's what deluser do: */
	printf ("userdel check\n");
	setutent ();
	while ((utent = getutent ()) != NULL)
	{
		if (utent->ut_type != USER_PROCESS)
			continue;
		if (strcmp (utent->ut_user, "foobar") != 0)
			continue;
		fprintf (stderr,
		         "user %s is currently logged in\n",
		         "foobar");
	}
	endutent ();

	return 0;
}

Reply via email to