A library function initgroup(3) is used at src/server.c:switch_to_user().
In FreeBSD, initgroup(3) writes a error message to stderr if failure.
Therefore, cvs client displays `unrecognized auth response from ...'
and quit.

This patch is that stderr is connected to /dev/null during initgroup(3).

Index: server.c
===================================================================
RCS file: /home2/cvsroot/ccvs/src/server.c,v
retrieving revision 1.224
diff -c -r1.224 server.c
*** server.c    2000/02/18 22:35:08     1.224
--- server.c    2000/03/03 10:41:42
***************
*** 5061,5071 ****
--- 5061,5102 ----
  #if defined (HAVE_KERBEROS) || defined (AUTH_SERVER_SUPPORT) || defined (HAVE_GSSAPI)
  static void switch_to_user PROTO((const char *));
  
+ struct discard_stderr
+ {
+     int saved_stderr;
+     int devnull;
+ };
+ 
+ void
+ begin_discard_stderr(struct discard_stderr *disc)
+ {
+     if ((disc->saved_stderr = dup (2)) < 0)
+       error_exit ();
+     if ((disc->devnull = open (DEVNULL, O_WRONLY)) < 0)
+       error_exit ();
+     if (dup2 (disc->devnull, 2) < 0)
+       error_exit ();
+ }
+ 
+ void
+ end_discard_stderr(struct discard_stderr *disc)
+ {
+     if (dup2 (disc->saved_stderr, 2) < 0)
+       error_exit ();
+     if (close (disc->devnull) < 0)
+       error_exit ();
+     if (close (disc->saved_stderr) < 0)
+       error_exit ();
+ }
+ 
  static void
  switch_to_user (username)
      const char *username;
  {
      struct passwd *pw;
+ #ifdef __FreeBSD__
+     struct discard_stderr disc;
+ #endif
  
      pw = getpwnam (username);
      if (pw == NULL)
***************
*** 5080,5085 ****
--- 5111,5119 ----
      }
  
  #if HAVE_INITGROUPS
+ #  ifdef __FreeBSD__
+     begin_discard_stderr(&disc);
+ #  endif
      if (initgroups (pw->pw_name, pw->pw_gid) < 0
  #  ifdef EPERM
        /* At least on the system I tried, initgroups() only works as root.
***************
*** 5097,5102 ****
--- 5131,5139 ----
        /* Don't worry about server_cleanup; server_active isn't set yet.  */
        error_exit ();
      }
+ #  ifdef __FreeBSD__
+     end_discard_stderr(&disc);
+ #  endif
  #endif /* HAVE_INITGROUPS */
  
  #ifdef SETXID_SUPPORT




--
KOIE Hidetaka <[EMAIL PROTECTED]>

Reply via email to