Uploaded image for project: 'MINA SSHD'
  1. MINA SSHD
  2. SSHD-89

EOF is not send by the client

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • None
    • 0.6.0
    • None

    Description

      I found a case where I need to implement something of this concept:
      "gzip /tmp/sample.txt | ssh user@some.host.com gunzip -c > /tmp/sample.txt"

      I'm implementing a client that gzip's the file and send it to a remote machine
      in stdin. Here's a snip of my implementation:

      // Create the GZIP output stream
      ByteArrayOutputStream baosGZipped = new ByteArrayOutputStream ();
      GZIPOutputStream gzOut = new GZIPOutputStream(baosGZipped);

      // Open the input file
      FileInputStream src = new FileInputStream(sourceFileName);

      byte[] buf = new byte[1024];
      int len;
      while ((len = src.read(buf)) > 0)

      { gzOut.write(buf, 0, len); }

      src.close();

      // Complete the GZIP file
      gzOut.finish();
      gzOut.flush();
      gzOut.close();

      //create channel
      ClientChannel channel = session.createExecChannel("gunzip -c >" + destFile);

      ByteArrayInputStream in = new ByteArrayInputStream(baosGZipped.toByteArray());
      channel.setIn(in);
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      channel.setOut(out);
      ByteArrayOutputStream err = new ByteArrayOutputStream();
      channel.setErr(err);

      //open channel
      channel.open();

      //wait close
      channel.waitFor(ClientChannel.CLOSED, 0);

      What I discovered is that this will never end !!!
      The problem is, that there's a pumpInputStream in ClientInputStreamPump thread (org/apache/sshd/client/channel/ChannelSession.java),
      that will never end until closeFuture.isClosed. Since this does not happen, the unzip in the remote host doesn't end, and the channel will
      never close. This prevents the client from a proper pipe implementation.

      There should be a method to properly end this while-loop thus the remote side will be able to finish and close.
      ie-
      public void CloseStream()

      { streamStop = true; }

      and change pumpInputStream like this:
      -while (!closeFuture.isClosed())
      +while (!closeFuture.isClosed() && !streamStop)

      Attachments

        Activity

          People

            gnodet Guillaume Nodet
            doron Doron Fediuck
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: