nmh 1.0.4 doesn't work as POP client on LInux systems

2000-04-22 Thread Glenn Burkhardt

Last November, I submitted a bug report with patches for nmh - it didn't work
as a POP client properly on Linux systems.  But unfortunately, the patches
didn't get into the 1.0.4 release, so here goes again:

The Symptom:  Unless .netrc is used, on systems using glibc 2.1.1, 'inc' fails
to work when nmh is configured as a POP client.

The Reason:  The glibc version of ruserpass() won't prompt the user for a
password (the glibc maintainers believe that this is the right and proper
behavior, and won't change ruserpass() - see note attached).

Possible Solutions:

1.  At minimum, the documentation should be changed to note the current
restriction that ~/.netrc be used to supply a login/password for POP.

2.  For Linux systems, avoid using the glibc version of ruserpass(), and use
the version supplied with nmh.  There's an additional problem here -
ruserpass() calls getpass(), and in glibc, the getpass() flushes standard input
before prompting the user for a password.  When a program like exmh uses 'inc',
it feeds in the password as standard input with code like:

exec inc +inbox -truncate -nochangecur -width 100  password

which fails with the glibc version of getpass().  So a replacement for
getpass() needs to be provided as well.


What to Do?

I'm willing to put together changes to the nmh configure script that will
use the nmh version of ruserpass().  I have a patch for ruserpass() that works
with my system (see attached).  Would you like me to work on the configure
portion?

But it is also the case that 'ruserpass()' is not a "well defined" function -
it's not a Posix function, and can't be guaranteed to exist with any particular
attributes on any particular system.  It's an internal routine to rexec(), and
by rights shouldn't really be used by nmh at all.  So a better overall fix
would be to always use the nmh version of ruserpass(), including its own
'getpass()' routine, to make sure it always works.

So, what would you like to do?  Please at least include a note in the MACHINES
file about the restriction that on Linux systems, ~/.netrc must be used for
POP login/password info.  Thanks!





 glenn  writes:

 Number: 1474
 Category:   libc
 Synopsis:   rexec() function won't prompt for password if not found in .netrc 
file
 Confidential:   no
 Severity:   serious
 Priority:   medium
 Responsible:libc-gnats
 State:  open
 Class:  sw-bug
 Submitter-Id:   unknown
 Arrival-Date:   Mon Nov 29 12:00:01 EST 1999
 Last-Modified:
 Originator: [EMAIL PROTECTED]
 Organization:
  net
 Release:2.1.1
 Environment:
  Mandrake Linux 6.1, i386 architecture
 Description:
  Unfortunately, none of this family of functions (rexec, rcmd) is documented in the 
 manual.

  Previous editions of ruserpass() in the BSD distribution would prompt for a 
  password if it wasn't found in a variety of places.  The glibc version will
  only return a username/password if there are appropriate entries in the .netrc file.

  This has caused the current edition of nmh (1.0.2) not to work correctly, because
  it counts on the user being prompted for a password.

  Since there is no documentation of rexec() in the glibc manual, I include for 
  reference excerpts from man pages on 

This has been discussed several times on the glibc mailing lists.  I'm
citing some comments from the discussion:


Mark Kettenis writes on 26th October 1999:
 Do you have any evidence that the statement about rexec asking for the
 username/password is true?  Although the BSD man pages do indeed
 mention that rexec() would do this, none of the BSD's derived from
 BSD 4.2 (which according to the man page is the first version that has
 rexec()) do implement this.  Since the code in glibc is derived
 directly from BSD, it is no surprise that glibc doesn't do this
 either.  So the whole issue appears to be a documentation bug on the
 side of BSD.  There may be some reimplementations of rexec() around
 that do ask for a password based on the BSD documentation,  but that's
 not very relevant.  I think that there are a lot of cases where it is
 unwanted.  As a principle, no library call should print anything
 (except when that's the explicit purpose of the call of course), let
 alone ask for input.

And later, Mark again:
 
 Anyway, the issue has been discussed before [1].  Ulrich thinks
 we should stay with the BSD 4.4 implementation, and I agree with him.
 It's more or less the reference standard for rexec().
 
 Also note that rexec() is considered to be pretty dangerous.  FreeBSD
 and NetBSD only offer it for compatibility with BSD 4.4, and
 reccommend using another mechanism.
 
 Mark
 
 [1] http://sourceware.cygnus.com/ml/bug-glibc/1999-07/msg00085.html

In a nutshell: glibc follows the BSD 4.4 implementation and we're not
going to change it.

Andreas
-- 
 Andreas Jaeger
  SuSE Labs [EMAIL PROTECTED]
   private [EMAIL PROTECTED]




*** ruserpass.c.orig	Fri Apr 30 14:08:34 1999
--- ruserpass.c	Mon Nov 

Re: nmh 1.0.4 doesn't work as POP client on LInux systems

2000-04-22 Thread Shantonu Sen

 Last November, I submitted a bug report with patches for nmh - it didn't work
 as a POP client properly on Linux systems.  But unfortunately, the patches
 didn't get into the 1.0.4 release, so here goes again:

I had the same problems, and fixed them after 1.0.4 came out. I did not
want to commit them prematurely and risk the release version having bugs.

My solution was to completely take out any dependency on system ruserpass,
and use the version packaged with nmh. If you want to take advantage of
this, I recommend you get the latext CVS version.
 
 2.  For Linux systems, avoid using the glibc version of ruserpass(), and use
 the version supplied with nmh.  There's an additional problem here -
 ruserpass() calls getpass(), and in glibc, the getpass() flushes standard input
 before prompting the user for a password.  When a program like exmh uses 'inc',
 it feeds in the password as standard input with code like:
 
   exec inc +inbox -truncate -nochangecur -width 100  password
 
 which fails with the glibc version of getpass().  So a replacement for
 getpass() needs to be provided as well.

I haven't tested this with exmh. I will look into it.

 I'm willing to put together changes to the nmh configure script that will
 use the nmh version of ruserpass().  I have a patch for ruserpass() that works
 with my system (see attached).  Would you like me to work on the configure
 portion?

configure is done, as is ruserpass. I will work on incorporating your
getpass().

 So, what would you like to do?  Please at least include a note in the MACHINES
 file about the restriction that on Linux systems, ~/.netrc must be used for
 POP login/password info.  Thanks!

Hopefully this will not be necessary.

Shantonu


*---*
|Shantonu Sen * (617)225-6778 * [EMAIL PROTECTED]|
|Electrical Engineering and Computer Science|
|Massachusetts Institute of Technology, 2002|
*---*