[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

libssh: 0.5 ssh_connect hangs if you connect your own socket


I'm attempting to switch over from libssh 0.4.8 to 0.5 (RC), and I'm having
a problem when I try to connect the socket myself instead of relying on
ssh_connect to do so:
ssh_connect never returns.  On Windows, it chews up 100% of the CPU; on
Linux, it just hangs.  

This works under 0.4.8.

Here's a test program:
--------------------
// libsshmrr2.cpp - Program to test hang in libssh's ssh_connect when
// you use your own socket.
// Mark Riordan  2011-05-17

#include <stdio.h>
#include <string>
#ifdef WIN32
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#define SOCKET int
#endif
#include "libssh/libssh.h"

using namespace std;

int doSSH()
{
   ssh_session session;
   session=ssh_new();

   struct struct_settings {
      string host;
      int port;
      string user;
      int verbosity;
   } settings;
   settings.host="172.16.22.182";
   settings.port = 22;
   settings.user="mrr";
   settings.verbosity=SSH_LOG_FUNCTIONS;

   printf("libssh version: %s\n", ssh_version(0));

   if (ssh_options_set(session, SSH_OPTIONS_USER, settings.user.c_str()) <
0) {
      printf("Could not set user\n");
      return 22;
   }

   bool bUsingOwnSocket=true;
   if(bUsingOwnSocket) {
#ifdef WIN32
      WSADATA         wsadata;
      WSAStartup(MAKEWORD(2, 0), &wsadata);
#endif
      SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);

      unsigned long hostaddr = inet_addr(settings.host.c_str());

      struct sockaddr_in sin;
      sin.sin_family = AF_INET;
      sin.sin_port = htons(settings.port);
      sin.sin_addr.s_addr = hostaddr;
      if (connect(sock, (struct sockaddr *) (&sin),
         sizeof(struct sockaddr_in)) != 0) {
#ifdef WIN32
         int err = WSAGetLastError();
#else
         int err = errno;
#endif
         printf("Failed to connect: error %d\n", err);
        return 20;
      } else {
         printf("Connected our own socket to %s\n", settings.host.c_str());
      }
      if (ssh_options_set(session, SSH_OPTIONS_FD, &sock) < 0) {
         return 21;
      }
   } else {
      if (ssh_options_set(session, SSH_OPTIONS_HOST, settings.host.c_str())
< 0) {
         printf("Could not set host\n");
         return 23;
      }
   }
   ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &settings.verbosity);

   if(ssh_connect(session)){
      fprintf(stderr,"Connection failed : %s\n",ssh_get_error(session));
      ssh_disconnect(session);
      return 24;
   } else {
      printf("ssh_connect succeeded.\n");
   }

   return 0;
}

int main(int argc, char* argv[])
{
   int retval = doSSH();
   printf("Press Enter to exit: ");
   getchar();
   return retval;
}
--------------------
ssh_connect succeeds if I set bUsingOwnSocket to false.  
If I set it to true, I get output like this on Linux:

Connected our own socket to 172.16.22.182
[func] entering function ssh_connect line 628 in
/home/mrr/dist/master/src/client.c
[1] libssh 0.5.0 (c) 2003-2010 Aris Adamantiadis (aris@xxxxxxxxxxxx)
Distributed under the LGPL, please refer to COPYING file for information
about your rights, using threading threads_noop
[2] Socket connecting, now waiting for the callbacks to work
[func]  entering function ssh_handle_packets line 420 in
/home/mrr/dist/master/src/session.c
(then nothing)

On Windows, I get:
Connected our own socket to 172.16.22.182
[func] entering function ssh_connect line 628 in ..\..\src\client.c
[1] libssh 0.5.0 (c) 2003-2010 Aris Adamantiadis (aris@xxxxxxxxxxxx)
Distributed
under the LGPL, please refer to COPYING file for information about your
rights,
using threading threads_noop
[2] Socket connecting, now waiting for the callbacks to work
[func] entering function ssh_handle_packets line 436 in ..\..\src\session.c
[func] leaving function ssh_handle_packets line 449 in ..\..\src\session.c
[func] entering function ssh_handle_packets line 436 in ..\..\src\session.c
[func] leaving function ssh_handle_packets line 449 in ..\..\src\session.c
... (endless loop of last two lines)

I think that the problem under Windows is that in poll.c's bsd_poll,
ssh_pollfd_t events==0, and hence bsd_poll is returning an error without
even bothering to call select().

I get the same symptoms with both 0.4.91 from 2011-03-23, and today's
version from git.

Any ideas?

Thanks,

Mark R





Follow-Ups:
Re: libssh: 0.5 ssh_connect hangs if you connect your own socket"Oliver Stöneberg" <oliverst@xxxxxxxxx>
Archive administrator: postmaster@lists.cynapses.org