Subject: [libssh2] #265: agent_disconnect_unix closes stdin on Solaris 10 x64

[libssh2] #265: agent_disconnect_unix closes stdin on Solaris 10 x64

From: libssh2 Trac <trac_at_libssh2.stuge.se>
Date: Fri, 17 May 2013 18:25:05 -0000

#265: agent_disconnect_unix closes stdin on Solaris 10 x64
-------------------------+--------------------
 Reporter: mkerestesch | Owner:
     Type: defect | Status: new
 Priority: normal | Milestone: 1.4.3
Component: SFTP | Version: 1.4.2
 Keywords: | Blocked By:
   Blocks: |
-------------------------+--------------------
 Hi there.
 i'm, using libssh2 1.4.3 in a multi-threaded environment to connect to an
 sftp-server via curl (curl 7.30.0, openssl 1.0.1e).
 My code is working perfectly in a windows 7, Linux x64, Solaris 11 x64 and
 Mac OS X x64 environment, but shutting down a thread local curl
 handle under Solaris 10 x64 somehow seems to close stdin (which i rely on
 due to ipc-requirements).
 Anyway. I was able to generate a stacktrace for the problem and the
 offending call seems to be agent_disconnect_unix, which obviously
 closes fd with fd == 0.
 As I can see from libssh2_agent_init the LIBSSH_AGENT struct is zeroed,
 which also sets fd to zero.
 Changing (agent.c):

 LIBSSH2_API LIBSSH2_AGENT *
 libssh2_agent_init(LIBSSH2_SESSION *session)
 {
     LIBSSH2_AGENT *agent;

     agent = LIBSSH2_ALLOC(session, sizeof *agent);
     if (!agent) {
         _libssh2_error(session, LIBSSH2_ERROR_ALLOC,
                        "Unable to allocate space for agent connection");
         return NULL;
     }
     memset(agent, 0, sizeof *agent);
     agent->session = session;
     _libssh2_list_init(&agent->head);

     return agent;
 }

 to

 LIBSSH2_API LIBSSH2_AGENT *
 libssh2_agent_init(LIBSSH2_SESSION *session)
 {
     LIBSSH2_AGENT *agent;

     agent = LIBSSH2_ALLOC(session, sizeof *agent);
     if (!agent) {
         _libssh2_error(session, LIBSSH2_ERROR_ALLOC,
                        "Unable to allocate space for agent connection");
         return NULL;
     }
     memset(agent, 0, sizeof *agent);
     agent->fd = LIBSSH2_INVALID_SOCKET;
     agent->session = session;
     _libssh2_list_init(&agent->head);

     return agent;
 }

 fixed the problem for me. Still strange that this incident does not pop up
 on other platforms….

 Attached you'll find a dbx stack trace.

 Regards, Matt

-- 
Ticket URL: <https://trac.libssh2.org/ticket/265>
libssh2 <https://trac.libssh2.org/>
C library for writing portable SSH2 clients
_______________________________________________
libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel
Received on 2013-05-17