Problems with OpenSSH2.9p1 on Linux/Sparc

Corey Bodzin DELETEcbodzin at home.com
Sat May 12 09:40:30 EST 2001


Let me start this with the disclaimer that I am a Linux lover that only
pretends to
have any clue about coding.

I grabbed the latest version of OpenSSH (v2.9p1) and went to install it
on my Sparc
(RH 6.2, v2.4.2).  Unlike OpenSSH 2.5.2p2, however, when I tried to
compile it
I got the following error:

... <compiling away> ...
gcc -g -O2 -Wall -I. -I. -I/usr/local/ssl/include
-DETCDIR=\"/usr/local/etc\" -
D_PATH_SSH_PROGRAM=\"/usr/local/bin/ssh\"
-D_PATH_SSH_ASKPASS_DEFAULT=\"/usr/loc
al/libexec/ssh-askpass\"
-D_PATH_SFTP_SERVER=\"/usr/local/libexec/sftp-server\"
-D_PATH_SSH_PIDDIR=\"/var/run\" -DHAVE_CONFIG_H -c channels.c
channels.c: In function `auth_input_request_forwarding':
channels.c:2613: warning: implicit declaration of function `mkdtemp'
channels.c:2613: warning: comparison between pointer and integer
channels.c:2626: warning: passing arg 1 of `on_exit' from incompatible
pointer type
channels.c:2626: too few arguments to function `on_exit'
make: *** [channels.o] Error 1

This was not good.

After doing a little research I discovered that atexit() apparently
doesn't work
on my current system (in glibc > 2.1 it is declared external, which
breaks things
on Sparc...I don't claim to fully follow, so read the news groups for
more info).
Further reading indicated that on_exit() has a different parameter list
than atexit(),
as shown below:

 int atexit(void (*function)(void));
 int on_exit(void (*function)(int , void *), void *arg);

Since the differing parameter is for arguments I thought it might be
safe to just
set it to NULL, as shown below:

        /* if (atexit(cleanup_socket) < 0) { */   /* Original, causes
gcc to barf */
        if (on_exit(cleanup_socket, NULL) < 0) {  /* Revised, now
finger-lickin' good */

This seems to do the trick, allowing me to compile.  Furthermore, I've
been running
the daemon for a little while now and I don't *seem* to have any bad
things happening.
I put together a patch to fix the required files (channels.c,
ssh-agent.c) and listed it
below.

Anyhow, I've posted this for two reasons:

1) So that all the C-impaired people of the world (such as myself) who
want to compile
   OpenSSH2.9p1 on Sparc can do so without the crying, screaming, and
cursing that I
   had to endure.  Just remember, I am not a coder (nor do I play one on
TV), so this
   is not guaranteed to be good or even recommended; it may not even
work; it may break
   things; standard disclaimers apply.

2) So that all the C/OpenSSH/General-UNIX gurus out there can point out
if there is a
   better way to fix this, if this is harmful, etc.

Please drop a line to me at the (obviously spam-protected) address
DELETEcbodzin at home.com
and let me know.

Patch follows - put the text into a file and then type "cat <patchfile>
| patch -p1" from
your openssh2.9p1 directory to install.

----------------------------------------------------------

*** channels.c Fri May 11 16:06:04 2001
--- channels.c.new Fri May 11 16:07:29 2001
***************
*** 2623,2629 ****
   snprintf(channel_forwarded_auth_socket_name, MAX_SOCKET_NAME,
"%s/agent.%d",
     channel_forwarded_auth_socket_dir, (int) getpid());

!  if (atexit(cleanup_socket) < 0) {
    int saved = errno;
    cleanup_socket();
    packet_disconnect("socket: %.100s", strerror(saved));
--- 2623,2633 ----
   snprintf(channel_forwarded_auth_socket_name, MAX_SOCKET_NAME,
"%s/agent.%d",
     channel_forwarded_auth_socket_dir, (int) getpid());

!  /* This is bad...on_exit requires 2 parameters, whereas
!     at_exit only takes one.  Field 2 is arguments, so let's
!     see if we can fool it by passing null - Corey 5/11/01   */
!  /* if (atexit(cleanup_socket) < 0) { */
!  if (on_exit(cleanup_socket, NULL) < 0) {
    int saved = errno;
    cleanup_socket();
    packet_disconnect("socket: %.100s", strerror(saved));
*** ssh-agent.c Fri May 11 16:05:57 2001
--- ssh-agent.c.new Fri May 11 16:07:20 2001
***************
*** 860,866 ****
    perror("setsid");
    cleanup_exit(1);
   }
!  if (atexit(cleanup_socket) < 0) {
    perror("atexit");
    cleanup_exit(1);
   }
--- 860,870 ----
    perror("setsid");
    cleanup_exit(1);
   }
!         /* This is bad...on_exit requires 2 parameters, whereas
!            at_exit only takes one.  Field 2 is arguments, so let's
!            see if we can fool it by passing null - Corey 5/11/01   */
!  /* if (atexit(cleanup_socket) < 0) { */
!         if (on_exit(cleanup_socket, NULL) < 0) {
    perror("atexit");
    cleanup_exit(1);
   }




More information about the openssh-unix-dev mailing list