Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Oct 2007 12:53:40 +0400
From:      "Artem Kuchin" <matrix@itlegion.ru>
To:        "David Xu" <davidxu@FreeBSD.org>
Cc:        freebsd-current@FreeBSD.org
Subject:   Re: Broken su in current - trying to fix myself, help needed!
Message-ID:  <013c01c81164$628def90$0c00a8c0@Artem>
References:  <00bd01c810ec$10371230$0c00a8c0@Artem> <47171988.7040706@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
David Xu wrote:
> 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.


Let me quote myself: 

<start_quote>
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.
<end_quote.

However,  i didnot see, but you seem to find out WHY it helps.
Thanks a lot. I think you are right. So, those lines seem to be
a remnant of something old and removing them does not break
anything else hopefully.

Though, i still dont; understand why  tcgetpgrp return 100000 
(an unusually high number).


Regards,
Artem




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?013c01c81164$628def90$0c00a8c0>