#257: [PATCH] libssh2_session_free: infinite loop
-----------------------+-------------------
  Reporter:  greg2001  |      Owner:
      Type:  defect    |     Status:  new
  Priority:  normal    |  Milestone:  1.4.3
 Component:  API       |    Version:  1.4.2
Resolution:            |   Keywords:
Blocked By:            |     Blocks:
-----------------------+-------------------

Comment (by bagder):

 On second thought, I think we can leave the loop if we fix so that the
 function removes the entrt from session->listeners also on errors. My
 suggested fix is thus:


 {{{
 diff --git a/src/channel.c b/src/channel.c
 index 71f2537..faff11e 100644
 --- a/src/channel.c
 +++ b/src/channel.c
 @@ -606,6 +606,7 @@ int _libssh2_channel_forward_cancel(LIBSSH2_LISTENER
 *listen
      size_t packet_len =
          host_len + 14 + sizeof("cancel-tcpip-forward") - 1;
      int rc;
 +    int retcode = 0;

      if (listener->chanFwdCncl_state == libssh2_NB_state_idle) {
          _libssh2_debug(session, LIBSSH2_TRACE_CONN,
 @@ -644,9 +645,11 @@ int _libssh2_channel_forward_cancel(LIBSSH2_LISTENER
 *liste
              _libssh2_error(session, LIBSSH2_ERROR_SOCKET_SEND,
                             "Unable to send global-request packet for
 forward "
                             "listen request");
 -            LIBSSH2_FREE(session, packet);
 -            listener->chanFwdCncl_state = libssh2_NB_state_idle;
 -            return LIBSSH2_ERROR_SOCKET_SEND;
 +            /* set the state to something we don't check for, for the
 +               unfortunate situation where we get an EAGAIN further down
 +               when trying to bail out due to errors! */
 +            listener->chanFwdCncl_state = libssh2_NB_state_sent;
 +            retcode = LIBSSH2_ERROR_SOCKET_SEND;
          }
          LIBSSH2_FREE(session, packet);

 @@ -670,7 +673,7 @@ int _libssh2_channel_forward_cancel(LIBSSH2_LISTENER
 *listen

      LIBSSH2_FREE(session, listener);

 -    return 0;
 +    return retcode;
  }


 }}}

-- 
Ticket URL: <https://trac.libssh2.org/ticket/257#comment:4>
libssh2 <https://trac.libssh2.org/>
C library for writing portable SSH2 clients

_______________________________________________
libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel

Reply via email to