From owner-freebsd-current@FreeBSD.ORG Thu Oct 18 08:29:12 2007 Return-Path: Delivered-To: freebsd-current@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B5A2B16A468 for ; Thu, 18 Oct 2007 08:29:12 +0000 (UTC) (envelope-from davidxu@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 9E6CE13C465; Thu, 18 Oct 2007 08:29:12 +0000 (UTC) (envelope-from davidxu@FreeBSD.org) Received: from [127.0.0.1] (root@localhost [127.0.0.1]) by freefall.freebsd.org (8.14.1/8.14.1) with ESMTP id l9I8T7c3052189; Thu, 18 Oct 2007 08:29:09 GMT (envelope-from davidxu@freebsd.org) Message-ID: <47171988.7040706@freebsd.org> Date: Thu, 18 Oct 2007 16:30:00 +0800 From: David Xu User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.13) Gecko/20070516 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Artem Kuchin References: <00bd01c810ec$10371230$0c00a8c0@Artem> In-Reply-To: <00bd01c810ec$10371230$0c00a8c0@Artem> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Cc: freebsd-current@FreeBSD.org Subject: Re: Broken su in current - trying to fix myself, help needed! X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 18 Oct 2007 08:29:12 -0000 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