Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Oct 2007 16:30:00 +0800
From:      David Xu <davidxu@FreeBSD.org>
To:        Artem Kuchin <matrix@itlegion.ru>
Cc:        freebsd-current@FreeBSD.org
Subject:   Re: Broken su in current - trying to fix myself, help needed!
Message-ID:  <47171988.7040706@freebsd.org>
In-Reply-To: <00bd01c810ec$10371230$0c00a8c0@Artem>

index | next in thread | previous in thread | raw e-mail

Artem Kuchin wrote:
> Hello!
> 
> I really not at all good at any kind of system programming
> in FreeBSD or Un*x, but since my contacts with last commited
> of su could not be establish i decided to look at it myself.
> 
> If you don't know what is the problem i'll describe it shortly:
> 
> if you try to run a very simple perl script:
> 
> #!/usr/bin/perl
> $com="/usr/bin/su root -c 'echo heck'";
> system($com);
> print "done!\n";
> 
> it will print heck
> 
> and then
> 
> Suspended (tty output)
> 
> and will hang in memory untill you type
> fg
> 
> then you get
> 
> done!
> 
> 
> I am working in csh, but i tested it in sh - result is
> the same. FreeBSD version is  7-PRERELEASE.
> 
> 
> So, I fetched su v. 1.76 from 6.2-STABLE and compiled it - it works
> like a charm. SO, i decided to figure what fails in 1.86.
> 
> There are such like in the default: dection of switch
> 
>                child_pgrp = getpgid(child_pid);
>                if (tcgetpgrp(STDERR_FILENO) == child_pgrp)
>                        tcsetpgrp(STDERR_FILENO, getpgrp());
> 
> 
> The problem is here.
> getpgid(child_pid) simply fails with errno 3 (process doesn't exist)
> and tcgetpgrp(STDERR_FILENO) return 100000 (can it be THAT high? i though
> it is only in 0-65535 range).
> 
> The weird thing is that if i just comment out those lines like this
> 
> /* child_pgrp = getpgid(child_pid);
>   if (tcgetpgrp(STDERR_FILENO) == child_pgrp) */
>   tcsetpgrp(STDERR_FILENO, getpgrp());
> 
> su starts working again just fine.
> 
> Any idea why getpgid fails and why tcgetpgrp return 100000 (always the same
> number)? What will brak if i leave these lines commented?
> 
> -- 
> Regards,
> Artem

file su.c, line 472 may be incorrect since line 456 is a while loop 
which only
exits if child process is exited. just remove line 472 and 473 to see if 
problem
is fixed.

Regards,
David Xu



home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?47171988.7040706>