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>