From libssh2-devel-bounces@cool.haxx.se  Wed Feb  1 09:21:26 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q118L0OC026624;
	Wed, 1 Feb 2012 09:21:22 +0100
Received: from mail-bk0-f54.google.com (mail-bk0-f54.google.com
	[209.85.214.54])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q118KvW1026418
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Wed, 1 Feb 2012 09:20:58 +0100
Received: by bkbzx1 with SMTP id zx1so1023372bkb.41
	for <libssh2-devel@cool.haxx.se>; Wed, 01 Feb 2012 00:20:53 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=issart.com; s=issartcom;
	h=message-id:date:from:organization:user-agent:mime-version:to
	:subject:content-type:content-transfer-encoding;
	bh=2i9TPAj2+TdmSa3291gPFknwqK0YeqJ3aknZD/ob5Jo=;
	b=b/434so/rlGFLLR3bqyt0fOtRwNpCOGp2Qb51IMJei85EzAJxFFuupAmlVgtuPNG5F
	4NjEiQWnrNOrMuKiFoRHVNprrqt6/2Tt/0ypT5ib09SoRNIODkk3P4YDnMIDRVGDC7LU
	uQOTHN/bD9HKXbEydFDHt+7pVKbAAPPU4FJog=
Received: by 10.204.148.84 with SMTP id o20mr11871084bkv.103.1328084452194;
	Wed, 01 Feb 2012 00:20:52 -0800 (PST)
Received: from [172.17.9.68] ([91.215.84.26])
	by mx.google.com with ESMTPS id ek9sm52092742bkb.10.2012.02.01.00.20.50
	(version=SSLv3 cipher=OTHER); Wed, 01 Feb 2012 00:20:51 -0800 (PST)
Message-ID: <4F28F5E0.8050308@issart.com>
Date: Wed, 01 Feb 2012 15:20:48 +0700
From: Denis Malyshkin <dmalyshkin@issart.com>
Organization: ISS Art, Ltd.
User-Agent: Thunderbird 2.0.0.14 (Windows/20080421)
MIME-Version: 1.0
To: libssh2-devel@cool.haxx.se
Subject: Several direct_tcpip channels in one SSH session
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Hi,

Is it possible to do opening of several direct_tcpip channels in one SSH 
session simultaneously (in async mode)?
I.e. to call libssh2_channel_direct_tcpip_ex(...) several times for one 
session without waiting while previous calls to it are completed.

For example, is it possible to write something like the next (it is just 
an example, not a compilable code):

list<channel_param> params;  // List of parameters for creating channels
while (!params.empty()) {
    for(list<channel_param>::iterator i = params.begin();  i != 
params.end();  ) {
        LIBSSH2_CHANNEL * channel = 
libssh2_channel_direct_tcpip_ex(session, i->host, i->port, ...);
        if (!channel) {
            if (last_error() != LIBSSH2_ERROR_EAGAIN) {
                // Error, respond to the caller, remove channel from the 
creation list.
                NotifyError(*i);
                i = params.erase(i);
            } else {
                ++i;
            }
        } else {
            // Channel created, respond to the caller, remove channel 
from the creation list.
            NotifyCreated(channel, *i);
            i = params.erase(i);
        }
    }
}

As I saw in the source code, channel_direct_tcpip(...) uses some 
variables in the 'session' structure (like session->direct_state, 
session->direct_message and so on). So it seems that only one channel 
creation call can be execute for a session at the moment. And the next 
channel can be created only then a creation of the previous one is 
finished (successfully or with error). Is it correct?


Thanks.

-- 
Best regards,
  Denis Malyshkin,
Senior C++ Developer
of ISS Art, Ltd., Omsk, Russia.
Mobile Phone: +7 913 669 2896
Office tel/fax +7 3812 396959
Yahoo Messenger: dmalyshkin
Web: http://www.issart.com
E-mail: dmalyshkin@issart.com

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

From libssh2-devel-bounces@cool.haxx.se  Wed Feb  1 09:40:16 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q118e807007244;
	Wed, 1 Feb 2012 09:40:15 +0100
Received: from mail-we0-f182.google.com (mail-we0-f182.google.com
	[74.125.82.182])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q118e6wU006468
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Wed, 1 Feb 2012 09:40:06 +0100
Received: by werm13 with SMTP id m13so999814wer.41
	for <libssh2-devel@cool.haxx.se>; Wed, 01 Feb 2012 00:40:03 -0800 (PST)
Received: by 10.216.139.223 with SMTP id c73mr2459138wej.1.1328085603911;
	Wed, 01 Feb 2012 00:40:03 -0800 (PST)
Received: from ?IPv6:2001:980:57a9:1:224:e8ff:fe2a:b203?
	([2001:980:57a9:1:224:e8ff:fe2a:b203])
	by mx.google.com with ESMTPS id cb8sm43246480wib.0.2012.02.01.00.40.02
	(version=SSLv3 cipher=OTHER); Wed, 01 Feb 2012 00:40:02 -0800 (PST)
Message-ID: <4F28FA61.3000403@mabrand.nl>
Date: Wed, 01 Feb 2012 09:40:01 +0100
From: Mark Brand <mabrand@mabrand.nl>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:9.0.1) Gecko/20111220 Firefox/9.0.1 SeaMonkey/2.6.1
MIME-Version: 1.0
To: libssh2-devel@cool.haxx.se
Subject: libssh2 1.4.0 missing libssh_error() function?
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Hi,

Just tried out the libssh2 1.4.0. When I try to link an application I 
get this error:

> libssh2.a(libgcrypt.o):libgcrypt.c:(.text+0xf8b): undefined reference 
> to `__libssh_error'

As far as I can tell, libssh_error() isn't defined in sources. Or am I 
overlooking something?

regards,

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

From libssh2-devel-bounces@cool.haxx.se  Wed Feb  1 09:49:12 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q118n8ww016223;
	Wed, 1 Feb 2012 09:49:12 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q118n6kN016211
	for <libssh2-devel@cool.haxx.se>; Wed, 1 Feb 2012 09:49:06 +0100
Received: (qmail 30434 invoked by uid 501); 1 Feb 2012 08:49:08 -0000
Message-ID: <20120201084908.30433.qmail@stuge.se>
Date: Wed, 1 Feb 2012 09:49:08 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: Several direct_tcpip channels in one SSH session
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <4F28F5E0.8050308@issart.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <4F28F5E0.8050308@issart.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Denis Malyshkin wrote:
> Is it possible to do opening of several direct_tcpip channels in one SSH 
> session simultaneously (in async mode)?
> I.e. to call libssh2_channel_direct_tcpip_ex(...) several times for one 
> session without waiting while previous calls to it are completed.
..
> As I saw in the source code, channel_direct_tcpip(...) uses some
> variables in the 'session' structure (like session->direct_state, 
> session->direct_message and so on). So it seems that only one channel 
> creation call can be execute for a session at the moment. And the next 
> channel can be created only then a creation of the previous one is
> finished (successfully or with error). Is it correct?

Sure, it's pretty clear from the code and indeed your analysis.

The easy way out is to use blocking mode while creating the channels,
and switch to non-blocking only after they exist. This is what the
example/direct-tcpip.c demonstrates.

As an alternative, you can of course block in your code during
creation, and not create number two until the first channel is ready.
This is what you'll need to do if you already process other channels.

Finally, you can of course propose an improvement of the library. I
think it would be great to see an improvement in this area, and if
you come up with a nice solution for direct-tcpip channels then it
could also be applied to all other channel types.

Note that we want to reduce the number of malloc calls in libssh2.


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

From libssh2-devel-bounces@cool.haxx.se  Wed Feb  1 09:56:21 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q118uDQA021104;
	Wed, 1 Feb 2012 09:56:20 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q118uBhc021089
	for <libssh2-devel@cool.haxx.se>; Wed, 1 Feb 2012 09:56:11 +0100
Received: (qmail 31034 invoked by uid 501); 1 Feb 2012 08:56:14 -0000
Message-ID: <20120201085614.31033.qmail@stuge.se>
Date: Wed, 1 Feb 2012 09:56:14 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: libssh2 1.4.0 missing libssh_error() function?
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <4F28FA61.3000403@mabrand.nl>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <4F28FA61.3000403@mabrand.nl>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Mark Brand wrote:
> Just tried out the libssh2 1.4.0. When I try to link an application I get 
> this error:
>
>> libssh2.a(libgcrypt.o):libgcrypt.c:(.text+0xf8b): undefined reference to 
>> `__libssh_error'
>
> As far as I can tell, libssh_error() isn't defined in sources. Or am I 
> overlooking something?

>:(

commit 209de22299b4b58e582891dfba70f57e1e0492db
Author: Peter Krempa <pkrempa@redhat.com>
Date:   Mon Dec 19 15:02:15 2011 +0100

    userauth: Provide more informations if ssh pub key extraction fails

    If the function that extracts/computes the public key from a private key
    fails the errors it reports were masked by the function calling it. This
    patch modifies the key extraction function to return errors using
    _libssh_error() function.  The error messages are tweaked to contain
    reference to the failed operaton in addition to the reason.


Both the commit message and the code refer to the completely bogus
function name in one place. A few other places in the changed code
get it right.

Where is review before applying patches? wtf. I've pushed a fix for
this. I guess 1.4.1 would be in order.


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

From libssh2-devel-bounces@cool.haxx.se  Wed Feb  1 13:23:17 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q11CMv7O011310;
	Wed, 1 Feb 2012 13:23:14 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q11CMtkm011300
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Wed, 1 Feb 2012 13:22:55 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q11CMtdJ011295
	for <libssh2-devel@cool.haxx.se>; Wed, 1 Feb 2012 13:22:55 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Wed, 1 Feb 2012 13:22:55 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: libssh2 1.4.0 missing libssh_error() function?
In-Reply-To: <20120201085614.31033.qmail@stuge.se>
Message-ID: <alpine.DEB.2.00.1202011318400.30339@tvnag.unkk.fr>
References: <4F28FA61.3000403@mabrand.nl> <20120201085614.31033.qmail@stuge.se>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Wed, 1 Feb 2012, Peter Stuge wrote:

> Where is review before applying patches?

Everyone is welcome and encouraged to review them. I read the patches I apply 
and I also need to use my judgement and basic testing when accepting them. 
Sometimes that leads to broken builds like this when I've missed a flaw.

Evidently, not only me but not a single person built libssh2 from git with 
gcrypt for over a month before the release.

Getting a better and automated test system running would of course also be a 
good idea.

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Wed Feb  1 14:07:05 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q11D6tKI011176;
	Wed, 1 Feb 2012 14:07:04 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q11D6rGZ011170
	for <libssh2-devel@cool.haxx.se>; Wed, 1 Feb 2012 14:06:53 +0100
Received: (qmail 18931 invoked by uid 501); 1 Feb 2012 13:06:56 -0000
Message-ID: <20120201130656.18930.qmail@stuge.se>
Date: Wed, 1 Feb 2012 14:06:56 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: libssh2 1.4.0 missing libssh_error() function?
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <4F28FA61.3000403@mabrand.nl> <20120201085614.31033.qmail@stuge.se>
	<alpine.DEB.2.00.1202011318400.30339@tvnag.unkk.fr>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1202011318400.30339@tvnag.unkk.fr>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Daniel Stenberg wrote:
> Getting a better and automated test system running would of course
> also be a good idea.

Yes! Much much better for stuff like this!

I will set up Gerrit and Jenkins for libusb, once I've figured out
wrinkles I'm happy to duplicate also for libssh2. There will be a
Windows build environment as well.


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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  2 01:42:40 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q120gERS025218;
	Thu, 2 Feb 2012 01:42:36 +0100
Received: from mail-qy0-f182.google.com (mail-qy0-f182.google.com
	[209.85.216.182])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q120gBcE024899
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 2 Feb 2012 01:42:12 +0100
Received: by qcmt40 with SMTP id t40so1289048qcm.41
	for <libssh2-devel@cool.haxx.se>; Wed, 01 Feb 2012 16:42:08 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:date:x-google-sender-auth:message-id:subject
	:from:to:content-type;
	bh=V9n3gpM3KMV4PNSa2zysL1cNiU0Gi1H/qWJ0yqo14LY=;
	b=VvbMwSUZhsmA4nJI3rZ7U/5Bt0aZdA+J3XKJllOyskr6Srq6w4pn4RVU2j5PPSkAo4
	0ZaFQ2ffx68mpRI+DfvklQI7gx4O4K7Chs7lmr7hDfsGgse4rcTa+w9qRCXLxVYKaTuW
	sfvuuvNKNm/QWFRX+iBMC2weObx9nqDXsA0Sg=
MIME-Version: 1.0
Received: by 10.229.76.132 with SMTP id c4mr182973qck.134.1328143327498; Wed,
	01 Feb 2012 16:42:07 -0800 (PST)
Received: by 10.229.144.211 with HTTP; Wed, 1 Feb 2012 16:42:07 -0800 (PST)
Date: Thu, 2 Feb 2012 00:42:07 +0000
X-Google-Sender-Auth: rW6cO7HSrlKogijmzNoqiO2gqvY
Message-ID: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
Subject: SFTP issues
From: Alexander Lamaison <swish@lammy.co.uk>
To: "development, libssh2" <libssh2-devel@cool.haxx.se>
Content-Type: multipart/mixed; boundary=00032555bfa23f109604b7f07794
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

--00032555bfa23f109604b7f07794
Content-Type: text/plain; charset=ISO-8859-1

SFTP reading is completely broken for me in 1.4.0 (though it has been
for a while).  The last release that works for me is 1.2.7.

Some revisions cause a read with a buffer larger than 65-130k to
block.  Other revisions cause reads to return 0 prematurely indicating
the end of the file (usually around the 200k mark).  Recent revisions
do the latter.

Using my usual test script (attached) and git bisect I've narrowed
down the offending commits.  Apparently, premature EOF is caused by
03ca9020756a4e16f0294e5b35e9826ee6af2364 [1] and blocking is caused by
90b4b4073f34919aa72deff61a5c9bc188c47c95 [2].  It's difficult to know
how accurate these are as there were several overlapping, interacting
bugs and attempts to fix them that kept changing the SFTP behaviour.

This is all on Windows 7 64-bit.  To try the script yourself, run it as:
    libssh2_bigread ip_address username password path
If you run it with something like /dev/zero as the path, the expected
behaviour is that it will try reading from that path with increasing
buffer sizes up to about 8MB.

Daniel, liuzl: we went through this process in September and you guys
made some fixes which I though had solved it.  I've changed both the
Windows and Linux machines I'm testing on since then so I don't know
if that's why the problems are back.  I don't understand enough about
the SFTP layer to suggest a fix but, as usual, I'll happily test any
patches.

Alex

[1] http://git.libssh2.org/?p=libssh2.git;a=commit;h=03ca9020756a4e16f0294e5b35e9826ee6af2364;js=1
[2] http://git.libssh2.org/?p=libssh2.git;a=commit;h=90b4b4073f34919aa72deff61a5c9bc188c47c95;js=1

--00032555bfa23f109604b7f07794
Content-Type: text/x-c++src; charset=US-ASCII; name="libssh2_bigread.cpp"
Content-Disposition: attachment; filename="libssh2_bigread.cpp"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gy521m9h0

LyoNCiAqIFRoZSBzYW1wbGUgY29kZSBoYXMgZGVmYXVsdCB2YWx1ZXMgZm9yIGhvc3QgbmFtZSwg
dXNlciBuYW1lLCBwYXNzd29yZA0KICogYW5kIHBhdGggdG8gY29weSwgYnV0IHlvdSBjYW4gc3Bl
Y2lmeSB0aGVtIG9uIHRoZSBjb21tYW5kIGxpbmUgbGlrZToNCiAqDQogKiAic2Z0cCAxOTIuMTY4
LjAuMSB1c2VyIHBhc3N3b3JkIC90bXAvc2VjcmV0cyAtcHwtaXwtayINCiAqLw0KDQovLyNkZWZp
bmUgVEVTVF9SRUFEX1NJWkUgNjU0MzIxMA0KI2RlZmluZSBURVNUX1JFQURfU0laRSA2NTQNCg0K
I2luY2x1ZGUgPGxpYnNzaDJfY29uZmlnLmg+DQojaW5jbHVkZSA8bGlic3NoMi5oPg0KI2luY2x1
ZGUgPGxpYnNzaDJfc2Z0cC5oPg0KDQojaWZkZWYgSEFWRV9XSU5TT0NLMl9IDQojIGluY2x1ZGUg
PHdpbnNvY2syLmg+DQojZW5kaWYNCiNpZmRlZiBIQVZFX05FVElORVRfSU5fSA0KIyBpbmNsdWRl
IDxuZXRpbmV0L2luLmg+DQojZW5kaWYNCiNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSA0KIyBpbmNs
dWRlIDxzeXMvc29ja2V0Lmg+DQojZW5kaWYNCiMgaWZkZWYgSEFWRV9VTklTVERfSA0KI2luY2x1
ZGUgPHVuaXN0ZC5oPg0KI2VuZGlmDQojaWZkZWYgSEFWRV9BUlBBX0lORVRfSA0KIyBpbmNsdWRl
IDxhcnBhL2luZXQuaD4NCiNlbmRpZg0KI2lmZGVmIEhBVkVfU1lTX1RJTUVfSA0KIyBpbmNsdWRl
IDxzeXMvdGltZS5oPg0KI2VuZGlmDQoNCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCiNpbmNsdWRl
IDxmY250bC5oPg0KI2luY2x1ZGUgPGVycm5vLmg+DQojaW5jbHVkZSA8c3RkaW8uaD4NCiNpbmNs
dWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRlIDxjdHlwZS5oPg0KDQoNCmNvbnN0IGNoYXIgKnVzZXJu
YW1lPSJ1c2VybmFtZSI7DQpjb25zdCBjaGFyICpwYXNzd29yZD0icGFzc3dvcmQiOw0KY29uc3Qg
Y2hhciAqc2Z0cHBhdGg9Ii90bXAvVEVTVCI7DQoNCg0Kc3RhdGljIHZvaWQga2JkX2NhbGxiYWNr
KGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbiwgDQogICAgICAgICAgICAgY29uc3QgY2hh
ciAqaW5zdHJ1Y3Rpb24sIGludCBpbnN0cnVjdGlvbl9sZW4sIGludCBudW1fcHJvbXB0cywNCiAg
ICAgICAgICAgICBjb25zdCBMSUJTU0gyX1VTRVJBVVRIX0tCRElOVF9QUk9NUFQgKnByb21wdHMs
DQogICAgICAgICAgICAgTElCU1NIMl9VU0VSQVVUSF9LQkRJTlRfUkVTUE9OU0UgKnJlc3BvbnNl
cywNCiAgICAgICAgICAgICB2b2lkICoqYWJzdHJhY3QpDQp7DQogICAgKHZvaWQpbmFtZTsNCiAg
ICAodm9pZCluYW1lX2xlbjsNCiAgICAodm9pZClpbnN0cnVjdGlvbjsNCiAgICAodm9pZClpbnN0
cnVjdGlvbl9sZW47DQogICAgaWYgKG51bV9wcm9tcHRzID09IDEpIHsNCiAgICAgICAgcmVzcG9u
c2VzWzBdLnRleHQgPSBzdHJkdXAocGFzc3dvcmQpOw0KICAgICAgICByZXNwb25zZXNbMF0ubGVu
Z3RoID0gc3RybGVuKHBhc3N3b3JkKTsNCiAgICB9DQogICAgKHZvaWQpcHJvbXB0czsNCiAgICAo
dm9pZClhYnN0cmFjdDsNCn0gLyoga2JkX2NhbGxiYWNrICovDQoNCg0KaW50IG1haW4oaW50IGFy
Z2MsIGNoYXIgKmFyZ3ZbXSkNCnsNCiAgICB1bnNpZ25lZCBsb25nIGhvc3RhZGRyOw0KICAgIGlu
dCBzb2NrLCBpLCBhdXRoX3B3ID0gMDsNCiAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOw0KICAg
IGNvbnN0IGNoYXIgKmZpbmdlcnByaW50Ow0KICAgIGNoYXIgKnVzZXJhdXRobGlzdDsNCiAgICBM
SUJTU0gyX1NFU1NJT04gKnNlc3Npb247DQogICAgaW50IHJjOw0KICAgIExJQlNTSDJfU0ZUUCAq
c2Z0cF9zZXNzaW9uOw0KICAgIExJQlNTSDJfU0ZUUF9IQU5ETEUgKnNmdHBfaGFuZGxlOw0KCWNo
YXIgKm1lbTsNCg0KI2lmZGVmIFdJTjMyDQogICAgV1NBREFUQSB3c2FkYXRhOw0KDQogICAgV1NB
U3RhcnR1cChNQUtFV09SRCgyLDApLCAmd3NhZGF0YSk7DQojZW5kaWYNCg0KICAgIGlmIChhcmdj
ID4gMSkgew0KICAgICAgICBob3N0YWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsNCiAgICB9IGVs
c2Ugew0KICAgICAgICBob3N0YWRkciA9IGh0b25sKDB4N0YwMDAwMDEpOw0KICAgIH0NCg0KICAg
IGlmKGFyZ2MgPiAyKSB7DQogICAgICAgIHVzZXJuYW1lID0gYXJndlsyXTsNCiAgICB9DQogICAg
aWYoYXJnYyA+IDMpIHsNCiAgICAgICAgcGFzc3dvcmQgPSBhcmd2WzNdOw0KICAgIH0NCiAgICBp
ZihhcmdjID4gNCkgew0KICAgICAgICBzZnRwcGF0aCA9IGFyZ3ZbNF07DQogICAgfQ0KICAgIC8q
DQogICAgICogVGhlIGFwcGxpY2F0aW9uIGNvZGUgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5n
IHRoZSBzb2NrZXQNCiAgICAgKiBhbmQgZXN0YWJsaXNoaW5nIHRoZSBjb25uZWN0aW9uDQogICAg
ICovDQogICAgc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7DQoNCiAgICBz
aW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogICAgc2luLnNpbl9wb3J0ID0gaHRvbnMoMjIpOw0K
ICAgIHNpbi5zaW5fYWRkci5zX2FkZHIgPSBob3N0YWRkcjsNCiAgICBpZiAoY29ubmVjdChzb2Nr
LCAoc3RydWN0IHNvY2thZGRyKikoJnNpbiksDQogICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVj
dCBzb2NrYWRkcl9pbikpICE9IDApIHsNCiAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQg
dG8gY29ubmVjdCFcbiIpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgLyogQ3Jl
YXRlIGEgc2Vzc2lvbiBpbnN0YW5jZQ0KICAgICAqLw0KICAgIHNlc3Npb24gPSBsaWJzc2gyX3Nl
c3Npb25faW5pdCgpOw0KICAgIGlmKCFzZXNzaW9uKQ0KICAgICAgICByZXR1cm4gLTE7DQoNCiAg
ICAvKiBTaW5jZSB3ZSBoYXZlIHNldCBub24tYmxvY2tpbmcsIHRlbGwgbGlic3NoMiB3ZSBhcmUg
YmxvY2tpbmcgKi8NCiAgICBsaWJzc2gyX3Nlc3Npb25fc2V0X2Jsb2NraW5nKHNlc3Npb24sIDEp
Ow0KDQogICAgLyogLi4uIHN0YXJ0IGl0IHVwLiBUaGlzIHdpbGwgdHJhZGUgd2VsY29tZSBiYW5u
ZXJzLCBleGNoYW5nZSBrZXlzLA0KICAgICAqIGFuZCBzZXR1cCBjcnlwdG8sIGNvbXByZXNzaW9u
LCBhbmQgTUFDIGxheWVycw0KICAgICAqLw0KICAgIHJjID0gbGlic3NoMl9zZXNzaW9uX3N0YXJ0
dXAoc2Vzc2lvbiwgc29jayk7DQogICAgaWYocmMpIHsNCiAgICAgICAgZnByaW50ZihzdGRlcnIs
ICJGYWlsdXJlIGVzdGFibGlzaGluZyBTU0ggc2Vzc2lvbjogJWRcbiIsIHJjKTsNCiAgICAgICAg
cmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgaGF2bid0IHlldCBh
dXRoZW50aWNhdGVkLiAgVGhlIGZpcnN0IHRoaW5nIHRvIGRvDQogICAgICogaXMgY2hlY2sgdGhl
IGhvc3RrZXkncyBmaW5nZXJwcmludCBhZ2FpbnN0IG91ciBrbm93biBob3N0cyBZb3VyIGFwcA0K
ICAgICAqIG1heSBoYXZlIGl0IGhhcmQgY29kZWQsIG1heSBnbyB0byBhIGZpbGUsIG1heSBwcmVz
ZW50IGl0IHRvIHRoZQ0KICAgICAqIHVzZXIsIHRoYXQncyB5b3VyIGNhbGwNCiAgICAgKi8NCiAg
ICBmaW5nZXJwcmludCA9IGxpYnNzaDJfaG9zdGtleV9oYXNoKHNlc3Npb24sIExJQlNTSDJfSE9T
VEtFWV9IQVNIX01ENSk7DQogICAgZnByaW50ZihzdGRlcnIsICJGaW5nZXJwcmludDogIik7DQog
ICAgZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykgew0KICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUw
MlggIiwgKHVuc2lnbmVkIGNoYXIpZmluZ2VycHJpbnRbaV0pOw0KICAgIH0NCiAgICBmcHJpbnRm
KHN0ZGVyciwgIlxuIik7DQoNCiAgICAvKiBjaGVjayB3aGF0IGF1dGhlbnRpY2F0aW9uIG1ldGhv
ZHMgYXJlIGF2YWlsYWJsZSAqLw0KICAgIHVzZXJhdXRobGlzdCA9IGxpYnNzaDJfdXNlcmF1dGhf
bGlzdChzZXNzaW9uLCB1c2VybmFtZSwgc3RybGVuKHVzZXJuYW1lKSk7DQogICAgcHJpbnRmKCJB
dXRoZW50aWNhdGlvbiBtZXRob2RzOiAlc1xuIiwgdXNlcmF1dGhsaXN0KTsNCiAgICBpZiAoc3Ry
c3RyKHVzZXJhdXRobGlzdCwgInBhc3N3b3JkIikgIT0gTlVMTCkgew0KICAgICAgICBhdXRoX3B3
IHw9IDE7DQogICAgfQ0KICAgIGlmIChzdHJzdHIodXNlcmF1dGhsaXN0LCAia2V5Ym9hcmQtaW50
ZXJhY3RpdmUiKSAhPSBOVUxMKSB7DQogICAgICAgIGF1dGhfcHcgfD0gMjsNCiAgICB9DQoNCiAg
ICAvKiBpZiB3ZSBnb3QgYW4gNC4gYXJndW1lbnQgd2Ugc2V0IHRoaXMgb3B0aW9uIGlmIHN1cHBv
cnRlZCAqLyANCiAgICBpZihhcmdjID4gNSkgew0KICAgICAgICBpZiAoKGF1dGhfcHcgJiAxKSAm
JiAhc3RyY2FzZWNtcChhcmd2WzVdLCAiLXAiKSkgew0KICAgICAgICAgICAgYXV0aF9wdyA9IDE7
DQogICAgICAgIH0NCiAgICAgICAgaWYgKChhdXRoX3B3ICYgMikgJiYgIXN0cmNhc2VjbXAoYXJn
dls1XSwgIi1pIikpIHsNCiAgICAgICAgICAgIGF1dGhfcHcgPSAyOw0KICAgICAgICB9DQogICAg
fQ0KDQogICAgaWYgKGF1dGhfcHcgJiAxKSB7DQogICAgICAgIC8qIFdlIGNvdWxkIGF1dGhlbnRp
Y2F0ZSB2aWEgcGFzc3dvcmQgKi8NCiAgICAgICAgaWYgKGxpYnNzaDJfdXNlcmF1dGhfcGFzc3dv
cmQoc2Vzc2lvbiwgdXNlcm5hbWUsIHBhc3N3b3JkKSkgew0KICAgICAgICAgICAgZnByaW50Zihz
dGRlcnIsICJBdXRoZW50aWNhdGlvbiBieSBwYXNzd29yZCBmYWlsZWQuXG4iKTsNCiAgICAgICAg
ICAgIGdvdG8gc2h1dGRvd247DQogICAgICAgIH0NCiAgICB9IGVsc2UgaWYgKGF1dGhfcHcgJiAy
KSB7DQogICAgICAgIC8qIE9yIHZpYSBrZXlib2FyZC1pbnRlcmFjdGl2ZSAqLw0KICAgICAgICBp
ZiAobGlic3NoMl91c2VyYXV0aF9rZXlib2FyZF9pbnRlcmFjdGl2ZShzZXNzaW9uLCB1c2VybmFt
ZSwgJmtiZF9jYWxsYmFjaykgKSB7DQogICAgICAgICAgICBwcmludGYoIlx0QXV0aGVudGljYXRp
b24gYnkga2V5Ym9hcmQtaW50ZXJhY3RpdmUgZmFpbGVkIVxuIik7DQogICAgICAgICAgICBnb3Rv
IHNodXRkb3duOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcHJpbnRmKCJcdEF1dGhl
bnRpY2F0aW9uIGJ5IGtleWJvYXJkLWludGVyYWN0aXZlIHN1Y2NlZWRlZC5cbiIpOw0KICAgICAg
ICB9DQogICAgfSBlbHNlIHsNCiAgICAgICAgcHJpbnRmKCJObyBzdXBwb3J0ZWQgYXV0aGVudGlj
YXRpb24gbWV0aG9kcyBmb3VuZCFcbiIpOw0KICAgICAgICBnb3RvIHNodXRkb3duOw0KICAgIH0N
Cg0KICAgIGZwcmludGYoc3RkZXJyLCAibGlic3NoMl9zZnRwX2luaXQoKSFcbiIpOw0KICAgIHNm
dHBfc2Vzc2lvbiA9IGxpYnNzaDJfc2Z0cF9pbml0KHNlc3Npb24pOw0KDQogICAgaWYgKCFzZnRw
X3Nlc3Npb24pIHsNCiAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gaW5pdCBTRlRQ
IHNlc3Npb25cbiIpOw0KICAgICAgICBnb3RvIHNodXRkb3duOw0KICAgIH0NCg0KCS8vbGlic3No
Ml90cmFjZShzZXNzaW9uLCAofjApICYgfkxJQlNTSDJfVFJBQ0VfVFJBTlMpOw0KDQogICAgZnBy
aW50ZihzdGRlcnIsICJsaWJzc2gyX3NmdHBfb3BlbigpIVxuIik7DQogICAgLyogUmVxdWVzdCBh
IGZpbGUgdmlhIFNGVFAgKi8NCiAgICBzZnRwX2hhbmRsZSA9DQogICAgICAgIGxpYnNzaDJfc2Z0
cF9vcGVuKHNmdHBfc2Vzc2lvbiwgc2Z0cHBhdGgsIExJQlNTSDJfRlhGX1JFQUQsIDApOw0KDQog
ICAgaWYgKCFzZnRwX2hhbmRsZSkgew0KCQlmcHJpbnRmKA0KCQkJc3RkZXJyLCAiVW5hYmxlIHRv
IG9wZW4gZmlsZSB3aXRoIFNGVFA6ICVkXG4iLA0KCQkJbGlic3NoMl9zZnRwX2xhc3RfZXJyb3Io
c2Z0cF9zZXNzaW9uKSk7DQogICAgICAgIGdvdG8gc2h1dGRvd247DQogICAgfQ0KICAgIGZwcmlu
dGYoc3RkZXJyLCAibGlic3NoMl9zZnRwX29wZW4oKSBpcyBkb25lLCBub3cgcmVjZWl2ZSBkYXRh
IVxuIik7DQoNCgkvL2ZvciAoaW50IGkgPSA2OTcwMDAxOyBpIDwgNjAwMDAwMDA7IGkgKz0gMSkN
Cglmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwMDAwOyBpICo9IDIpDQoJew0KICAgICAgICBmcHJp
bnRmKHN0ZGVyciwgInRyeWluZyBidWZmZXIgc2l6ZSAlZFxuIiwgaSk7DQoJCWxpYnNzaDJfc2Z0
cF9zZWVrKHNmdHBfaGFuZGxlLCAwKTsNCiAgICAgICAgbWVtID0gKGNoYXIgKiltYWxsb2MoaSk7
DQoNCgkJaW50IGJ5dGVzX3JlYWQgPSAwOw0KCQlkbw0KCQl7DQoJCQlyYyA9IGxpYnNzaDJfc2Z0
cF9yZWFkKHNmdHBfaGFuZGxlLCBtZW0sIGkgLSBieXRlc19yZWFkKTsNCgkJCWlmIChyYyA8IDAp
IHsNCgkJCQljaGFyICptc2c7DQoJCQkJZnByaW50ZihzdGRlcnIsICJSRUFEIEZBSUxFRCFcbiIp
Ow0KCQkJCWxpYnNzaDJfc2Vzc2lvbl9sYXN0X2Vycm9yKHNlc3Npb24sICZtc2csIE5VTEwsIDAp
Ow0KCQkJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG1zZyk7DQoJCQkJZnByaW50ZihzdGRlcnIs
ICIlc1xuIiwgbGlic3NoMl92ZXJzaW9uKDApKTsNCgkJCQlicmVhazsNCgkJCX0NCg0KCQkJYnl0
ZXNfcmVhZCArPSByYzsNCgkJfQ0KCQl3aGlsZSAocmMgIT0gMCAmJiBieXRlc19yZWFkIDwgaSk7
DQoNCgkJZnJlZShtZW0pOw0KDQoJCWlmIChieXRlc19yZWFkIDwgaSkNCgkJew0KCQkJZnByaW50
ZihzdGRlcnIsICJSRUFEIFRPTyBPUFRJTUlTVElDIVxuIik7DQoJCQlmcHJpbnRmKA0KCQkJCXN0
ZGVyciwNCgkJCQkiaXQgdGhpbmtzIGl0J3MgZmluaXNoZWQgYnV0IG9ubHkgcmVhZCAlZCBieXRl
c1xuIiwgYnl0ZXNfcmVhZCk7DQoJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBsaWJzc2gyX3Zl
cnNpb24oMCkpOw0KCQl9DQoJCWVsc2UgaWYgKGJ5dGVzX3JlYWQgPT0gaSkNCgkJew0KCQkJZnBy
aW50ZihzdGRvdXQsICJSRUFEIFNVQ0NFRURFRCFcbiIpOw0KCQl9DQoJCWVsc2UgaWYgKGJ5dGVz
X3JlYWQgPiBpKQ0KCQl7DQoJCQlmcHJpbnRmKHN0ZGVyciwgIldURj8hIEJVRkZFUiBPVkVSRkxP
VyEhXG4iKTsNCgkJCWZwcmludGYoDQoJCQkJc3RkZXJyLCAiY2xhaW1zIHRvIGhhdmUgcmVhZCAl
ZCBieXRlc1xuIiwgYnl0ZXNfcmVhZCk7DQoJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBsaWJz
c2gyX3ZlcnNpb24oMCkpOw0KCQl9DQogICAgfQ0KDQogICAgbGlic3NoMl9zZnRwX2Nsb3NlKHNm
dHBfaGFuZGxlKTsNCiAgICBsaWJzc2gyX3NmdHBfc2h1dGRvd24oc2Z0cF9zZXNzaW9uKTsNCg0K
ICBzaHV0ZG93bjoNCg0KICAgIGxpYnNzaDJfc2Vzc2lvbl9kaXNjb25uZWN0KHNlc3Npb24sICJO
b3JtYWwgU2h1dGRvd24sIFRoYW5rIHlvdSBmb3IgcGxheWluZyIpOw0KICAgIGxpYnNzaDJfc2Vz
c2lvbl9mcmVlKHNlc3Npb24pOw0KDQojaWZkZWYgV0lOMzINCiAgICBjbG9zZXNvY2tldChzb2Nr
KTsNCiNlbHNlDQogICAgY2xvc2Uoc29jayk7DQojZW5kaWYNCiAgICBmcHJpbnRmKHN0ZGVyciwg
ImFsbCBkb25lXG4iKTsNCiAgICByZXR1cm4gMDsNCn0NCg==
--00032555bfa23f109604b7f07794
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--00032555bfa23f109604b7f07794--

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  2 13:04:04 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q12C3fom006080;
	Thu, 2 Feb 2012 13:04:00 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q12C3e5i006055
	for <libssh2-devel@cool.haxx.se>; Thu, 2 Feb 2012 13:03:41 +0100
Received: (qmail 16550 invoked by uid 501); 2 Feb 2012 12:03:40 -0000
Message-ID: <20120202120340.16549.qmail@stuge.se>
Date: Thu, 2 Feb 2012 13:03:40 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: SFTP issues
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Hi Alex,

Alexander Lamaison wrote:
> SFTP reading is completely broken for me in 1.4.0 (though it has been
> for a while).  The last release that works for me is 1.2.7.

Bad. We need to fix this.


> Some revisions cause a read with a buffer larger than 65-130k to
> block.  Other revisions cause reads to return 0 prematurely indicating
> the end of the file (usually around the 200k mark).  Recent revisions
> do the latter.
> 
> Using my usual test script (attached) and git bisect I've narrowed
> down the offending commits.  Apparently, premature EOF is caused by
> 03ca9020756a4e16f0294e5b35e9826ee6af2364 [1] and blocking is caused by
> 90b4b4073f34919aa72deff61a5c9bc188c47c95 [2].  It's difficult to know
> how accurate these are as there were several overlapping, interacting
> bugs and attempts to fix them that kept changing the SFTP behaviour.
> 
> This is all on Windows 7 64-bit.  To try the script yourself, run it as:
>     libssh2_bigread ip_address username password path
> If you run it with something like /dev/zero as the path, the expected
> behaviour is that it will try reading from that path with increasing
> buffer sizes up to about 8MB.
> 
> Daniel, liuzl: we went through this process in September and you guys
> made some fixes which I though had solved it.  I've changed both the
> Windows and Linux machines I'm testing on since then so I don't know
> if that's why the problems are back.  I don't understand enough about
> the SFTP layer to suggest a fix but, as usual, I'll happily test any
> patches.

Could you test if this happens also from Linux to Linux? Would be
good to test both on localhost on the server where Windows 7 shows
this problem, and between two different Linux machines.

Could you stop by IRC soonish for some more discussion and testing?


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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  2 19:17:22 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q12IGw6U009843;
	Thu, 2 Feb 2012 19:17:19 +0100
Received: from earth.stuge.se (earth.stuge.se [212.116.89.126])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q12IGva9009832
	for <libssh2-devel@cool.haxx.se>; Thu, 2 Feb 2012 19:16:57 +0100
Received: (qmail 2454 invoked from network); 2 Feb 2012 18:16:56 -0000
Received: from unknown (HELO earth.stuge.se) (127.0.0.1)
	by localhost with SMTP; 2 Feb 2012 18:16:56 -0000
MIME-Version: 1.0
From: "libssh2 Trac" <trac@libssh2.stuge.se>
X-Trac-Version: 0.12.3dev
Precedence: bulk
Cc: libssh2-devel@cool.haxx.se
Auto-Submitted: auto-generated
X-Mailer: Trac 0.12.3dev, by Edgewall Software
X-Trac-Project: libssh2
Date: Thu, 02 Feb 2012 18:16:56 -0000
X-URL: http://trac.libssh2.org/
Subject: [libssh2] #235: [PATCH] Provide symbol versioning support
X-Trac-Ticket-URL: http://trac.libssh2.org/ticket/235
Message-ID: <058.a89eb02b7dab0ddfa30c898d9d68939d@libssh2.stuge.se>
X-Trac-Ticket-ID: 235
X-MIME-Autoconverted: from base64 to 8bit by giant.haxx.se id q12IGva9009832
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Reply-To: trac@libssh2.stuge.se,
        libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

#235: [PATCH] Provide symbol versioning support
------------------------------------+--------------------
 Reporter:  crrodriguez.clavid.com  |       Owner:
     Type:  defect                  |      Status:  new
 Priority:  high                    |   Milestone:  1.4.0
Component:  API                     |     Version:  1.3.0
 Keywords:                          |  Blocked By:
   Blocks:                          |
------------------------------------+--------------------
 The attached patch provides support for symbol versioning if available, as
 well cleanup the symbol visibility support.

 This will fix a not-so-hypotethical scenario (aka.happends all the time
 with many different libraries) that breaks "always moving" linux
 distributions when upstream adds new functions without incrementing
 SOVERSION, resulting in inconsistent linkages, undefined symbols and
 broken user's systems.

-- 
Ticket URL: <http://trac.libssh2.org/ticket/235>
libssh2 <http://trac.libssh2.org/>
C library for writing portable SSH2 clients

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

From libssh2-devel-bounces@cool.haxx.se  Fri Feb  3 07:11:45 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q136BJ67017745;
	Fri, 3 Feb 2012 07:11:41 +0100
Received: from mail-qw0-f54.google.com (mail-qw0-f54.google.com
	[209.85.216.54])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q136BF2n017696
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Fri, 3 Feb 2012 07:11:16 +0100
Received: by qaea17 with SMTP id a17so2295733qae.20
	for <libssh2-devel@cool.haxx.se>; Thu, 02 Feb 2012 22:11:09 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=gaApbl5Ss5+jq9znShEc9b/Zvcd0snbfpAOXL833tAQ=;
	b=FqnwesJM9LP+ljGEy5nhU+unZTrfer918nrqjB5eIIRN49SJTI8+zZUQD1+Sciir/W
	gnmai8CAbcS4/FwOQNHLT7anY99RiMBavcYUdpjIpYX9p3n9DmfOlkkrm3t5htzt20uO
	Vy8X/WHNopt+rYtljA+SAEqLXKamZ+T1Axdv4=
MIME-Version: 1.0
Received: by 10.224.193.66 with SMTP id dt2mr7778689qab.92.1328249469516; Thu,
	02 Feb 2012 22:11:09 -0800 (PST)
Received: by 10.229.39.140 with HTTP; Thu, 2 Feb 2012 22:11:09 -0800 (PST)
Date: Fri, 3 Feb 2012 11:41:09 +0530
Message-ID: <CADoRZ9RsaL9_MAfd1Tu6pb=WvNTnBfcDg6Sy+wdYAgBf6nWXqg@mail.gmail.com>
Subject: hi
From: Gaurav Suryagandh <gaurav.suryagandh@gmail.com>
To: libssh2-devel@cool.haxx.se
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1578641569=="
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

--===============1578641569==
Content-Type: multipart/alternative; boundary=20cf30050e68cdba3204b8092d4d

--20cf30050e68cdba3204b8092d4d
Content-Type: text/plain; charset=ISO-8859-1

Hello All,

I am trying to use libssh2_channel_direct_tcpip_ex() for setting up  the
channel.

I am able to get first request set correctly and getting right reply
from the http server which is running on different machine.

                <<========================================>> channel
machine A       <-----------------------------------------> machin B
(running apache)                                            (access web)

apache on 8080                                               mapped @
8083


I am using select to handle multiple request, but its not helping.
below is my code.

    rc = libssh2_init (0);

    if (rc != 0) {
        fprintf (stderr, "libssh2 initialization failed (%d)\n", rc);
        return 1;
    }

    /* Connect to SSH server */
    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    sin.sin_family = AF_INET;
    if (INADDR_NONE == (sin.sin_addr.s_addr = inet_addr(server_ip))) {
        perror("inet_addr");
        return -1;
    }
    sin.sin_port = htons(22);
    if (connect(sock, (struct sockaddr*)(&sin),
                sizeof(struct sockaddr_in)) != 0) {
        fprintf(stderr, "failed to connect!\n");
        return -1;
    }

    /* Create a session instance */
    session = libssh2_session_init();

    if(!session) {
        fprintf(stderr, "Could not initialize SSH session!\n");
        return -1;
    }

    /* ... start it up. This will trade welcome banners, exchange keys,
     *      * and setup crypto, compression, and MAC layers
     *           */
    rc = libssh2_session_startup(session, sock);

    if(rc) {
        fprintf(stderr, "Error when starting up SSH session: %d\n", rc);
        return -1;
    }

    /* At this point we havn't yet authenticated.  The first thing to do
     *      * is check the hostkey's fingerprint against our known hosts
Your app
     *           * may have it hard coded, may go to a file, may present
it to the
     *                * user, that's your call
     *                     */
    fingerprint = libssh2_hostkey_hash(session,
LIBSSH2_HOSTKEY_HASH_SHA1);

    fprintf(stderr, "Fingerprint: ");
    for(i = 0; i < 20; i++)
        fprintf(stderr, "%02X ", (unsigned char)fingerprint[i]);
    fprintf(stderr, "\n");

    /* check what authentication methods are available */
    userauthlist = libssh2_userauth_list(session, username,
strlen(username));

    printf("Authentication methods: %s\n", userauthlist);
    if (strstr(userauthlist, "password"))
        auth |= AUTH_PASSWORD;
    if (strstr(userauthlist, "publickey"))
        auth |= AUTH_PUBLICKEY;

    /* check for options */
    if(argc > 8) {
        if ((auth & AUTH_PASSWORD) && !strcasecmp(argv[8], "-p"))
            auth = AUTH_PASSWORD;
        if ((auth & AUTH_PUBLICKEY) && !strcasecmp(argv[8], "-k"))
            auth = AUTH_PUBLICKEY;
    }

    if (auth & AUTH_PASSWORD) {
        if (libssh2_userauth_password(session, username, password)) {

            fprintf(stderr, "Authentication by password failed.\n");
            goto shutdown;
        }
    } else if (auth & AUTH_PUBLICKEY) {
        if (libssh2_userauth_publickey_fromfile(session, username,
keyfile1,

                    keyfile2, password)) {
            printf("\tAuthentication by public key failed!\n");
            goto shutdown;
        }
        printf("\tAuthentication by public key succeeded.\n");
    } else {
        printf("No supported authentication methods found!\n");
        goto shutdown;
    }

    listensock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    sin.sin_family = AF_INET;
    sin.sin_port = htons(local_listenport);
    if (INADDR_NONE == (sin.sin_addr.s_addr =
inet_addr(local_listenip))) {
        perror("inet_addr");
        goto shutdown;
    }
    sockopt = 1;
    setsockopt(listensock, SOL_SOCKET, SO_REUSEADDR, &sockopt,
sizeof(sockopt));
    sinlen=sizeof(sin);
    if (-1 == bind(listensock, (struct sockaddr *)&sin, sinlen)) {
        perror("bind - 1 ");
        goto shutdown;
    }
    if (-1 == listen(listensock, 2)) {
        perror("listen");
        goto shutdown;
    }

    printf("Waiting for TCP connection on %s:%d...\n",
            inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));

    forwardsock = accept(listensock, (struct sockaddr *)&sin, &sinlen);
    if (-1 == forwardsock) {
        perror("accept");
        goto shutdown;
    }

    shost = inet_ntoa(sin.sin_addr);
    sport = ntohs(sin.sin_port);

    printf("Forwarding connection from %s:%d here to remote %s:%d\n",
shost,
            sport, remote_desthost, remote_destport);

    channel = libssh2_channel_direct_tcpip_ex(session, remote_desthost,

            remote_destport, shost, sport);
    if (!channel) {
        fprintf(stderr, "Could not open the direct-tcpip channel!\n"
                "(Note that this can be a problem at the server!"
                " Please review the server logs.)\n");
        goto shutdown;
    }

    /* Must use non-blocking IO hereafter due to the current libssh2 API
*/
    libssh2_session_set_blocking(session, 0);


    while (1) {
        FD_ZERO(&fds);
        FD_SET(forwardsock, &fds);
        tv.tv_sec = 0;
        tv.tv_usec = 100000;
        rc = select(forwardsock + 1, &fds, NULL, NULL, &tv);
        if (-1 == rc) {
            perror("select");
            goto shutdown;
        }
        if (rc && FD_ISSET(forwardsock, &fds)) {
            len = recv(forwardsock, buf, sizeof(buf), 0);
            if (len < 0) {
                perror("read");
                goto shutdown;
            } else if (0 == len) {
                printf("The client at %s:%d disconnected!\n", shost,
sport);
                goto shutdown;
            }
            wr = 0;
            do {
                i = libssh2_channel_write(channel, buf, len);

                if (i < 0) {
                    fprintf(stderr, "libssh2_channel_write: %d\n", i);
                    goto shutdown;
                }
                wr += i;
            } while(i > 0 && wr < len);
        }
        while (1) {
            len = libssh2_channel_read(channel, buf, sizeof(buf));

            if (LIBSSH2_ERROR_EAGAIN == len)
                break;
            else if (len < 0) {
                fprintf(stderr, "libssh2_channel_read: %d", (int)len);
                goto shutdown;
            }
            wr = 0;
            while (wr < len) {
                i = send(forwardsock, buf + wr, len - wr, 0);
                if (i <= 0) {
                    perror("write");
                    goto shutdown;
                }
                wr += i;
            }
            if (libssh2_channel_eof(channel)) {

                printf("The server at %s:%d disconnected!\n",
                        remote_desthost, remote_destport);
                goto shutdown;
            }
        }
    }

shutdown:
#ifdef WIN32
    closesocket(forwardsock);
    closesocket(listensock);
#else
    close(forwardsock);
    close(listensock);
#endif
    if (channel)
        libssh2_channel_free(channel);

    libssh2_session_disconnect(session, "Client disconnecting
normally");

    libssh2_session_free(session);


#ifdef WIN32
    closesocket(sock);
#else
    close(sock);
#endif

    libssh2_exit();


Please let me know if something is wrong with this code.

Thanks,
Gaurav

--20cf30050e68cdba3204b8092d4d
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<tt><font color=3D"#2e3436">Hello All, </font></tt><br>
<br>
<tt><font color=3D"#2e3436">I am trying to use libssh2_channel_direct_tcpip=
_ex() for setting up=A0 the</font></tt><br>
<tt><font color=3D"#2e3436">channel.</font></tt><br>
<br>
<tt><font color=3D"#2e3436">I am able to get first request set correctly an=
d getting right reply</font></tt><br>
<tt><font color=3D"#2e3436">from the http server which is running on differ=
ent machine. </font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 &=
lt;&lt;=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D&gt;&gt; channel</fon=
t></tt><br>
<tt><font color=3D"#2e3436">machine A=A0=A0=A0=A0=A0=A0 &lt;---------------=
--------------------------&gt; machin B</font></tt><br>
<tt><font color=3D"#2e3436">(running apache)=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0 (access web)</font></tt><br>
<br>
<tt><font color=3D"#2e3436">apache on 8080=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 mapped @</font></tt><br>
<tt><font color=3D"#2e3436">8083</font></tt><br>
<br>
<br>
<tt><font color=3D"#2e3436">I am using select to handle multiple request, b=
ut its not helping.</font></tt><br>
<tt><font color=3D"#2e3436">below is my code. </font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 rc =3D libssh2_init (0);</font></tt><=
br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if (rc !=3D 0) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 fprintf (stderr, &quot;li=
bssh2 initialization failed (%d)\n&quot;, rc);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 return 1;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 }</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 /* Connect to SSH server */ </font></=
tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 sock =3D socket(PF_INET, SOCK_STREAM,=
 IPPROTO_TCP);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 sin.sin_family =3D AF_INET;</font></t=
t><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if (INADDR_NONE =3D=3D (sin.sin_addr.=
s_addr =3D inet_addr(server_ip))) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 perror(&quot;inet_addr&qu=
ot;);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 return -1;</font></tt><br=
>
<tt><font color=3D"#2e3436">=A0=A0=A0 }</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 sin.sin_port =3D htons(22);</font></t=
t><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if (connect(sock, (struct sockaddr*)(=
&amp;sin),</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 s=
izeof(struct sockaddr_in)) !=3D 0) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 fprintf(stderr, &quot;fai=
led to connect!\n&quot;);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 return -1;</font></tt><br=
>
<tt><font color=3D"#2e3436">=A0=A0=A0 }</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 /* Create a session instance */ </fon=
t></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 session =3D libssh2_session_init();</=
font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if(!session) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 fprintf(stderr, &quot;Cou=
ld not initialize SSH session!\n&quot;);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 return -1;</font></tt><br=
>
<tt><font color=3D"#2e3436">=A0=A0=A0 }</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 /* ... start it up. This will trade w=
elcome banners, exchange keys,</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0 *=A0=A0=A0=A0=A0 * and setup crypt=
o, compression, and MAC layers</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0 *=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 */=
 </font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 rc =3D libssh2_session_startup(sessio=
n, sock);</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if(rc) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 fprintf(stderr, &quot;Err=
or when starting up SSH session: %d\n&quot;, rc);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 return -1;</font></tt><br=
>
<tt><font color=3D"#2e3436">=A0=A0=A0 }</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 /* At this point we havn&#39;t yet au=
thenticated.=A0 The first thing to do</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0 *=A0=A0=A0=A0=A0 * is check the ho=
stkey&#39;s fingerprint against our known hosts</font></tt><br>
<tt><font color=3D"#2e3436">Your app</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0 *=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 * =
may have it hard coded, may go to a file, may present</font></tt><br>
<tt><font color=3D"#2e3436">it to the</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0 *=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0 * user, that&#39;s your call</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0 *=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0 */ </font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 fingerprint =3D libssh2_hostkey_hash(=
session,</font></tt><br>
<tt><font color=3D"#2e3436">LIBSSH2_HOSTKEY_HASH_SHA1);</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 fprintf(stderr, &quot;Fingerprint: &q=
uot;);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 for(i =3D 0; i &lt; 20; i++)</font></=
tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 fprintf(stderr, &quot;%02=
X &quot;, (unsigned char)fingerprint[i]);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 fprintf(stderr, &quot;\n&quot;);</fon=
t></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 /* check what authentication methods =
are available */ </font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 userauthlist =3D libssh2_userauth_lis=
t(session, username,</font></tt><br>
<tt><font color=3D"#2e3436">strlen(username));</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 printf(&quot;Authentication methods: =
%s\n&quot;, userauthlist);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if (strstr(userauthlist, &quot;passwo=
rd&quot;))</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 auth |=3D AUTH_PASSWORD;<=
/font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if (strstr(userauthlist, &quot;public=
key&quot;))</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 auth |=3D AUTH_PUBLICKEY;=
</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 /* check for options */ </font></tt><=
br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if(argc &gt; 8) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 if ((auth &amp; AUTH_PASS=
WORD) &amp;&amp; !strcasecmp(argv[8], &quot;-p&quot;))</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 auth =3D AUTH=
_PASSWORD;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 if ((auth &amp; AUTH_PUBL=
ICKEY) &amp;&amp; !strcasecmp(argv[8], &quot;-k&quot;))</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 auth =3D AUTH=
_PUBLICKEY;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 }</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if (auth &amp; AUTH_PASSWORD) {</font=
></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 if (libssh2_userauth_pass=
word(session, username, password)) {</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 fprintf(stder=
r, &quot;Authentication by password failed.\n&quot;);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 goto shutdown=
;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 }</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 } else if (auth &amp; AUTH_PUBLICKEY)=
 {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 if (libssh2_userauth_publ=
ickey_fromfile(session, username,</font></tt><br>
<tt><font color=3D"#2e3436">keyfile1,</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0 keyfile2, password)) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 printf(&quot;=
\tAuthentication by public key failed!\n&quot;);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 goto shutdown=
;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 }</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 printf(&quot;\tAuthentica=
tion by public key succeeded.\n&quot;);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 } else {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 printf(&quot;No supported=
 authentication methods found!\n&quot;);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 goto shutdown;</font></tt=
><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 }</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 listensock =3D socket(PF_INET, SOCK_S=
TREAM, IPPROTO_TCP);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 sin.sin_family =3D AF_INET;</font></t=
t><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 sin.sin_port =3D htons(local_listenpo=
rt);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if (INADDR_NONE =3D=3D (sin.sin_addr.=
s_addr =3D</font></tt><br>
<tt><font color=3D"#2e3436">inet_addr(local_listenip))) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 perror(&quot;inet_addr&qu=
ot;);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 goto shutdown;</font></tt=
><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 }</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 sockopt =3D 1;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 setsockopt(listensock, SOL_SOCKET, SO=
_REUSEADDR, &amp;sockopt,</font></tt><br>
<tt><font color=3D"#2e3436">sizeof(sockopt));</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 sinlen=3Dsizeof(sin);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if (-1 =3D=3D bind(listensock, (struc=
t sockaddr *)&amp;sin, sinlen)) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 perror(&quot;bind - 1 &qu=
ot;);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 goto shutdown;</font></tt=
><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 }</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if (-1 =3D=3D listen(listensock, 2)) =
{</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 perror(&quot;listen&quot;=
);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 goto shutdown;</font></tt=
><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 }</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 printf(&quot;Waiting for TCP connecti=
on on %s:%d...\n&quot;,</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 inet_ntoa(sin=
.sin_addr), ntohs(sin.sin_port));</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 forwardsock =3D accept(listensock, (s=
truct sockaddr *)&amp;sin, &amp;sinlen);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if (-1 =3D=3D forwardsock) {</font></=
tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 perror(&quot;accept&quot;=
);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 goto shutdown;</font></tt=
><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 }</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 shost =3D inet_ntoa(sin.sin_addr);</f=
ont></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 sport =3D ntohs(sin.sin_port);</font>=
</tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 printf(&quot;Forwarding connection fr=
om %s:%d here to remote %s:%d\n&quot;,</font></tt><br>
<tt><font color=3D"#2e3436">shost,</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 sport, remote=
_desthost, remote_destport);</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 channel =3D libssh2_channel_direct_tc=
pip_ex(session, remote_desthost,</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 remote_destpo=
rt, shost, sport);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if (!channel) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 fprintf(stderr, &quot;Cou=
ld not open the direct-tcpip channel!\n&quot;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 &=
quot;(Note that this can be a problem at the server!&quot;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 &=
quot; Please review the server logs.)\n&quot;);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 goto shutdown;</font></tt=
><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 }</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 /* Must use non-blocking IO hereafter=
 due to the current libssh2 API</font></tt><br>
<tt><font color=3D"#2e3436">*/ </font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 libssh2_session_set_blocking(session,=
 0);</font></tt><br>
<br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 while (1) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 FD_ZERO(&amp;fds);</font>=
</tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 FD_SET(forwardsock, &amp;=
fds);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 tv.tv_sec =3D 0;</font></=
tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 tv.tv_usec =3D 100000;</f=
ont></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 rc =3D select(forwardsock=
 + 1, &amp;fds, NULL, NULL, &amp;tv);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 if (-1 =3D=3D rc) {</font=
></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 perror(&quot;=
select&quot;);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 goto shutdown=
;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 }</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 if (rc &amp;&amp; FD_ISSE=
T(forwardsock, &amp;fds)) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 len =3D recv(=
forwardsock, buf, sizeof(buf), 0);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (len &lt; =
0) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 p=
error(&quot;read&quot;);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 g=
oto shutdown;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 } else if (0 =
=3D=3D len) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 p=
rintf(&quot;The client at %s:%d disconnected!\n&quot;, shost,</font></tt><b=
r>
<tt><font color=3D"#2e3436">sport);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 g=
oto shutdown;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }</font></tt>=
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 wr =3D 0;</fo=
nt></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 do {</font></=
tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 i=
 =3D libssh2_channel_write(channel, buf, len);</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 i=
f (i &lt; 0) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0 fprintf(stderr, &quot;libssh2_channel_write: %d\n&quot;, i);</=
font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0 goto shutdown;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=
</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 w=
r +=3D i;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 } while(i &gt=
; 0 &amp;&amp; wr &lt; len);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 }</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 while (1) {</font></tt><b=
r>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 len =3D libss=
h2_channel_read(channel, buf, sizeof(buf));</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (LIBSSH2_E=
RROR_EAGAIN =3D=3D len)</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 b=
reak;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 else if (len =
&lt; 0) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 f=
printf(stderr, &quot;libssh2_channel_read: %d&quot;, (int)len);</font></tt>=
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 g=
oto shutdown;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }</font></tt>=
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 wr =3D 0;</fo=
nt></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 while (wr &lt=
; len) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 i=
 =3D send(forwardsock, buf + wr, len - wr, 0);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 i=
f (i &lt;=3D 0) {</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0 perror(&quot;write&quot;);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0 goto shutdown;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }=
</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 w=
r +=3D i;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }</font></tt>=
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (libssh2_c=
hannel_eof(channel)) {</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 p=
rintf(&quot;The server at %s:%d disconnected!\n&quot;,</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0 remote_desthost, remote_destport);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 g=
oto shutdown;</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 }</font></tt>=
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 }</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 }</font></tt><br>
<br>
<tt><font color=3D"#2e3436">shutdown:</font></tt><br>
<tt><font color=3D"#2e3436">#ifdef WIN32</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 closesocket(forwardsock);</font></tt>=
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 closesocket(listensock);</font></tt><=
br>
<tt><font color=3D"#2e3436">#else</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 close(forwardsock);</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 close(listensock);</font></tt><br>
<tt><font color=3D"#2e3436">#endif</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 if (channel)</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0=A0=A0=A0=A0 libssh2_channel_free(chan=
nel);</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 libssh2_session_disconnect(session, &=
quot;Client disconnecting</font></tt><br>
<tt><font color=3D"#2e3436">normally&quot;);</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 libssh2_session_free(session);</font>=
</tt><br>
<br>
<br>
<tt><font color=3D"#2e3436">#ifdef WIN32</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 closesocket(sock);</font></tt><br>
<tt><font color=3D"#2e3436">#else</font></tt><br>
<tt><font color=3D"#2e3436">=A0=A0=A0 close(sock);</font></tt><br>
<tt><font color=3D"#2e3436">#endif</font></tt><br>
<br>
<tt><font color=3D"#2e3436">=A0=A0=A0 libssh2_exit();</font></tt><br>
<br>
<br>
<tt><font color=3D"#2e3436">Please let me know if something is wrong with t=
his code.</font></tt><br>
<br>
<tt><font color=3D"#2e3436">Thanks,</font></tt><br>
<tt><font color=3D"#2e3436">Gaurav</font></tt><br>
<br>
<br>
<br>
<br>

--20cf30050e68cdba3204b8092d4d--

--===============1578641569==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--===============1578641569==--

From libssh2-devel-bounces@cool.haxx.se  Sat Feb  4 13:28:15 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q14CRmxJ006770;
	Sat, 4 Feb 2012 13:28:10 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q14CRlwC006761
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Sat, 4 Feb 2012 13:27:47 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q14CRkQI006758
	for <libssh2-devel@cool.haxx.se>; Sat, 4 Feb 2012 13:27:46 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Sat, 4 Feb 2012 13:27:46 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: SFTP issues
In-Reply-To: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
Message-ID: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Thu, 2 Feb 2012, Alexander Lamaison wrote:

> Daniel, liuzl: we went through this process in September and you guys made 
> some fixes which I though had solved it.  I've changed both the Windows and 
> Linux machines I'm testing on since then so I don't know if that's why the 
> problems are back.  I don't understand enough about the SFTP layer to 
> suggest a fix but, as usual, I'll happily test any patches.

I too was under the impression we improved things, and I know a lot of people 
have used libssh2 fine since then too so the problems you see might not 
trigger that often in the real world.

I haven't yet investigated what you report here, but I'll try to set aside 
some time  to dig into the details again soon and see if I can produce some 
patches to try out.

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Sat Feb  4 14:09:49 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q14D9bCI005830;
	Sat, 4 Feb 2012 14:09:49 +0100
Received: from mail0.avcosystems.co.uk (mail0.avcosystems.co.uk
	[195.224.236.86])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q14D9aMV005758
	(version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Sat, 4 Feb 2012 14:09:36 +0100
Received: from lexx.avco ([192.168.0.1] helo=lyta)
	by mail0.avcosystems.co.uk with esmtp (Exim 4.69 #1 (Debian))
	(envelope-from <mts-filtered@avcosystems.co.uk>) id 1RtfMj-0006AU-L7
	for <libssh2-devel@cool.haxx.se>; Sat, 04 Feb 2012 13:09:17 +0000
From: "Mark Smith" <mts-filtered@avcosystems.co.uk>
To: "'libssh2 development'" <libssh2-devel@cool.haxx.se>
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
Subject: RE: SFTP issues
Date: Sat, 4 Feb 2012 13:09:31 -0000
Keywords: Not filed
Message-ID: <DD907D3796DB4A32A61358EB6E5C38AF@internal.avcosystems.com>
MIME-Version: 1.0
X-Mailer: Microsoft Office Outlook 11
x-mimeole: Produced By Microsoft MimeOLE V6.00.2900.6157
Thread-Index: AczjOHeIXL0ZzU5URfmBIXCH1IHAvAAA57ZQ
In-Reply-To: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
X-AVCO-Scan-Signature: 993d51beb024916ef0b29a243affd9c9
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

I've encountered a similar problem on a 64bit Win2008 server whereby the
buffer size makes a difference as to whether a read returns zero incorrectly
or not.

I'll try to put together a native example on Monday as all I have right now
is my wrapped .NET example: read from an empty file with a buffer of 27000,
which returns zero correctly, then on the same SFTP connection read from a
57 byte file with the same buffer and I always get zero back.  It doesn't
seem to matter if there's no delay between the two reads or if I allow a
minute to pass, it still behaves the same.

If I change the buffer size to 26999 and I get 57 back correctly.  If I run
this exact same test on a 32bit WinXP machine it always returns correctly
irrespective of buffer size.  I've tried testing against different SFTP
servers and machines (specifically freeSSHd on the local Win2k8 machine,
freeSSHd on the WinXP machine and debian's openssh) and the test behaves the
same against all of them.

This is completely reproducible for me and occurs every single time I try.
Let me know if you'd like me to try out any patches or need trace or debug
information and I'll see what I can do.

-----Original Message-----
From: libssh2-devel-bounces@cool.haxx.se
[mailto:libssh2-devel-bounces@cool.haxx.se] On Behalf Of Daniel Stenberg
Sent: 04 February 2012 12:28
To: libssh2 development
Subject: Re: SFTP issues

On Thu, 2 Feb 2012, Alexander Lamaison wrote:

> Daniel, liuzl: we went through this process in September and you guys made

> some fixes which I though had solved it.  I've changed both the Windows
and 
> Linux machines I'm testing on since then so I don't know if that's why the

> problems are back.  I don't understand enough about the SFTP layer to 
> suggest a fix but, as usual, I'll happily test any patches.

I too was under the impression we improved things, and I know a lot of
people 
have used libssh2 fine since then too so the problems you see might not 
trigger that often in the real world.

I haven't yet investigated what you report here, but I'll try to set aside 
some time  to dig into the details again soon and see if I can produce some 
patches to try out.

-- 

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

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

From libssh2-devel-bounces@cool.haxx.se  Sat Feb  4 18:09:56 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q14H9T9P013982;
	Sat, 4 Feb 2012 18:09:51 +0100
Received: from mail-qw0-f47.google.com (mail-qw0-f47.google.com
	[209.85.216.47])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q14H9Rp0013914
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Sat, 4 Feb 2012 18:09:27 +0100
Received: by qadz30 with SMTP id z30so1449669qad.20
	for <libssh2-devel@cool.haxx.se>; Sat, 04 Feb 2012 09:09:21 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type
	:content-transfer-encoding;
	bh=Z4KmNwlFhmNrqHmTuC8KIHGNy2iIYrFzA+cBMNQS2Js=;
	b=oOB8l1pBYsRZOxVHpZaJwtlroa595oIkGtRcURS3KxAxRIIVTUCh5SGjJFspX7jaCe
	nXm4XZTrXW/lu5daEdv9PLA3ebzw6VQA2/En84Qpwg71oIEAdoJSwuJC/Yj+wzaj6Jkk
	2T8eypR8IHbTa+hbstB7L/htwtGQ/wFhUjT7o=
MIME-Version: 1.0
Received: by 10.224.105.203 with SMTP id u11mr13801277qao.77.1328375361187;
	Sat, 04 Feb 2012 09:09:21 -0800 (PST)
Received: by 10.229.144.211 with HTTP; Sat, 4 Feb 2012 09:09:21 -0800 (PST)
In-Reply-To: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
Date: Sat, 4 Feb 2012 17:09:21 +0000
X-Google-Sender-Auth: 8jQh_BWBjDzXAVQVcRLguq1E-Qk
Message-ID: <CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
Subject: Re: SFTP issues
From: Alexander Lamaison <swish@lammy.co.uk>
To: libssh2 development <libssh2-devel@cool.haxx.se>
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id
	q14H9Rp0013914
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-1"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id q14H9T9P013982

On 4 February 2012 12:27, Daniel Stenberg <daniel@haxx.se> wrote:

> I haven't yet investigated what you report here, but I'll try to set aside
> some time  to dig into the details again soon and see if I can produce some
> patches to try out.

I think I've identified a pattern to the failures and a potential
cause.  If you find a moment to chat on IRC I could use some help with
a couple of questions.

Alex

--
Swish - Easy SFTP for Windows Explorer (http://www.swish-sftp.org)

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

From libssh2-devel-bounces@cool.haxx.se  Sun Feb  5 11:36:38 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q15AaBOT029756;
	Sun, 5 Feb 2012 11:36:32 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q15Aa9km029746
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Sun, 5 Feb 2012 11:36:09 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q15Aa9ho029741
	for <libssh2-devel@cool.haxx.se>; Sun, 5 Feb 2012 11:36:09 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Sun, 5 Feb 2012 11:36:09 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: SFTP issues
In-Reply-To: <CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
Message-ID: <alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Sat, 4 Feb 2012, Alexander Lamaison wrote:

> I think I've identified a pattern to the failures and a potential cause. 
> If you find a moment to chat on IRC I could use some help with a couple of 
> questions.

Cool, I'm usually most reliably around on IRC from 22 CET and onwards most 
evenings.

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Tue Feb  7 14:33:05 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17DWg5x029660;
	Tue, 7 Feb 2012 14:33:01 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17DWee4029638
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Tue, 7 Feb 2012 14:32:40 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q17DWeqA029634
	for <libssh2-devel@cool.haxx.se>; Tue, 7 Feb 2012 14:32:40 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Tue, 7 Feb 2012 14:32:40 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: SFTP issues
In-Reply-To: <alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
Message-ID: <alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED;
	BOUNDARY="1129329158-1072963663-1328621316=:14182"
Content-ID: <alpine.DEB.2.00.1202071428400.14182@tvnag.unkk.fr>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

--1129329158-1072963663-1328621316=:14182
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; format=flowed
Content-ID: <alpine.DEB.2.00.1202071428401.14182@tvnag.unkk.fr>

On Sun, 5 Feb 2012, Daniel Stenberg wrote:

>> I think I've identified a pattern to the failures and a potential cause. If 
>> you find a moment to chat on IRC I could use some help with a couple of 
>> questions.

If there are others interested in this work, me and Alexander had a go at his 
problem yesterday and together we managed to identify the problem and come up 
with a fix for it. The attached 0001*patch is that fix.

I identified the same basic flaw in the sftp_write() code path and wrote up a 
patch for that as well, as can be seen in the attached 0002*patch.

I'm interested in feedback on both how they work in reality but also on the 
actual technical subtleties.

I am especially aware that this logic needs better comments/documentation to 
make us less likely to re-introduce similar problems again in the future!

-- 

  / daniel.haxx.se
--1129329158-1072963663-1328621316=:14182
Content-Type: TEXT/X-DIFF; NAME=0001-sftp_read-avoid-data-and-EAGAIN.patch
Content-Transfer-Encoding: BASE64
Content-ID: <alpine.DEB.2.00.1202071428360.14182@tvnag.unkk.fr>
Content-Description: 
Content-Disposition: ATTACHMENT; FILENAME=0001-sftp_read-avoid-data-and-EAGAIN.patch

RnJvbSA0NDZjNmQzZmRmY2NiNmNmMzEwZjAzMTRiMTBmMDM1NjljNTE5ZGEz
IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQ0KRnJvbTogRGFuaWVsIFN0ZW5i
ZXJnIDxkYW5pZWxAaGF4eC5zZT4NCkRhdGU6IE1vbiwgNiBGZWIgMjAxMiAy
MzoyNzoxMiArMDEwMA0KU3ViamVjdDogW1BBVENIIDEvMl0gc2Z0cF9yZWFk
OiBhdm9pZCBkYXRhICphbmQqIEVBR0FJTg0KDQpXaGVuZXZlciB3ZSBoYXZl
IGRhdGEgYW5kIGlzIGFib3V0IHRvIGNhbGwgYSBmdW5jdGlvbiB0aGF0ICpN
QVkqIHJldHVybg0KRUFHQUlOIHdlIG11c3QgcmV0dXJuIHRoZSBkYXRhIG5v
dyBhbmQgd2FpdCB0byBnZXQgY2FsbGVkIGFnYWluLiBPdXIgQVBJDQpvbmx5
IGFsbG93cyBkYXRhICpvciogRUFHQUlOIGFuZCB3ZSBtdXN0IG5ldmVyIHRy
eSB0byBnZXQgYm90aC4NCi0tLQ0KIHNyYy9zZnRwLmMgfCAgIDQ4ICsrKysr
KysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K
IDEgZmlsZXMgY2hhbmdlZCwgMjcgaW5zZXJ0aW9ucygrKSwgMjEgZGVsZXRp
b25zKC0pDQoNCmRpZmYgLS1naXQgYS9zcmMvc2Z0cC5jIGIvc3JjL3NmdHAu
Yw0KaW5kZXggNDhkYTlmMi4uMGExY2Y2MSAxMDA2NDQNCi0tLSBhL3NyYy9z
ZnRwLmMNCisrKyBiL3NyYy9zZnRwLmMNCkBAIC0xMDg1LDcgKzEwODUsNiBA
QCBzdGF0aWMgc3NpemVfdCBzZnRwX3JlYWQoTElCU1NIMl9TRlRQX0hBTkRM
RSAqIGhhbmRsZSwgY2hhciAqYnVmZmVyLA0KICAgICBzdHJ1Y3Qgc2Z0cF9w
aXBlbGluZV9jaHVuayAqY2h1bms7DQogICAgIHN0cnVjdCBzZnRwX3BpcGVs
aW5lX2NodW5rICpuZXh0Ow0KICAgICBzc2l6ZV90IHJjOw0KLSAgICBzaXpl
X3QgZWFnYWluID0gMDsNCiAgICAgc2l6ZV90IHRvdGFsX3JlYWQgPSAwOw0K
ICAgICBzdHJ1Y3QgX2xpYnNzaDJfc2Z0cF9oYW5kbGVfZmlsZV9kYXRhICpm
aWxlcCA9DQogICAgICAgICAmaGFuZGxlLT51LmZpbGU7DQpAQCAtMTExMSwx
MSArMTExMCwxMiBAQCBzdGF0aWMgc3NpemVfdCBzZnRwX3JlYWQoTElCU1NI
Ml9TRlRQX0hBTkRMRSAqIGhhbmRsZSwgY2hhciAqYnVmZmVyLA0KICAgICAg
ICAgZmlsZXAtPmRhdGEgPSBOVUxMOw0KICAgICB9DQogDQotICAgIC8qIGlm
IHdlIHByZXZpb3VzbHkgYWJvcnRlZCBhIGNoYW5uZWxfd3JpdGUgZHVlIHRv
IEVBR0FJTiwgd2UgbXVzdA0KLSAgICAgICBjb250aW51ZSB0aGF0IHdyaXRp
bmcgc28gdGhhdCB3ZSBkb24ndCByaXNrIHRyeWluZyB0byBzZW5kIGFub3Ro
ZXINCi0gICAgICAgY2hhbm5lbF93cml0ZSBoZXJlIHRvIGVubGFyZ2UgdGhl
IHJlY2VpdmUgd2luZG93ICovDQorICAgIC8qIGlmIHdlIHByZXZpb3VzbHkg
YWJvcnRlZCBhIHNmdHBfcmVhZCBkdWUgdG8gRUFHQUlOLCB3ZSBtdXN0IGNv
bnRpbnVlIGF0DQorICAgICAgIHRoZSBzYW1lIHNwb3QgdG8gY29udGludWUg
dGhlIHByZXZpb3VzbHkgYWJvcnRlZCBvcGVyYXRpb24gKi8NCiAgICAgaWYo
c2Z0cC0+cmVhZF9zdGF0ZSA9PSBsaWJzc2gyX05CX3N0YXRlX3NlbnQpDQog
ICAgICAgICBnb3RvIHNlbmRfcmVhZF9yZXF1ZXN0czsNCisgICAgZWxzZSBp
ZihzZnRwLT5yZWFkX3N0YXRlID09IGxpYnNzaDJfTkJfc3RhdGVfc2VudDIp
DQorICAgICAgICBnb3RvIHJlYWRfYWNrczsNCiANCiAgICAgLyogV2UgYWxs
b3cgYSBudW1iZXIgb2YgYnl0ZXMgYmVpbmcgcmVxdWVzdGVkIGF0IGFueSBn
aXZlbiB0aW1lIHdpdGhvdXQNCiAgICAgICAgaGF2aW5nIGJlZW4gYWNrZWQg
LSB1bnRpbCB3ZSByZWFjaCBFT0YuICovDQpAQCAtMTIxOCwxNiArMTIxOCwx
NyBAQCBzdGF0aWMgc3NpemVfdCBzZnRwX3JlYWQoTElCU1NIMl9TRlRQX0hB
TkRMRSAqIGhhbmRsZSwgY2hhciAqYnVmZmVyLA0KIA0KICAgICB3aGlsZShj
aHVuaykgew0KICAgICAgICAgaWYoY2h1bmstPmxlZnR0b3NlbmQpIHsNCisg
ICAgICAgICAgICBpZih0b3RhbF9yZWFkKQ0KKyAgICAgICAgICAgICAgICAv
KiBzaW5jZSB3ZSByaXNrIGdldHRpbmcgRUFHQUlOIGJlbG93LCB3ZSByZXR1
cm4gaGVyZSBpZiB0aGVyZQ0KKyAgICAgICAgICAgICAgICAgICBpcyBkYXRh
IGF2YWlsYWJsZSAqLw0KKyAgICAgICAgICAgICAgICByZXR1cm4gdG90YWxf
cmVhZDsNCisNCiAgICAgICAgICAgICByYyA9IF9saWJzc2gyX2NoYW5uZWxf
d3JpdGUoY2hhbm5lbCwgMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgJmNodW5rLT5wYWNrZXRbY2h1bmstPnNlbnRdLA0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVu
ay0+bGVmdHRvc2VuZCk7DQogICAgICAgICAgICAgaWYocmMgPCAwKSB7DQot
ICAgICAgICAgICAgICAgIGlmKHJjICE9IExJQlNTSDJfRVJST1JfRUFHQUlO
KQ0KLSAgICAgICAgICAgICAgICAgICAgLyogZXJyb3IgKi8NCi0gICAgICAg
ICAgICAgICAgICAgIHJldHVybiByYzsNCi0gICAgICAgICAgICAgICAgZWFn
YWluKys7DQogICAgICAgICAgICAgICAgIHNmdHAtPnJlYWRfc3RhdGUgPSBs
aWJzc2gyX05CX3N0YXRlX3NlbnQ7DQotICAgICAgICAgICAgICAgIGJyZWFr
Ow0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7DQogICAgICAgICAgICAg
fQ0KIA0KICAgICAgICAgICAgIC8qIHJlbWVtYmVyIHdoZXJlIHRvIGNvbnRp
bnVlIHNlbmRpbmcgdGhlIG5leHQgdGltZSAqLw0KQEAgLTEyNDMsNiArMTI0
NCwxMCBAQCBzdGF0aWMgc3NpemVfdCBzZnRwX3JlYWQoTElCU1NIMl9TRlRQ
X0hBTkRMRSAqIGhhbmRsZSwgY2hhciAqYnVmZmVyLA0KICAgICAgICAgY2h1
bmsgPSBfbGlic3NoMl9saXN0X25leHQoJmNodW5rLT5ub2RlKTsNCiAgICAg
fQ0KIA0KKyAgcmVhZF9hY2tzOg0KKw0KKyAgICBzZnRwLT5yZWFkX3N0YXRl
ID0gbGlic3NoMl9OQl9zdGF0ZV9pZGxlOw0KKw0KICAgICAvKg0KICAgICAg
KiBDb3VudCBhbGwgQUNLZWQgcGFja2V0cyBhbmQgYWN0IG9uIHRoZSBjb250
ZW50cyBvZiB0aGVtLg0KICAgICAgKi8NCkBAIC0xMjYxLDE1ICsxMjY2LDE3
IEBAIHN0YXRpYyBzc2l6ZV90IHNmdHBfcmVhZChMSUJTU0gyX1NGVFBfSEFO
RExFICogaGFuZGxlLCBjaGFyICpidWZmZXIsDQogICAgICAgICAgICAgICAg
YW4gQUNLIGZvciBpdCBqdXN0IHlldCAqLw0KICAgICAgICAgICAgIGJyZWFr
Ow0KIA0KKyAgICAgICAgaWYodG90YWxfcmVhZCkNCisgICAgICAgICAgICAv
KiBzaW5jZSB3ZSByaXNrIGdldHRpbmcgRUFHQUlOIGJlbG93LCB3ZSByZXR1
cm4gaGVyZSBpZiB0aGVyZQ0KKyAgICAgICAgICAgICAgIGlzIGRhdGEgYXZh
aWxhYmxlICovDQorICAgICAgICAgICAgcmV0dXJuIHRvdGFsX3JlYWQ7DQor
DQogICAgICAgICByYyA9IHNmdHBfcGFja2V0X3JlcXVpcmV2KHNmdHAsIDIs
IHJlYWRfcmVzcG9uc2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjaHVuay0+cmVxdWVzdF9pZCwgJmRhdGEsICZkYXRhX2xlbik7
DQotICAgICAgICBpZiAocmMgPT0gTElCU1NIMl9FUlJPUl9FQUdBSU4pIHsN
Ci0gICAgICAgICAgICBlYWdhaW4rKzsNCi0gICAgICAgICAgICBicmVhazsN
CisgICAgICAgIGlmIChyYyA8IDApIHsNCisgICAgICAgICAgICBzZnRwLT5y
ZWFkX3N0YXRlID0gbGlic3NoMl9OQl9zdGF0ZV9zZW50MjsNCisgICAgICAg
ICAgICByZXR1cm4gcmM7DQogICAgICAgICB9DQotICAgICAgICBlbHNlIGlm
IChyYykNCi0gICAgICAgICAgICByZXR1cm4gX2xpYnNzaDJfZXJyb3Ioc2Vz
c2lvbiwgcmMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJFcnJvciB3YWl0aW5nIGZvciBGWFBfUkVBRCBBQ0siKTsNCiANCiAgICAg
ICAgIC8qDQogICAgICAgICAgKiBXZSBnZXQgREFUQSBvciBTVEFUVVMgYmFj
ay4gU1RBVFVTIGNhbiBiZSBlcnJvciwgb3IgaXQgaXMgRlhfRU9GDQpAQCAt
MTM1MywxMiArMTM2MCwxMSBAQCBzdGF0aWMgc3NpemVfdCBzZnRwX3JlYWQo
TElCU1NIMl9TRlRQX0hBTkRMRSAqIGhhbmRsZSwgY2hhciAqYnVmZmVyLA0K
ICAgICAgICAgY2h1bmsgPSBuZXh0Ow0KICAgICB9DQogDQotICAgIGlmKHRv
dGFsX3JlYWQpDQotICAgICAgICByZXR1cm4gdG90YWxfcmVhZDsNCi0gICAg
ZWxzZSBpZihlYWdhaW4pDQotICAgICAgICByZXR1cm4gX2xpYnNzaDJfZXJy
b3Ioc2Vzc2lvbiwgTElCU1NIMl9FUlJPUl9FQUdBSU4sDQotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIldvdWxkIGJsb2NrIHNmdHBfcmVhZCIp
Ow0KLSAgICByZXR1cm4gMDsNCisgICAgaWYoISB0b3RhbF9yZWFkKSB7DQor
ICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1PT1xuIik7DQorICAgIH0NCisN
CisgICAgcmV0dXJuIHRvdGFsX3JlYWQ7DQogfQ0KIA0KIC8qIGxpYnNzaDJf
c2Z0cF9yZWFkDQotLSANCjEuNy45DQoNCg==

--1129329158-1072963663-1328621316=:14182
Content-Type: TEXT/X-DIFF; NAME=0002-sftp_write-cannot-return-acked-data-and-EAGAIN.patch
Content-Transfer-Encoding: BASE64
Content-ID: <alpine.DEB.2.00.1202071428361.14182@tvnag.unkk.fr>
Content-Description: 
Content-Disposition: ATTACHMENT; FILENAME=0002-sftp_write-cannot-return-acked-data-and-EAGAIN.patch

RnJvbSBiODlkY2Y0ZDkyZDk4OGZlOWQ4NDg0ZjBlZWI2YzFmZTNiZmQ1YTJj
IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQ0KRnJvbTogRGFuaWVsIFN0ZW5i
ZXJnIDxkYW5pZWxAaGF4eC5zZT4NCkRhdGU6IFR1ZSwgNyBGZWIgMjAxMiAw
MDozNTo1MSArMDEwMA0KU3ViamVjdDogW1BBVENIIDIvMl0gc2Z0cF93cml0
ZTogY2Fubm90IHJldHVybiBhY2tlZCBkYXRhICphbmQqIEVBR0FJTg0KDQpX
aGVuZXZlciB3ZSBoYXZlIGFja2VkIGRhdGEgYW5kIGlzIGFib3V0IHRvIGNh
bGwgYSBmdW5jdGlvbiB0aGF0ICpNQVkqDQpyZXR1cm4gRUFHQUlOIHdlIG11
c3QgcmV0dXJuIHRoZSBudW1iZXIgbm93IGFuZCB3YWl0IHRvIGdldCBjYWxs
ZWQNCmFnYWluLiBPdXIgQVBJIG9ubHkgYWxsb3dzIGRhdGEgKm9yKiBFQUdB
SU4gYW5kIHdlIG11c3QgbmV2ZXIgdHJ5IHRvIGdldA0KYm90aC4NCi0tLQ0K
IHNyYy9zZnRwLmMgfCAgIDM3ICsrKysrKysrKysrKysrKysrKysrLS0tLS0t
LS0tLS0tLS0tLS0NCiAxIGZpbGVzIGNoYW5nZWQsIDIwIGluc2VydGlvbnMo
KyksIDE3IGRlbGV0aW9ucygtKQ0KDQpkaWZmIC0tZ2l0IGEvc3JjL3NmdHAu
YyBiL3NyYy9zZnRwLmMNCmluZGV4IDBhMWNmNjEuLjQzMDBkMmUgMTAwNjQ0
DQotLS0gYS9zcmMvc2Z0cC5jDQorKysgYi9zcmMvc2Z0cC5jDQpAQCAtMTYx
Nyw3ICsxNjE3LDYgQEAgc3RhdGljIHNzaXplX3Qgc2Z0cF93cml0ZShMSUJT
U0gyX1NGVFBfSEFORExFICpoYW5kbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwN
CiAgICAgc3RydWN0IHNmdHBfcGlwZWxpbmVfY2h1bmsgKm5leHQ7DQogICAg
IHNpemVfdCBhY2tlZCA9IDA7DQogICAgIHNpemVfdCBvcmdfY291bnQgPSBj
b3VudDsNCi0gICAgc2l6ZV90IGVhZ2FpbiA9IDA7DQogDQogICAgIC8qIE51
bWJlciBvZiBieXRlcyBzZW50IG9mZiB0aGF0IGhhdmVuJ3QgYmVlbiBhY2tl
ZCBhbmQgdGhlcmVmb3Igd2Ugd2lsbA0KICAgICAgICBnZXQgcGFzc2VkIGlu
IGhlcmUgYWdhaW4uDQpAQCAtMTYzOCw2ICsxNjM3LDEwIEBAIHN0YXRpYyBz
c2l6ZV90IHNmdHBfd3JpdGUoTElCU1NIMl9TRlRQX0hBTkRMRSAqaGFuZGxl
LCBjb25zdCBjaGFyICpidWZmZXIsDQogICAgICAgICAvKiB0aGVyZSBpcyBt
b3JlIGRhdGEgYWxyZWFkeSBmaW5lIHRoYW4gd2hhdCB3ZSBnb3QgaW4gdGhp
cyBjYWxsICovDQogICAgICAgICBjb3VudCA9IDA7DQogDQorICAgIGlmKHNm
dHAtPndyaXRlX3N0YXRlID09IGxpYnNzaDJfTkJfc3RhdGVfc2VudCkNCisg
ICAgICAgIGdvdG8gc2Z0cF93cml0ZV9meHBfc3RhdHVzOw0KKw0KKyAgICBz
ZnRwLT53cml0ZV9zdGF0ZSA9IGxpYnNzaDJfTkJfc3RhdGVfaWRsZTsNCiAg
ICAgd2hpbGUoY291bnQpIHsNCiAgICAgICAgIC8qIFRPRE86IFBvc3NpYmx5
IHRoaXMgc2hvdWxkIGhhdmUgc29tZSBsb2dpYyB0byBwcmV2ZW50IGEgdmVy
eSB2ZXJ5DQogICAgICAgICAgICBzbWFsbCBmcmFjdGlvbiB0byBiZSBsZWZ0
IGJ1dCBsZXRzIGlnbm9yZSB0aGF0IGZvciBub3cgKi8NCkBAIC0xNjg3LDEz
ICsxNjkwLDkgQEAgc3RhdGljIHNzaXplX3Qgc2Z0cF93cml0ZShMSUJTU0gy
X1NGVFBfSEFORExFICpoYW5kbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwNCiAg
ICAgICAgICAgICByYyA9IF9saWJzc2gyX2NoYW5uZWxfd3JpdGUoY2hhbm5l
bCwgMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgJmNodW5rLT5wYWNrZXRbY2h1bmstPnNlbnRdLA0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuay0+bGVmdHRvc2Vu
ZCk7DQotICAgICAgICAgICAgaWYocmMgPCAwKSB7DQotICAgICAgICAgICAg
ICAgIGlmKHJjICE9IExJQlNTSDJfRVJST1JfRUFHQUlOKQ0KLSAgICAgICAg
ICAgICAgICAgICAgLyogZXJyb3IgKi8NCi0gICAgICAgICAgICAgICAgICAg
IHJldHVybiByYzsNCi0gICAgICAgICAgICAgICAgZWFnYWluKys7DQotICAg
ICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCisgICAgICAg
ICAgICBpZihyYyA8IDApDQorICAgICAgICAgICAgICAgIC8qIHJlbWFpbiBp
biBpZGxlIHN0YXRlICovDQorICAgICAgICAgICAgICAgIHJldHVybiByYzsN
CiANCiAgICAgICAgICAgICAvKiByZW1lbWJlciB3aGVyZSB0byBjb250aW51
ZSBzZW5kaW5nIHRoZSBuZXh0IHRpbWUgKi8NCiAgICAgICAgICAgICBjaHVu
ay0+bGVmdHRvc2VuZCAtPSByYzsNCkBAIC0xNzA4LDYgKzE3MDcsOSBAQCBz
dGF0aWMgc3NpemVfdCBzZnRwX3dyaXRlKExJQlNTSDJfU0ZUUF9IQU5ETEUg
KmhhbmRsZSwgY29uc3QgY2hhciAqYnVmZmVyLA0KICAgICAgICAgY2h1bmsg
PSBfbGlic3NoMl9saXN0X25leHQoJmNodW5rLT5ub2RlKTsNCiAgICAgfQ0K
IA0KKyAgc2Z0cF93cml0ZV9meHBfc3RhdHVzOg0KKw0KKyAgICBzZnRwLT53
cml0ZV9zdGF0ZSA9IGxpYnNzaDJfTkJfc3RhdGVfaWRsZTsNCiAgICAgLyoN
CiAgICAgICogQ291bnQgYWxsIEFDS2VkIHBhY2tldHMNCiAgICAgICovDQpA
QCAtMTcxOSwxNiArMTcyMSwxOSBAQCBzdGF0aWMgc3NpemVfdCBzZnRwX3dy
aXRlKExJQlNTSDJfU0ZUUF9IQU5ETEUgKmhhbmRsZSwgY29uc3QgY2hhciAq
YnVmZmVyLA0KICAgICAgICAgICAgICAgIGFuIEFDSyBmb3IgaXQganVzdCB5
ZXQgKi8NCiAgICAgICAgICAgICBicmVhazsNCiANCisgICAgICAgIGVsc2Ug
aWYoYWNrZWQpDQorICAgICAgICAgICAgLyogaWYgd2UgaGF2ZSBzZW50IGRh
dGEgdGhhdCBpcyBhY2tlZCwgd2UgbXVzdCByZXR1cm4gdGhhdCBpbmZvDQor
ICAgICAgICAgICAgICAgYmVmb3JlIHdlIGNhbGwgYSBmdW5jdGlvbiB0aGF0
IG1pZ2h0IHJldHVybiBFQUdBSU4gKi8NCisgICAgICAgICAgICBicmVhazsN
CisNCiAgICAgICAgIC8qIHdlIGNoZWNrIHRoZSBwYWNrZXRzIGluIG9yZGVy
ICovDQogICAgICAgICByYyA9IHNmdHBfcGFja2V0X3JlcXVpcmUoc2Z0cCwg
U1NIX0ZYUF9TVEFUVVMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY2h1bmstPnJlcXVlc3RfaWQsICZkYXRhLCAmZGF0YV9sZW4pOw0K
LSAgICAgICAgaWYgKHJjID09IExJQlNTSDJfRVJST1JfRUFHQUlOKSB7DQot
ICAgICAgICAgICAgZWFnYWluKys7DQotICAgICAgICAgICAgYnJlYWs7DQot
ICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChyYykgew0KLSAgICAgICAg
ICAgIHJldHVybiBfbGlic3NoMl9lcnJvcihzZXNzaW9uLCByYywgIldhaXRp
bmcgZm9yIFNGVFAgc3RhdHVzIik7DQorICAgICAgICBpZiAocmMgPCAwKSB7
DQorICAgICAgICAgICAgc2Z0cC0+d3JpdGVfc3RhdGUgPSBsaWJzc2gyX05C
X3N0YXRlX3NlbnQ7DQorICAgICAgICAgICAgcmV0dXJuIHJjOw0KICAgICAg
ICAgfQ0KKw0KICAgICAgICAgcmV0Y29kZSA9IF9saWJzc2gyX250b2h1MzIo
ZGF0YSArIDUpOw0KICAgICAgICAgTElCU1NIMl9GUkVFKHNlc3Npb24sIGRh
dGEpOw0KIA0KQEAgLTE3ODcsOSArMTc5Miw3IEBAIHN0YXRpYyBzc2l6ZV90
IHNmdHBfd3JpdGUoTElCU1NIMl9TRlRQX0hBTkRMRSAqaGFuZGxlLCBjb25z
dCBjaGFyICpidWZmZXIsDQogDQogICAgICAgICByZXR1cm4gcmV0Ow0KICAg
ICB9DQotICAgIGVsc2UgaWYoZWFnYWluKQ0KLSAgICAgICAgcmV0dXJuIF9s
aWJzc2gyX2Vycm9yKHNlc3Npb24sIExJQlNTSDJfRVJST1JfRUFHQUlOLA0K
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXb3VsZCBibG9jayBz
ZnRwX3dyaXRlIik7DQorDQogICAgIGVsc2UNCiAgICAgICAgIHJldHVybiAw
OyAvKiBub3RoaW5nIHdhcyBhY2tlZCwgYW5kIG5vIEVBR0FJTiB3YXMgcmVj
ZWl2ZWQhICovDQogfQ0KLS0gDQoxLjcuOQ0KDQo=

--1129329158-1072963663-1328621316=:14182
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--1129329158-1072963663-1328621316=:14182--

From libssh2-devel-bounces@cool.haxx.se  Tue Feb  7 14:45:51 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17DjlkP008712;
	Tue, 7 Feb 2012 14:45:51 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q17DjkNn008702
	for <libssh2-devel@cool.haxx.se>; Tue, 7 Feb 2012 14:45:46 +0100
Received: (qmail 2588 invoked by uid 501); 7 Feb 2012 13:45:47 -0000
Message-ID: <20120207134547.2587.qmail@stuge.se>
Date: Tue, 7 Feb 2012 14:45:47 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: SFTP issues
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Daniel Stenberg wrote:
> @@ -1218,16 +1218,17 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer,
>  
>      while(chunk) {
>          if(chunk->lefttosend) {
> +            if(total_read)
> +                /* since we risk getting EAGAIN below, we return here if there
> +                   is data available */
> +                return total_read;
> +
>              rc = _libssh2_channel_write(channel, 0,
>                                          &chunk->packet[chunk->sent],
>                                          chunk->lefttosend);
>              if(rc < 0) {
> -                if(rc != LIBSSH2_ERROR_EAGAIN)
> -                    /* error */
> -                    return rc;
> -                eagain++;
>                  sftp->read_state = libssh2_NB_state_sent;
> -                break;
> +                return rc;
>              }

It doesn't seem like there is any point in having this loop anymore,
since libssh2 must return after every call to _channel_write() in any
case.


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

From libssh2-devel-bounces@cool.haxx.se  Tue Feb  7 16:34:31 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17FY8ff024848;
	Tue, 7 Feb 2012 16:34:28 +0100
Received: from mail-qw0-f54.google.com (mail-qw0-f54.google.com
	[209.85.216.54])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17FY5TE024551
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Tue, 7 Feb 2012 16:34:06 +0100
Received: by qaea17 with SMTP id a17so4675415qae.20
	for <libssh2-devel@cool.haxx.se>; Tue, 07 Feb 2012 07:33:59 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type
	:content-transfer-encoding;
	bh=2PligTu3MkHicESV23UjgPC3B8ak8YDDHTMCQDgEoa4=;
	b=HXjY3g0izdudtCZqH5yDHj2mgKfDucThXDzM/gcEBrm7Qs3ORe2/chfEOLWEZyueNz
	z+jQqHnbSxXRNR4Yea6J6W8cz+AQ+MpUB97vKBPZRS+fAvcHn1WaEQRnu95zJEtvG7FI
	aPtN+Wfo2QonZs0q5m5rd2sFWtxDx7AbktTho=
MIME-Version: 1.0
Received: by 10.224.106.196 with SMTP id y4mr5183638qao.90.1328628838419; Tue,
	07 Feb 2012 07:33:58 -0800 (PST)
Received: by 10.229.144.211 with HTTP; Tue, 7 Feb 2012 07:33:58 -0800 (PST)
In-Reply-To: <20120207134547.2587.qmail@stuge.se>
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<20120207134547.2587.qmail@stuge.se>
Date: Tue, 7 Feb 2012 15:33:58 +0000
X-Google-Sender-Auth: jTWb4r82xGeIsdRwf7l6EsNfRRg
Message-ID: <CADyPeTPto4vO=fpfAsfdjH0dL5cpWU0CLORUBRUu9Sg5VT-UJw@mail.gmail.com>
Subject: Re: SFTP issues
From: Alexander Lamaison <swish@lammy.co.uk>
To: libssh2 development <libssh2-devel@cool.haxx.se>
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id
	q17FY5TE024551
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-1"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id q17FY8ff024848

On 7 February 2012 13:45, Peter Stuge <peter@stuge.se> wrote:
> Daniel Stenberg wrote:
>> @@ -1218,16 +1218,17 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer,
>>
>>      while(chunk) {
>>          if(chunk->lefttosend) {
>> +            if(total_read)
>> +                /* since we risk getting EAGAIN below, we return here if there
>> +                   is data available */
>> +                return total_read;
>> +
>>              rc = _libssh2_channel_write(channel, 0,
>>                                          &chunk->packet[chunk->sent],
>>                                          chunk->lefttosend);
>>              if(rc < 0) {
>> -                if(rc != LIBSSH2_ERROR_EAGAIN)
>> -                    /* error */
>> -                    return rc;
>> -                eagain++;
>>                  sftp->read_state = libssh2_NB_state_sent;
>> -                break;
>> +                return rc;
>>              }
>
> It doesn't seem like there is any point in having this loop anymore,
> since libssh2 must return after every call to _channel_write() in any
> case.

Not every call, right? Only when it returns an error.

Though I think it might be a bug setting libssh2_NB_state_sent on
every error case.  Shouldn't it only happen for EAGAIN?  Otherwise any
channel failure leaves expecting to continue a previous, interrupted,
read rather than starting a new one.

Alex
--
Swish - Easy SFTP for Windows Explorer (http://www.swish-sftp.org)

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

From libssh2-devel-bounces@cool.haxx.se  Tue Feb  7 17:20:51 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17GKbCw025771;
	Tue, 7 Feb 2012 17:20:50 +0100
Received: from mail-qw0-f54.google.com (mail-qw0-f54.google.com
	[209.85.216.54])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17GKZWl025736
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Tue, 7 Feb 2012 17:20:36 +0100
Received: by qaea17 with SMTP id a17so4715223qae.20
	for <libssh2-devel@cool.haxx.se>; Tue, 07 Feb 2012 08:20:31 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type;
	bh=wEI3Do75Q1qKlpXHBIIwZGDXZWV78wwVUsImY8hB0fk=;
	b=DqReSsr16lgSDA4F8WtkRJrOEhJbrxiZk34PW2rxvXVbgcVV5SGQfYbD3AvjnPJ9Jo
	F29rNwq1z0F4cIRhrSIRO4qwGdAVVnxHsMAZhOFZ256PXJpcdy2cw3pM8SG8buKGZ21/
	l30QQvOmzN4qvsuMOlol3rDxPeHRNug2KvZFY=
MIME-Version: 1.0
Received: by 10.224.184.79 with SMTP id cj15mr22336735qab.78.1328631631514;
	Tue, 07 Feb 2012 08:20:31 -0800 (PST)
Received: by 10.229.144.211 with HTTP; Tue, 7 Feb 2012 08:20:31 -0800 (PST)
In-Reply-To: <alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
Date: Tue, 7 Feb 2012 16:20:31 +0000
X-Google-Sender-Auth: 9eSSMav2m80ABJFq0Hv2rwAvKf8
Message-ID: <CADyPeTOEke26pR+xXo8eZNFY0A0n55bkyVyN0BhuuPdeBJOrqQ@mail.gmail.com>
Subject: Re: SFTP issues
From: Alexander Lamaison <swish@lammy.co.uk>
To: libssh2 development <libssh2-devel@cool.haxx.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On 7 February 2012 13:32, Daniel Stenberg <daniel@haxx.se> wrote:

> I identified the same basic flaw in the sftp_write() code path and wrote up
> a patch for that as well, as can be seen in the attached 0002*patch.

Dan, I think you introduced a new write_state member but forgot to
include the changes to libssh2_priv.h in the patch.

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

From libssh2-devel-bounces@cool.haxx.se  Tue Feb  7 17:38:39 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17GcDx4002750;
	Tue, 7 Feb 2012 17:38:31 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q17GcBtg002688
	for <libssh2-devel@cool.haxx.se>; Tue, 7 Feb 2012 17:38:11 +0100
Received: (qmail 16776 invoked by uid 501); 7 Feb 2012 16:38:12 -0000
Message-ID: <20120207163812.16775.qmail@stuge.se>
Date: Tue, 7 Feb 2012 17:38:12 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: SFTP issues
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<20120207134547.2587.qmail@stuge.se>
	<CADyPeTPto4vO=fpfAsfdjH0dL5cpWU0CLORUBRUu9Sg5VT-UJw@mail.gmail.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <CADyPeTPto4vO=fpfAsfdjH0dL5cpWU0CLORUBRUu9Sg5VT-UJw@mail.gmail.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from base64 to 8bit by giant.haxx.se id q17GcDx4002750

Alexander Lamaison wrote:
> >> Â  Â  Â while(chunk) {
..
> >> Â  Â  Â  Â  Â  Â  Â rc = _libssh2_channel_write(channel, 0,
> >> Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â &chunk->packet[chunk->sent],
> >> Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â chunk->lefttosend);
..
> > It doesn't seem like there is any point in having this loop anymore,
> > since libssh2 must return after every call to _channel_write() in any
> > case.
> 
> Not every call, right? Only when it returns an error.

Yes, every call, because if there was data received successfully it
must be given back to the caller before trying to write to the
channel again, since writing can cause EAGAIN.


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

From libssh2-devel-bounces@cool.haxx.se  Tue Feb  7 17:42:58 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17GgtcU009297;
	Tue, 7 Feb 2012 17:42:57 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q17Ggr8e009285
	for <libssh2-devel@cool.haxx.se>; Tue, 7 Feb 2012 17:42:53 +0100
Received: (qmail 17097 invoked by uid 501); 7 Feb 2012 16:42:54 -0000
Message-ID: <20120207164254.17096.qmail@stuge.se>
Date: Tue, 7 Feb 2012 17:42:54 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: SFTP issues
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<20120207134547.2587.qmail@stuge.se>
	<CADyPeTPto4vO=fpfAsfdjH0dL5cpWU0CLORUBRUu9Sg5VT-UJw@mail.gmail.com>
	<20120207163812.16775.qmail@stuge.se>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <20120207163812.16775.qmail@stuge.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from base64 to 8bit by giant.haxx.se id q17GgtcU009297

Peter Stuge wrote:
> > >> Â  Â  Â while(chunk) {
> ..
> > >> Â  Â  Â  Â  Â  Â  Â rc = _libssh2_channel_write(channel, 0,
> > >> Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â &chunk->packet[chunk->sent],
> > >> Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â chunk->lefttosend);
> ..
> > > It doesn't seem like there is any point in having this loop anymore,
> > > since libssh2 must return after every call to _channel_write() in any
> > > case.
> > 
> > Not every call, right? Only when it returns an error.
> 
> Yes, every call, because if there was data received successfully it
> must be given back to the caller before trying to write to the
> channel again, since writing can cause EAGAIN.

That sounded backwards, but the point holds, the call must return for
every successful transfer since the next transfer can always result
in EAGAIN and libssh2 can return only "some data transfered" or
EAGAIN.


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

From libssh2-devel-bounces@cool.haxx.se  Tue Feb  7 17:46:57 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17GksDU012016;
	Tue, 7 Feb 2012 17:46:56 +0100
Received: from mail-qy0-f182.google.com (mail-qy0-f182.google.com
	[209.85.216.182])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17GkouE011959
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Tue, 7 Feb 2012 17:46:51 +0100
Received: by qcmt40 with SMTP id t40so4984238qcm.41
	for <libssh2-devel@cool.haxx.se>; Tue, 07 Feb 2012 08:46:46 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type;
	bh=j++M539wjkess0As3pxyw6xmIOqWcu7smmrUXZ9DIGo=;
	b=tts2ZLZ3tWvQWhVt+Fdtl+bE1PALnrypEiG9z6kN4/71lnQrZQ0vktIAR0pIdvmZu4
	IN9WQtT37i7ZJ/+ONDRWALWEmI7lhNHRO9Ar8DMBrUW0klXZK2icq6pVNIqqLC5Swztn
	Rjur5t5tZ1PmKa015HofzbpOghc1n7sYi5B3M=
MIME-Version: 1.0
Received: by 10.224.106.196 with SMTP id y4mr5699209qao.90.1328633206745; Tue,
	07 Feb 2012 08:46:46 -0800 (PST)
Received: by 10.229.144.211 with HTTP; Tue, 7 Feb 2012 08:46:46 -0800 (PST)
In-Reply-To: <alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
Date: Tue, 7 Feb 2012 16:46:46 +0000
X-Google-Sender-Auth: CbSuYt8tZJnVcqbJIQPQWZbD6XE
Message-ID: <CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
Subject: Re: SFTP issues
From: Alexander Lamaison <swish@lammy.co.uk>
To: libssh2 development <libssh2-devel@cool.haxx.se>
Content-Type: multipart/mixed; boundary=20cf3074b44053297204b86286ad
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

--20cf3074b44053297204b86286ad
Content-Type: text/plain; charset=ISO-8859-1

On 7 February 2012 13:32, Daniel Stenberg <daniel@haxx.se> wrote:
> On Sun, 5 Feb 2012, Daniel Stenberg wrote:
>
>>> I think I've identified a pattern to the failures and a potential cause.
>>> If you find a moment to chat on IRC I could use some help with a couple of
>>> questions.
>
> If there are others interested in this work, me and Alexander had a go at
> his problem yesterday and together we managed to identify the problem and
> come up with a fix for it. The attached 0001*patch is that fix.

This patch is based on Dan's first one and changes sftp_read to use a
switch statement instead of gotos.  I think it highlights (but doesn't
fix) a few issues:

- should 'already' be caulculated later as the processing of leftovers
can change the offset it is based on
- why do we not return immediately when we've processed leftovers; as
Peter pointed out, we aren't allowed to anything that could access the
transport layer anyway in that case so why carry on?
- why does the second 'phase' set the next state as state_idle rather
than state_sent2 (not that it's actually used but it documents intent)
- is total_read guaranteed to be > 0 at the end of the function (where
it previously MOOed)
- why check total_read in the second phase while-loop? the loop
doesn't change it

Alex

--20cf3074b44053297204b86286ad
Content-Type: application/octet-stream; 
	name="0001-Cleaned-up-sftp_read-and-added-more-explanation.patch"
Content-Disposition: attachment; 
	filename="0001-Cleaned-up-sftp_read-and-added-more-explanation.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gyd5lt552

RnJvbSAwZDNhZTA2ZGVlMTMyMDNmYTYxNzZkZDE0OTA4OWYwZTE5YTk3ZjgyIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgTGFtYWlzb24gPGF3bDAzQGRvYy5pYy5hYy51
az4KRGF0ZTogVHVlLCA3IEZlYiAyMDEyIDE2OjIzOjExICswMDAwClN1YmplY3Q6IFtQQVRDSF0g
Q2xlYW5lZCB1cCBzZnRwX3JlYWQgYW5kIGFkZGVkIG1vcmUgZXhwbGFuYXRpb24uCgpSZXBsYWNl
ZCB0aGUgZ290b3Mgd2hpY2ggd2VyZSBpbXBsZW1lbnRpbmcgdGhlIHN0YXRlIG1hY2hpbmUgd2l0
aAphIHN3aXRjaCBzdGF0ZW1lbnQgd2hpY2ggbWFrZXMgdGhlIHN0YXRlcyBtb3JlIGV4cGxpY2l0
LgotLS0KIHNyYy9zZnRwLmMgfCAgNDg5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogMSBmaWxlcyBjaGFuZ2VkLCAyNjEgaW5zZXJ0
aW9ucygrKSwgMjI4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9zZnRwLmMgYi9zcmMv
c2Z0cC5jCmluZGV4IDBhMWNmNjEuLmVjZDFiNDYgMTAwNjQ0Ci0tLSBhL3NyYy9zZnRwLmMKKysr
IGIvc3JjL3NmdHAuYwpAQCAtMTA4OSwyNzkgKzEwODksMzEyIEBAIHN0YXRpYyBzc2l6ZV90IHNm
dHBfcmVhZChMSUJTU0gyX1NGVFBfSEFORExFICogaGFuZGxlLCBjaGFyICpidWZmZXIsCiAgICAg
c3RydWN0IF9saWJzc2gyX3NmdHBfaGFuZGxlX2ZpbGVfZGF0YSAqZmlsZXAgPQogICAgICAgICAm
aGFuZGxlLT51LmZpbGU7CiAKKyAgICAvKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBpbnRlcnJ1cHRl
ZCBpbiB0aHJlZSBkaWZmZXJlbnQgcGxhY2VzIHdoZXJlIGl0CisgICAgICAgbWlnaHQgbmVlZCB0
byB3YWl0IGZvciBkYXRhIGZyb20gdGhlIG5ldHdvcmsuICBJdCByZXR1cm5zIEVBR0FJTiB0bwor
ICAgICAgIGFsbG93IG5vbi1ibG9ja2luZyBjbGllbnRzIHRvIGRvIG90aGVyIHdvcmsgYnV0IHRo
ZXNlIGNsaWVudCBhcmUKKyAgICAgICBleHBlY3RlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gYWdh
aW4gKHBvc3NpYmx5IG1hbnkgdGltZXMpIHRvIGZpbmlzaAorICAgICAgIHRoZSBvcGVyYXRpb24u
CisKKyAgICAgICBUaGUgdHJpY2t5IHBhcnQgaXMgdGhhdCBpZiB3ZSBwcmV2aW91c2x5IGFib3J0
ZWQgYSBzZnRwX3JlYWQgZHVlIHRvCisgICAgICAgRUFHQUlOLCB3ZSBtdXN0IGNvbnRpbnVlIGF0
IHRoZSBzYW1lIHNwb3QgdG8gY29udGludWUgdGhlIHByZXZpb3VzbHkKKyAgICAgICBpbnRlcnJ1
cHRlZCBvcGVyYXRpb24uICBUaGlzIGlzIGRvbmUgdXNpbmcgYSBzdGF0ZSBtYWNoaW5lIHRvIHJl
Y29yZAorICAgICAgIHdoYXQgcGhhc2Ugb2YgZXhlY3V0aW9uIHdlIHdlcmUgYXQuICBUaGUgc3Rh
dGUgaXMgc3RvcmVkIGluCisgICAgICAgc2Z0cC0+cmVhZF9zdGF0ZS4KKworICAgICAgIGxpYnNz
aDJfTkJfc3RhdGVfaWRsZTogVGhlIGZpcnN0IHBoYXNlIGlzIHdoZXJlIHdlIHByZXBhcmUgbXVs
dGlwbGUKKyAgICAgICBGWFBfUkVBRCBwYWNrZXRzIHRvIGRvIG9wdGltaXN0aWMgcmVhZC1haGVh
ZC4gIFdlIHNlbmQgb2ZmIGFzIG1hbnkgYXMKKyAgICAgICBwb3NzaWJsZSBpbiB0aGUgc2Vjb25k
IHBoYXNlIHdpdGhvdXQgd2FpdGluZyBmb3IgYSByZXNwb25zZSB0byBlYWNoCisgICAgICAgb25l
OyB0aGlzIGlzIHRoZSBrZXkgdG8gZmFzdCByZWFkcy4gQnV0IHdlIG1heSBoYXZlIHRvIGFkanVz
dCB0aGUKKyAgICAgICBjaGFubmVsIHdpbmRvdyBzaXplIHRvIGRvIHRoaXMgd2hpY2ggbWF5IGlu
dGVycnVwdCB0aGlzIGZ1bmN0aW9uIHdoaWxlCisgICAgICAgd2FpdGluZy4gIFRoZSBzdGF0ZSBt
YWNoaW5lIHNhdmVzIHRoZSBwaGFzZSBhcyBsaWJzc2gyX05CX3N0YXRlX2lkbGUgc28KKyAgICAg
ICBpdCByZXR1cm5zIGhlcmUgb24gdGhlIG5leHQgY2FsbC4KKworICAgICAgIGxpYnNzaDJfTkJf
c3RhdGVfc2VudDogVGhlIHNlY29uZCBwaGFzZSBpcyB3aGVyZSB3ZSBzZW5kIHRoZSBGWFBfUkVB
RAorICAgICAgIHBhY2tldHMuICBXcml0aW5nIHRoZW0gdG8gdGhlIGNoYW5uZWwgY2FuIGJlIGlu
dGVycnVwdGVkIHdpdGggRUFHQUlOCisgICAgICAgYnV0IHRoZSBzdGF0ZSBtYWNoaW5lIGVuc3Vy
ZXMgd2Ugc2tpcCB0aGUgZmlyc3QgcGhhc2Ugb24gdGhlIG5leHQgY2FsbAorICAgICAgIGFuZCBy
ZXN1bWUgc2VuZGluZy4KKworICAgICAgIGxpYnNzaDJfTkJfc3RhdGVfc2VudDI6IEluIHRoZSB0
aGlyZCBwaGFzZSAoaW5kaWNhdGVkIGJ5ICkgd2UgcmVhZCB0aGUKKyAgICAgICBkYXRhIGZyb20g
dGhlIHJlc3BvbnNlcyB0aGF0IGhhdmUgYXJyaXZlZCBzbyBmYXIuICBSZWFkaW5nIGNhbiBiZQor
ICAgICAgIGludGVycnVwdGVkIHdpdGggRUFHQUlOIGJ1dCB0aGUgc3RhdGUgbWFjaGluZSBlbnN1
cmVzIHdlIHNraXAgdGhlIGZpcnN0CisgICAgICAgYW5kIHNlY29uZCBwaGFzZXMgb24gdGhlIG5l
eHQgY2FsbCBhbmQgcmVzdW1lIHNlbmRpbmcuCisgICAgKi8KKwogICAgIC8qIE51bWJlciBvZiBi
eXRlcyBhc2tlZCBmb3IgdGhhdCBoYXZlbid0IGJlZW4gYWNrZWQgeWV0ICovCiAgICAgc2l6ZV90
IGFscmVhZHkgPSAoZmlsZXAtPm9mZnNldF9zZW50IC0gZmlsZXAtPm9mZnNldCk7CiAKLSAgICBp
ZihmaWxlcC0+ZGF0YV9sZWZ0KSB7Ci0gICAgICAgIC8qIGRhdGEgbGVmdCBmcm9tIHByZXZpb3Vz
IGNhbGwgKi8KLSAgICAgICAgc2l6ZV90IGNvcHkgPSBNSU4oYnVmZmVyX3NpemUsIGZpbGVwLT5k
YXRhX2xlZnQpOwotCi0gICAgICAgIG1lbWNweShidWZmZXIsICZmaWxlcC0+ZGF0YVsgZmlsZXAt
PmRhdGFfbGVuIC0gZmlsZXAtPmRhdGFfbGVmdF0sCi0gICAgICAgICAgICAgICBjb3B5KTsKLQot
ICAgICAgICB0b3RhbF9yZWFkICs9IGNvcHk7Ci0gICAgICAgIGZpbGVwLT5kYXRhX2xlZnQgLT0g
Y29weTsKLSAgICAgICAgZmlsZXAtPm9mZnNldCArPSBjb3B5OwotCi0gICAgICAgIGlmKGZpbGVw
LT5kYXRhX2xlZnQpCi0gICAgICAgICAgICByZXR1cm4gdG90YWxfcmVhZDsKLQotICAgICAgICBM
SUJTU0gyX0ZSRUUoc2Vzc2lvbiwgZmlsZXAtPmRhdGEpOwotICAgICAgICBmaWxlcC0+ZGF0YSA9
IE5VTEw7Ci0gICAgfQotCi0gICAgLyogaWYgd2UgcHJldmlvdXNseSBhYm9ydGVkIGEgc2Z0cF9y
ZWFkIGR1ZSB0byBFQUdBSU4sIHdlIG11c3QgY29udGludWUgYXQKLSAgICAgICB0aGUgc2FtZSBz
cG90IHRvIGNvbnRpbnVlIHRoZSBwcmV2aW91c2x5IGFib3J0ZWQgb3BlcmF0aW9uICovCi0gICAg
aWYoc2Z0cC0+cmVhZF9zdGF0ZSA9PSBsaWJzc2gyX05CX3N0YXRlX3NlbnQpCi0gICAgICAgIGdv
dG8gc2VuZF9yZWFkX3JlcXVlc3RzOwotICAgIGVsc2UgaWYoc2Z0cC0+cmVhZF9zdGF0ZSA9PSBs
aWJzc2gyX05CX3N0YXRlX3NlbnQyKQotICAgICAgICBnb3RvIHJlYWRfYWNrczsKLQotICAgIC8q
IFdlIGFsbG93IGEgbnVtYmVyIG9mIGJ5dGVzIGJlaW5nIHJlcXVlc3RlZCBhdCBhbnkgZ2l2ZW4g
dGltZSB3aXRob3V0Ci0gICAgICAgaGF2aW5nIGJlZW4gYWNrZWQgLSB1bnRpbCB3ZSByZWFjaCBF
T0YuICovCi0gICAgaWYoIWZpbGVwLT5lb2YpIHsKLSAgICAgICAgc2l6ZV90IG1heF9yZWFkX2Fo
ZWFkID0gYnVmZmVyX3NpemUqNDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyByZWN2X3dpbmRvdzsK
LQotICAgICAgICBpZihtYXhfcmVhZF9haGVhZCA+IExJQlNTSDJfQ0hBTk5FTF9XSU5ET1dfREVG
QVVMVCo0KQotICAgICAgICAgICAgbWF4X3JlYWRfYWhlYWQgPSBMSUJTU0gyX0NIQU5ORUxfV0lO
RE9XX0RFRkFVTFQqNDsKLQotICAgICAgICAvKiBpZiB0aGUgYnVmZmVyX3NpemUgcGFzc2VkIGlu
IG5vdyBpcyBzbWFsbGVyIHRoYW4gd2hhdCBoYXMgYWxyZWFkeQotICAgICAgICAgICBiZWVuIHNl
bnQsIHdlIHJpc2sgZ2V0dGluZyBjb3VudCBiZWNvbWUgYSB2ZXJ5IGxhcmdlIG51bWJlciAqLwot
ICAgICAgICBpZihtYXhfcmVhZF9haGVhZCA+IGFscmVhZHkpCi0gICAgICAgICAgICBjb3VudCA9
IG1heF9yZWFkX2FoZWFkIC0gYWxyZWFkeTsKLQotICAgICAgICAvKiAnY291bnQnIGlzIGhvdyBt
dWNoIG1vcmUgZGF0YSB0byBhc2sgZm9yLCBhbmQgJ2FscmVhZHknIGlzIGhvdyBtdWNoCi0gICAg
ICAgICAgIGRhdGEgdGhhdCBhbHJlYWR5IGhhcyBiZWVuIGFza2VkIGZvciBidXQgbm90IHlldCBy
ZXR1cm5lZC4KLSAgICAgICAgICAgU3BlY2lmaWNseSwgJ2NvdW50JyBtZWFucyBob3cgbXVjaCBk
YXRhIHRoYXQgaGF2ZSBvciB3aWxsIGJlIGFza2VkCi0gICAgICAgICAgIGZvciBieSB0aGUgbm9k
ZXMgdGhhdCBhcmUgYWxyZWFkeSBhZGRlZCB0byB0aGUgbGlua2VkIGxpc3QuIFNvbWUgb2YKLSAg
ICAgICAgICAgdGhvc2UgcmVhZCByZXF1ZXN0cyBtYXkgbm90IGFjdHVhbGx5IGhhdmUgYmVlbiBz
ZW50IG9mZgotICAgICAgICAgICBzdWNjZXNzZnVsbHkgeWV0LgotCi0gICAgICAgICAgIElmICdh
bHJlYWR5JyBpcyB2ZXJ5IGxhcmdlIGl0IHNob3VsZCBiZSBwZXJmZWN0bHkgZmluZSB0byBoYXZl
Ci0gICAgICAgICAgIGNvdW50IHNldCB0byAwIGFzIHRoZW4gd2UgZG9uJ3QgaGF2ZSB0byBhc2sg
Zm9yIG1vcmUgZGF0YSAocmlnaHQKLSAgICAgICAgICAgbm93KS4KLQotICAgICAgICAgICBidWZm
ZXJfc2l6ZSo0IGlzIGp1c3QgcGlja2VkIG1vcmUgb3IgbGVzcyBvdXQgb2YgdGhlIGFpci4gVGhl
IGlkZWEKLSAgICAgICAgICAgaXMgdGhhdCB3aGVuIHJlYWRpbmcgU0ZUUCBmcm9tIGEgcmVtb3Rl
IHNlcnZlciwgd2Ugc2VuZCBhd2F5Ci0gICAgICAgICAgIG11bHRpcGxlIHJlYWQgcmVxdWVzdHMg
Z3Vlc3NpbmcgdGhhdCB0aGUgY2xpZW50IHdpbGwgcmVhZCBtb3JlIHRoYW4KLSAgICAgICAgICAg
b25seSB0aGlzICdidWZmZXJfc2l6ZScgYW1vdW50IG9mIG1lbW9yeS4gU28gd2UgYXNrIGZvciBt
YXhpbXVtCi0gICAgICAgICAgIGJ1ZmZlcl9zaXplKjQgYW1vdW50IG9mIGRhdGEgc28gdGhhdCB3
ZSBjYW4gcmV0dXJuIHRoZW0gdmVyeSBmYXN0Ci0gICAgICAgICAgIGluIHN1YnNlcXVlbnQgY2Fs
bHMuCi0gICAgICAgICovCi0KLSAgICAgICAgcmVjdl93aW5kb3cgPSBsaWJzc2gyX2NoYW5uZWxf
d2luZG93X3JlYWRfZXgoc2Z0cC0+Y2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7Ci0gICAgICAgIGlmKG1heF9y
ZWFkX2FoZWFkID4gcmVjdl93aW5kb3cpIHsKLSAgICAgICAgICAgIC8qIG1vcmUgZGF0YSB3aWxs
IGJlIGFza2VkIGZvciB0aGFuIHdoYXQgdGhlIHdpbmRvdyBjdXJyZW50bHkKLSAgICAgICAgICAg
ICAgIGFsbG93cywgZXhwYW5kIGl0ISAqLwotCi0gICAgICAgICAgICBpZih0b3RhbF9yZWFkKQot
ICAgICAgICAgICAgICAgIC8qIHNpbmNlIHdlIHJpc2sgZ2V0dGluZyBFQUdBSU4gYmVsb3csIHdl
IHJldHVybiBoZXJlIGlmCi0gICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgZGF0YSBhdmFpbGFi
bGUgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gdG90YWxfcmVhZDsKKyAgICBzd2l0Y2ggKHNm
dHAtPnJlYWRfc3RhdGUpIHsKKyAgICBjYXNlIGxpYnNzaDJfTkJfc3RhdGVfaWRsZToKIAotICAg
ICAgICAgICAgcmMgPSBfbGlic3NoMl9jaGFubmVsX3JlY2VpdmVfd2luZG93X2FkanVzdChzZnRw
LT5jaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtYXhfcmVhZF9haGVhZCo4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMKTsKLSAgICAgICAgICAgIC8qIGlm
IHRoaXMgcmV0dXJucyBFQUdBSU4sIHdlIHdpbGwgZ2V0IGJhY2sgdG8gdGhpcyBmdW5jdGlvbgot
ICAgICAgICAgICAgICAgYXQgbmV4dCBjYWxsICovCi0gICAgICAgICAgICBpZiAocmMpCi0gICAg
ICAgICAgICAgICAgcmV0dXJuIHJjOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgd2hpbGUoY291
bnQgPiAwKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnM7Ci0gICAgICAgIHVpbnQzMl90IHNp
emUgPSBNSU4oTUFYX1NGVFBfUkVBRF9TSVpFLCBjb3VudCk7Ci0KLSAgICAgICAgLyogMjUgPSBw
YWNrZXRfbGVuKDQpICsgcGFja2V0X3R5cGUoMSkgKyByZXF1ZXN0X2lkKDQpICsKLSAgICAgICAg
ICAgaGFuZGxlX2xlbig0KSArIG9mZnNldCg4KSArIGNvdW50KDQpICovCi0gICAgICAgIHVpbnQz
Ml90IHBhY2tldF9sZW4gPSAodWludDMyX3QpaGFuZGxlLT5oYW5kbGVfbGVuICsgMjU7Ci0gICAg
ICAgIHVpbnQzMl90IHJlcXVlc3RfaWQ7Ci0KLSAgICAgICAgY2h1bmsgPSBMSUJTU0gyX0FMTE9D
KHNlc3Npb24sIHBhY2tldF9sZW4gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6
ZW9mKHN0cnVjdCBzZnRwX3BpcGVsaW5lX2NodW5rKSk7Ci0gICAgICAgIGlmICghY2h1bmspCi0g
ICAgICAgICAgICByZXR1cm4gX2xpYnNzaDJfZXJyb3Ioc2Vzc2lvbiwgTElCU1NIMl9FUlJPUl9B
TExPQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFsbG9jIGZhaWwgZm9y
IEZYUF9XUklURSIpOworICAgICAgICAvKiBTb21lIGRhdGEgbWF5IGFscmVhZHkgaGF2ZSBiZWVu
IHJlYWQgZnJvbSB0aGUgc2VydmVyIGluIHRoZQorICAgICAgICAgICBwcmV2aW91cyBjYWxsIGJ1
dCBkaWRuJ3QgZml0IGluIHRoZSBidWZmZXIgYXQgdGhlIHRpbWUuICBXZSBjYW4KKyAgICAgICAg
ICAgc3RhcnQgYnkgYWRkaW5nIHRoYXQgdG8gdGhlIGJ1ZmZlci4gKi8KKyAgICAgICAgaWYoZmls
ZXAtPmRhdGFfbGVmdCkgeworICAgICAgICAgICAgc2l6ZV90IGNvcHkgPSBNSU4oYnVmZmVyX3Np
emUsIGZpbGVwLT5kYXRhX2xlZnQpOwogCi0gICAgICAgIGNodW5rLT5sZW4gPSBzaXplOwotICAg
ICAgICBjaHVuay0+bGVmdHRvc2VuZCA9IHBhY2tldF9sZW47Ci0gICAgICAgIGNodW5rLT5zZW50
ID0gMDsKKyAgICAgICAgICAgIG1lbWNweShidWZmZXIsICZmaWxlcC0+ZGF0YVsgZmlsZXAtPmRh
dGFfbGVuIC0gZmlsZXAtPmRhdGFfbGVmdF0sCisgICAgICAgICAgICAgICAgICAgY29weSk7CiAK
LSAgICAgICAgcyA9IGNodW5rLT5wYWNrZXQ7CisgICAgICAgICAgICB0b3RhbF9yZWFkICs9IGNv
cHk7CisgICAgICAgICAgICBmaWxlcC0+ZGF0YV9sZWZ0IC09IGNvcHk7CisgICAgICAgICAgICBm
aWxlcC0+b2Zmc2V0ICs9IGNvcHk7CiAKLSAgICAgICAgX2xpYnNzaDJfc3RvcmVfdTMyKCZzLCBw
YWNrZXRfbGVuIC0gNCk7Ci0gICAgICAgICpzKysgPSBTU0hfRlhQX1JFQUQ7Ci0gICAgICAgIHJl
cXVlc3RfaWQgPSBzZnRwLT5yZXF1ZXN0X2lkKys7Ci0gICAgICAgIGNodW5rLT5yZXF1ZXN0X2lk
ID0gcmVxdWVzdF9pZDsKLSAgICAgICAgX2xpYnNzaDJfc3RvcmVfdTMyKCZzLCByZXF1ZXN0X2lk
KTsKLSAgICAgICAgX2xpYnNzaDJfc3RvcmVfc3RyKCZzLCBoYW5kbGUtPmhhbmRsZSwgaGFuZGxl
LT5oYW5kbGVfbGVuKTsKLSAgICAgICAgX2xpYnNzaDJfc3RvcmVfdTY0KCZzLCBmaWxlcC0+b2Zm
c2V0X3NlbnQpOwotICAgICAgICBmaWxlcC0+b2Zmc2V0X3NlbnQgKz0gc2l6ZTsgLyogYWR2YW5j
ZSBvZmZzZXQgYXQgb25jZSAqLwotICAgICAgICBfbGlic3NoMl9zdG9yZV91MzIoJnMsIHNpemUp
OworICAgICAgICAgICAgaWYoZmlsZXAtPmRhdGFfbGVmdCkKKyAgICAgICAgICAgICAgICByZXR1
cm4gdG90YWxfcmVhZDsKIAotICAgICAgICAvKiBhZGQgdGhpcyBuZXcgZW50cnkgTEFTVCBpbiB0
aGUgbGlzdCAqLwotICAgICAgICBfbGlic3NoMl9saXN0X2FkZCgmaGFuZGxlLT5wYWNrZXRfbGlz
dCwgJmNodW5rLT5ub2RlKTsKLSAgICAgICAgY291bnQgLT0gc2l6ZTsgLyogZGVkdWN0IHRoZSBz
aXplIHdlIHVzZWQsIGFzIHdlIG1pZ2h0IGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
dG8gY3JlYXRlIG1vcmUgcGFja2V0cyAqLwotICAgIH0KKyAgICAgICAgICAgIExJQlNTSDJfRlJF
RShzZXNzaW9uLCBmaWxlcC0+ZGF0YSk7CisgICAgICAgICAgICBmaWxlcC0+ZGF0YSA9IE5VTEw7
CisgICAgICAgIH0KKworICAgICAgICAvKiBXZSBhbGxvdyBhIG51bWJlciBvZiBieXRlcyBiZWlu
ZyByZXF1ZXN0ZWQgYXQgYW55IGdpdmVuIHRpbWUKKyAgICAgICAgICAgd2l0aG91dCBoYXZpbmcg
YmVlbiBhY2tlZCAtIHVudGlsIHdlIHJlYWNoIEVPRi4gKi8KKyAgICAgICAgaWYoIWZpbGVwLT5l
b2YpIHsKKyAgICAgICAgICAgIHNpemVfdCBtYXhfcmVhZF9haGVhZCA9IGJ1ZmZlcl9zaXplKjQ7
CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHJlY3Zfd2luZG93OworCisgICAgICAgICAgICBp
ZihtYXhfcmVhZF9haGVhZCA+IExJQlNTSDJfQ0hBTk5FTF9XSU5ET1dfREVGQVVMVCo0KQorICAg
ICAgICAgICAgICAgIG1heF9yZWFkX2FoZWFkID0gTElCU1NIMl9DSEFOTkVMX1dJTkRPV19ERUZB
VUxUKjQ7CisKKyAgICAgICAgICAgIC8qIGlmIHRoZSBidWZmZXJfc2l6ZSBwYXNzZWQgaW4gbm93
IGlzIHNtYWxsZXIgdGhhbiB3aGF0IGhhcworICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIHNl
bnQsIHdlIHJpc2sgZ2V0dGluZyBjb3VudCBiZWNvbWUgYSB2ZXJ5IGxhcmdlCisgICAgICAgICAg
ICAgICBudW1iZXIgKi8KKyAgICAgICAgICAgIGlmKG1heF9yZWFkX2FoZWFkID4gYWxyZWFkeSkK
KyAgICAgICAgICAgICAgICBjb3VudCA9IG1heF9yZWFkX2FoZWFkIC0gYWxyZWFkeTsKKworICAg
ICAgICAgICAgLyogJ2NvdW50JyBpcyBob3cgbXVjaCBtb3JlIGRhdGEgdG8gYXNrIGZvciwgYW5k
ICdhbHJlYWR5JyBpcyBob3cKKyAgICAgICAgICAgICAgIG11Y2ggZGF0YSB0aGF0IGFscmVhZHkg
aGFzIGJlZW4gYXNrZWQgZm9yIGJ1dCBub3QgeWV0IHJldHVybmVkLgorICAgICAgICAgICAgICAg
U3BlY2lmaWNseSwgJ2NvdW50JyBtZWFucyBob3cgbXVjaCBkYXRhIHRoYXQgaGF2ZSBvciB3aWxs
IGJlCisgICAgICAgICAgICAgICBhc2tlZCBmb3IgYnkgdGhlIG5vZGVzIHRoYXQgYXJlIGFscmVh
ZHkgYWRkZWQgdG8gdGhlIGxpbmtlZAorICAgICAgICAgICAgICAgbGlzdC4gU29tZSBvZiB0aG9z
ZSByZWFkIHJlcXVlc3RzIG1heSBub3QgYWN0dWFsbHkgaGF2ZSBiZWVuCisgICAgICAgICAgICAg
ICBzZW50IG9mZiBzdWNjZXNzZnVsbHkgeWV0LgorCisgICAgICAgICAgICAgICBJZiAnYWxyZWFk
eScgaXMgdmVyeSBsYXJnZSBpdCBzaG91bGQgYmUgcGVyZmVjdGx5IGZpbmUgdG8gaGF2ZQorICAg
ICAgICAgICAgICAgY291bnQgc2V0IHRvIDAgYXMgdGhlbiB3ZSBkb24ndCBoYXZlIHRvIGFzayBm
b3IgbW9yZSBkYXRhCisgICAgICAgICAgICAgICAocmlnaHQgbm93KS4KKworICAgICAgICAgICAg
ICAgYnVmZmVyX3NpemUqNCBpcyBqdXN0IHBpY2tlZCBtb3JlIG9yIGxlc3Mgb3V0IG9mIHRoZSBh
aXIuIFRoZQorICAgICAgICAgICAgICAgaWRlYSBpcyB0aGF0IHdoZW4gcmVhZGluZyBTRlRQIGZy
b20gYSByZW1vdGUgc2VydmVyLCB3ZSBzZW5kCisgICAgICAgICAgICAgICBhd2F5IG11bHRpcGxl
IHJlYWQgcmVxdWVzdHMgZ3Vlc3NpbmcgdGhhdCB0aGUgY2xpZW50IHdpbGwgcmVhZAorICAgICAg
ICAgICAgICAgbW9yZSB0aGFuIG9ubHkgdGhpcyAnYnVmZmVyX3NpemUnIGFtb3VudCBvZiBtZW1v
cnkuIFNvIHdlIGFzaworICAgICAgICAgICAgICAgZm9yIG1heGltdW0gYnVmZmVyX3NpemUqNCBh
bW91bnQgb2YgZGF0YSBzbyB0aGF0IHdlIGNhbiByZXR1cm4KKyAgICAgICAgICAgICAgIHRoZW0g
dmVyeSBmYXN0IGluIHN1YnNlcXVlbnQgY2FsbHMuCisgICAgICAgICAgICAqLworCisgICAgICAg
ICAgICByZWN2X3dpbmRvdyA9IGxpYnNzaDJfY2hhbm5lbF93aW5kb3dfcmVhZF9leChzZnRwLT5j
aGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBpZihtYXhfcmVhZF9haGVhZCA+IHJl
Y3Zfd2luZG93KSB7CisgICAgICAgICAgICAgICAgLyogbW9yZSBkYXRhIHdpbGwgYmUgYXNrZWQg
Zm9yIHRoYW4gd2hhdCB0aGUgd2luZG93IGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgIGFs
bG93cywgZXhwYW5kIGl0ISAqLworCisgICAgICAgICAgICAgICAgaWYodG90YWxfcmVhZCkKKyAg
ICAgICAgICAgICAgICAgICAgLyogc2luY2Ugd2UgcmlzayBnZXR0aW5nIEVBR0FJTiBiZWxvdywg
d2UgcmV0dXJuIGhlcmUgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgZGF0YSBh
dmFpbGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvdGFsX3JlYWQ7CisKKyAg
ICAgICAgICAgICAgICByYyA9IF9saWJzc2gyX2NoYW5uZWxfcmVjZWl2ZV93aW5kb3dfYWRqdXN0
KHNmdHAtPmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBtYXhfcmVhZF9haGVhZCo4LAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCk7CisgICAg
ICAgICAgICAgICAgLyogaWYgdGhpcyByZXR1cm5zIEVBR0FJTiwgd2Ugd2lsbCBnZXQgYmFjayB0
byB0aGlzIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgYXQgbmV4dCBjYWxsICovCisgICAg
ICAgICAgICAgICAgYXNzZXJ0KHJjICE9IExJQlNTSDJfRVJST1JfRUFHQUlOIHx8ICFmaWxlcC0+
ZGF0YV9sZWZ0KTsKKyAgICAgICAgICAgICAgICBhc3NlcnQocmMgIT0gTElCU1NIMl9FUlJPUl9F
QUdBSU4gfHwgIWZpbGVwLT5lb2YpOworICAgICAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgc2Vu
ZF9yZWFkX3JlcXVlc3RzOgorICAgICAgICB3aGlsZShjb3VudCA+IDApIHsKKyAgICAgICAgICAg
IHVuc2lnbmVkIGNoYXIgKnM7CisgICAgICAgICAgICB1aW50MzJfdCBzaXplID0gTUlOKE1BWF9T
RlRQX1JFQURfU0laRSwgY291bnQpOwogCi0gICAgLyogbW92ZSB0aHJvdWdoIHRoZSBSRUFEIHBh
Y2tldHMgdGhhdCBoYXZlbid0IGJlZW4gc2VudCBhbmQgc2VuZCBhcyBtYW55Ci0gICAgICAgYXMg
cG9zc2libGUgLSByZW1lbWJlciB0aGF0IHdlIGRvbid0IGJsb2NrICovCi0gICAgY2h1bmsgPSBf
bGlic3NoMl9saXN0X2ZpcnN0KCZoYW5kbGUtPnBhY2tldF9saXN0KTsKKyAgICAgICAgICAgIC8q
IDI1ID0gcGFja2V0X2xlbig0KSArIHBhY2tldF90eXBlKDEpICsgcmVxdWVzdF9pZCg0KSArCisg
ICAgICAgICAgICAgICBoYW5kbGVfbGVuKDQpICsgb2Zmc2V0KDgpICsgY291bnQoNCkgKi8KKyAg
ICAgICAgICAgIHVpbnQzMl90IHBhY2tldF9sZW4gPSAodWludDMyX3QpaGFuZGxlLT5oYW5kbGVf
bGVuICsgMjU7CisgICAgICAgICAgICB1aW50MzJfdCByZXF1ZXN0X2lkOwogCi0gICAgc2Z0cC0+
cmVhZF9zdGF0ZSA9IGxpYnNzaDJfTkJfc3RhdGVfaWRsZTsKKyAgICAgICAgICAgIGNodW5rID0g
TElCU1NIMl9BTExPQyhzZXNzaW9uLCBwYWNrZXRfbGVuICsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNmdHBfcGlwZWxpbmVfY2h1bmspKTsKKyAgICAg
ICAgICAgIGlmICghY2h1bmspCisgICAgICAgICAgICAgICAgcmV0dXJuIF9saWJzc2gyX2Vycm9y
KHNlc3Npb24sIExJQlNTSDJfRVJST1JfQUxMT0MsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICJtYWxsb2MgZmFpbCBmb3IgRlhQX1dSSVRFIik7CiAKLSAgICB3aGlsZShj
aHVuaykgewotICAgICAgICBpZihjaHVuay0+bGVmdHRvc2VuZCkgewotICAgICAgICAgICAgaWYo
dG90YWxfcmVhZCkKLSAgICAgICAgICAgICAgICAvKiBzaW5jZSB3ZSByaXNrIGdldHRpbmcgRUFH
QUlOIGJlbG93LCB3ZSByZXR1cm4gaGVyZSBpZiB0aGVyZQotICAgICAgICAgICAgICAgICAgIGlz
IGRhdGEgYXZhaWxhYmxlICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRvdGFsX3JlYWQ7Cisg
ICAgICAgICAgICBjaHVuay0+bGVuID0gc2l6ZTsKKyAgICAgICAgICAgIGNodW5rLT5sZWZ0dG9z
ZW5kID0gcGFja2V0X2xlbjsKKyAgICAgICAgICAgIGNodW5rLT5zZW50ID0gMDsKIAotICAgICAg
ICAgICAgcmMgPSBfbGlic3NoMl9jaGFubmVsX3dyaXRlKGNoYW5uZWwsIDAsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNodW5rLT5wYWNrZXRbY2h1bmstPnNlbnRd
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLT5sZWZ0dG9z
ZW5kKTsKLSAgICAgICAgICAgIGlmKHJjIDwgMCkgewotICAgICAgICAgICAgICAgIHNmdHAtPnJl
YWRfc3RhdGUgPSBsaWJzc2gyX05CX3N0YXRlX3NlbnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJu
IHJjOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcyA9IGNodW5rLT5wYWNrZXQ7CiAKLSAg
ICAgICAgICAgIC8qIHJlbWVtYmVyIHdoZXJlIHRvIGNvbnRpbnVlIHNlbmRpbmcgdGhlIG5leHQg
dGltZSAqLwotICAgICAgICAgICAgY2h1bmstPmxlZnR0b3NlbmQgLT0gcmM7Ci0gICAgICAgICAg
ICBjaHVuay0+c2VudCArPSByYzsKKyAgICAgICAgICAgIF9saWJzc2gyX3N0b3JlX3UzMigmcywg
cGFja2V0X2xlbiAtIDQpOworICAgICAgICAgICAgKnMrKyA9IFNTSF9GWFBfUkVBRDsKKyAgICAg
ICAgICAgIHJlcXVlc3RfaWQgPSBzZnRwLT5yZXF1ZXN0X2lkKys7CisgICAgICAgICAgICBjaHVu
ay0+cmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQ7CisgICAgICAgICAgICBfbGlic3NoMl9zdG9yZV91
MzIoJnMsIHJlcXVlc3RfaWQpOworICAgICAgICAgICAgX2xpYnNzaDJfc3RvcmVfc3RyKCZzLCBo
YW5kbGUtPmhhbmRsZSwgaGFuZGxlLT5oYW5kbGVfbGVuKTsKKyAgICAgICAgICAgIF9saWJzc2gy
X3N0b3JlX3U2NCgmcywgZmlsZXAtPm9mZnNldF9zZW50KTsKKyAgICAgICAgICAgIGZpbGVwLT5v
ZmZzZXRfc2VudCArPSBzaXplOyAvKiBhZHZhbmNlIG9mZnNldCBhdCBvbmNlICovCisgICAgICAg
ICAgICBfbGlic3NoMl9zdG9yZV91MzIoJnMsIHNpemUpOwogCi0gICAgICAgICAgICBpZihjaHVu
ay0+bGVmdHRvc2VuZCkKLSAgICAgICAgICAgICAgICAvKiBkYXRhIGxlZnQgdG8gc2VuZCwgZ2V0
IG91dCBvZiBsb29wICovCi0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiBh
ZGQgdGhpcyBuZXcgZW50cnkgTEFTVCBpbiB0aGUgbGlzdCAqLworICAgICAgICAgICAgX2xpYnNz
aDJfbGlzdF9hZGQoJmhhbmRsZS0+cGFja2V0X2xpc3QsICZjaHVuay0+bm9kZSk7CisgICAgICAg
ICAgICBjb3VudCAtPSBzaXplOyAvKiBkZWR1Y3QgdGhlIHNpemUgd2UgdXNlZCwgYXMgd2UgbWln
aHQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY3JlYXRlIG1vcmUgcGFj
a2V0cyAqLwogICAgICAgICB9CiAKLSAgICAgICAgLyogbW92ZSBvbiB0byB0aGUgbmV4dCBjaHVu
ayB3aXRoIGRhdGEgdG8gc2VuZCAqLwotICAgICAgICBjaHVuayA9IF9saWJzc2gyX2xpc3RfbmV4
dCgmY2h1bmstPm5vZGUpOwotICAgIH0KKyAgICBjYXNlIGxpYnNzaDJfTkJfc3RhdGVfc2VudDoK
IAotICByZWFkX2Fja3M6CisgICAgICAgIHNmdHAtPnJlYWRfc3RhdGUgPSBsaWJzc2gyX05CX3N0
YXRlX2lkbGU7CiAKLSAgICBzZnRwLT5yZWFkX3N0YXRlID0gbGlic3NoMl9OQl9zdGF0ZV9pZGxl
OworICAgICAgICAvKiBtb3ZlIHRocm91Z2ggdGhlIFJFQUQgcGFja2V0cyB0aGF0IGhhdmVuJ3Qg
YmVlbiBzZW50IGFuZCBzZW5kIGFzCisgICAgICAgICAgIG1hbnkgYXMgcG9zc2libGUgLSByZW1l
bWJlciB0aGF0IHdlIGRvbid0IGJsb2NrICovCisgICAgICAgIGNodW5rID0gX2xpYnNzaDJfbGlz
dF9maXJzdCgmaGFuZGxlLT5wYWNrZXRfbGlzdCk7CiAKLSAgICAvKgotICAgICAqIENvdW50IGFs
bCBBQ0tlZCBwYWNrZXRzIGFuZCBhY3Qgb24gdGhlIGNvbnRlbnRzIG9mIHRoZW0uCi0gICAgICov
Ci0gICAgY2h1bmsgPSBfbGlic3NoMl9saXN0X2ZpcnN0KCZoYW5kbGUtPnBhY2tldF9saXN0KTsK
KyAgICAgICAgd2hpbGUoY2h1bmspIHsKKyAgICAgICAgICAgIGlmKGNodW5rLT5sZWZ0dG9zZW5k
KSB7CisgICAgICAgICAgICAgICAgaWYodG90YWxfcmVhZCkKKyAgICAgICAgICAgICAgICAgICAg
Lyogc2luY2Ugd2UgcmlzayBnZXR0aW5nIEVBR0FJTiBiZWxvdywgd2UgcmV0dXJuIGhlcmUgaWYK
KyAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgZGF0YSBhdmFpbGFibGUgKi8KKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIHRvdGFsX3JlYWQ7CiAKLSAgICB3aGlsZShjaHVuaykgewot
ICAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICAgICBzaXplX3QgZGF0YV9sZW47Ci0g
ICAgICAgIHVpbnQzMl90IHJjMzI7Ci0gICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFy
IHJlYWRfcmVzcG9uc2VzWzJdID0gewotICAgICAgICAgICAgU1NIX0ZYUF9EQVRBLCBTU0hfRlhQ
X1NUQVRVUwotICAgICAgICB9OworICAgICAgICAgICAgICAgIHJjID0gX2xpYnNzaDJfY2hhbm5l
bF93cml0ZShjaGFubmVsLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAmY2h1bmstPnBhY2tldFtjaHVuay0+c2VudF0sCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLT5sZWZ0dG9zZW5kKTsKKyAgICAgICAgICAg
ICAgICBpZihyYyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2Z0cC0+cmVhZF9zdGF0ZSA9
IGxpYnNzaDJfTkJfc3RhdGVfc2VudDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOwor
ICAgICAgICAgICAgICAgIH0KIAotICAgICAgICBpZihjaHVuay0+bGVmdHRvc2VuZCkKLSAgICAg
ICAgICAgIC8qIGlmIHRoZSBjaHVuayBzdGlsbCBoYXMgZGF0YSBsZWZ0IHRvIHNlbmQsIHdlIHNo
b3VsZG4ndCB3YWl0IGZvcgotICAgICAgICAgICAgICAgYW4gQUNLIGZvciBpdCBqdXN0IHlldCAq
LwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogcmVtZW1iZXIgd2hlcmUg
dG8gY29udGludWUgc2VuZGluZyB0aGUgbmV4dCB0aW1lICovCisgICAgICAgICAgICAgICAgY2h1
bmstPmxlZnR0b3NlbmQgLT0gcmM7CisgICAgICAgICAgICAgICAgY2h1bmstPnNlbnQgKz0gcmM7
CiAKLSAgICAgICAgaWYodG90YWxfcmVhZCkKLSAgICAgICAgICAgIC8qIHNpbmNlIHdlIHJpc2sg
Z2V0dGluZyBFQUdBSU4gYmVsb3csIHdlIHJldHVybiBoZXJlIGlmIHRoZXJlCi0gICAgICAgICAg
ICAgICBpcyBkYXRhIGF2YWlsYWJsZSAqLwotICAgICAgICAgICAgcmV0dXJuIHRvdGFsX3JlYWQ7
CisgICAgICAgICAgICAgICAgaWYoY2h1bmstPmxlZnR0b3NlbmQpCisgICAgICAgICAgICAgICAg
ICAgIC8qIGRhdGEgbGVmdCB0byBzZW5kLCBnZXQgb3V0IG9mIGxvb3AgKi8KKyAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgcmMgPSBzZnRwX3BhY2tl
dF9yZXF1aXJldihzZnRwLCAyLCByZWFkX3Jlc3BvbnNlcywKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjaHVuay0+cmVxdWVzdF9pZCwgJmRhdGEsICZkYXRhX2xlbik7Ci0gICAg
ICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgICAgIHNmdHAtPnJlYWRfc3RhdGUgPSBsaWJzc2gy
X05CX3N0YXRlX3NlbnQyOwotICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgLyog
bW92ZSBvbiB0byB0aGUgbmV4dCBjaHVuayB3aXRoIGRhdGEgdG8gc2VuZCAqLworICAgICAgICAg
ICAgY2h1bmsgPSBfbGlic3NoMl9saXN0X25leHQoJmNodW5rLT5ub2RlKTsKICAgICAgICAgfQog
CisgICAgY2FzZSBsaWJzc2gyX05CX3N0YXRlX3NlbnQyOgorCisgICAgICAgIHNmdHAtPnJlYWRf
c3RhdGUgPSBsaWJzc2gyX05CX3N0YXRlX2lkbGU7CisKICAgICAgICAgLyoKLSAgICAgICAgICog
V2UgZ2V0IERBVEEgb3IgU1RBVFVTIGJhY2suIFNUQVRVUyBjYW4gYmUgZXJyb3IsIG9yIGl0IGlz
IEZYX0VPRgotICAgICAgICAgKiB3aGVuIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisg
ICAgICAgICAqIENvdW50IGFsbCBBQ0tlZCBwYWNrZXRzIGFuZCBhY3Qgb24gdGhlIGNvbnRlbnRz
IG9mIHRoZW0uCiAgICAgICAgICAqLworICAgICAgICBjaHVuayA9IF9saWJzc2gyX2xpc3RfZmly
c3QoJmhhbmRsZS0+cGFja2V0X2xpc3QpOwogCi0gICAgICAgIHN3aXRjaCAoZGF0YVswXSkgewot
ICAgICAgICBjYXNlIFNTSF9GWFBfU1RBVFVTOgotICAgICAgICAgICAgLyogd2UgbXVzdCByZW1v
dmUgYWxsIG91dHN0YW5kaW5nIFJFQUQgcmVxdWVzdHMsIGFzIGVpdGhlciB3ZSBnb3QKLSAgICAg
ICAgICAgICAgIGFuIGVycm9yIG9yIHdlJ3JlIGF0IGVuZCBvZiBmaWxlICovCi0gICAgICAgICAg
ICBzZnRwX3BhY2tldGxpc3RfZmx1c2goaGFuZGxlKTsKKyAgICAgICAgd2hpbGUoY2h1bmspIHsK
KyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisgICAgICAgICAgICBzaXplX3QgZGF0
YV9sZW47CisgICAgICAgICAgICB1aW50MzJfdCByYzMyOworICAgICAgICAgICAgc3RhdGljIGNv
bnN0IHVuc2lnbmVkIGNoYXIgcmVhZF9yZXNwb25zZXNbMl0gPSB7CisgICAgICAgICAgICAgICAg
U1NIX0ZYUF9EQVRBLCBTU0hfRlhQX1NUQVRVUworICAgICAgICAgICAgfTsKIAotICAgICAgICAg
ICAgcmMzMiA9IF9saWJzc2gyX250b2h1MzIoZGF0YSArIDUpOwotICAgICAgICAgICAgTElCU1NI
Ml9GUkVFKHNlc3Npb24sIGRhdGEpOworICAgICAgICAgICAgaWYoY2h1bmstPmxlZnR0b3NlbmQp
CisgICAgICAgICAgICAgICAgLyogaWYgdGhlIGNodW5rIHN0aWxsIGhhcyBkYXRhIGxlZnQgdG8g
c2VuZCwgd2Ugc2hvdWxkbid0IHdhaXQKKyAgICAgICAgICAgICAgICAgICBmb3IgYW4gQUNLIGZv
ciBpdCBqdXN0IHlldCAqLworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBp
ZiAocmMzMiA9PSBMSUJTU0gyX0ZYX0VPRikgewotICAgICAgICAgICAgICAgIGZpbGVwLT5lb2Yg
PSBUUlVFOworICAgICAgICAgICAgaWYodG90YWxfcmVhZCkKKyAgICAgICAgICAgICAgICAvKiBz
aW5jZSB3ZSByaXNrIGdldHRpbmcgRUFHQUlOIGJlbG93LCB3ZSByZXR1cm4gaGVyZSBpZiB0aGVy
ZQorICAgICAgICAgICAgICAgICAgIGlzIGRhdGEgYXZhaWxhYmxlICovCiAgICAgICAgICAgICAg
ICAgcmV0dXJuIHRvdGFsX3JlYWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsK
LSAgICAgICAgICAgICAgICBzZnRwLT5sYXN0X2Vycm5vID0gcmMzMjsKLSAgICAgICAgICAgICAg
ICByZXR1cm4gX2xpYnNzaDJfZXJyb3Ioc2Vzc2lvbiwgTElCU1NIMl9FUlJPUl9TRlRQX1BST1RP
Q09MLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0ZUUCBSRUFEIGVy
cm9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNl
IFNTSF9GWFBfREFUQToKLSAgICAgICAgICAgIHJjMzIgPSBfbGlic3NoMl9udG9odTMyKGRhdGEg
KyA1KTsKLSAgICAgICAgICAgIGlmIChyYzMyID4gKGRhdGFfbGVuIC0gOSkpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIF9saWJzc2gyX2Vycm9yKHNlc3Npb24sIExJQlNTSDJfRVJST1JfU0ZUUF9Q
Uk9UT0NPTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNGVFAgUHJv
dG9jb2wgYmFkbmVzcyIpOwotCi0gICAgICAgICAgICBpZihyYzMyICE9IGNodW5rLT5sZW4pIHsK
LSAgICAgICAgICAgICAgICAvKiBhIHNob3J0IHJlYWQgZG9lcyBub3QgaW1wbHkgZW5kIG9mIGZp
bGUsIGJ1dCB3ZSBtdXN0IGFkanVzdAotICAgICAgICAgICAgICAgICAgIHRoZSBvZmZzZXRfc2Vu
dCBzaW5jZSBpdCB3YXMgYWR2YW5jZWQgd2l0aCBhIGZ1bGwKLSAgICAgICAgICAgICAgICAgICBj
aHVuay0+bGVuIGJlZm9yZSAqLwotICAgICAgICAgICAgICAgIGZpbGVwLT5vZmZzZXRfc2VudCAt
PSAoY2h1bmstPmxlbiAtIHJjMzIpOworICAgICAgICAgICAgcmMgPSBzZnRwX3BhY2tldF9yZXF1
aXJldihzZnRwLCAyLCByZWFkX3Jlc3BvbnNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2h1bmstPnJlcXVlc3RfaWQsICZkYXRhLCAmZGF0YV9sZW4pOworICAgICAg
ICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgIHNmdHAtPnJlYWRfc3RhdGUgPSBs
aWJzc2gyX05CX3N0YXRlX3NlbnQyOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKICAgICAg
ICAgICAgIH0KIAotICAgICAgICAgICAgaWYodG90YWxfcmVhZCArIHJjMzIgPiBidWZmZXJfc2l6
ZSkgewotICAgICAgICAgICAgICAgIC8qIGZpZ3VyZSBvdXQgdGhlIG92ZXJsYXAgYW1vdW50ICov
Ci0gICAgICAgICAgICAgICAgZmlsZXAtPmRhdGFfbGVmdCA9ICh0b3RhbF9yZWFkICsgcmMzMikg
LSBidWZmZXJfc2l6ZTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBXZSBnZXQgREFU
QSBvciBTVEFUVVMgYmFjay4gU1RBVFVTIGNhbiBiZSBlcnJvciwgb3IgaXQgaXMKKyAgICAgICAg
ICAgICAqIEZYX0VPRiB3aGVuIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgICAgICAg
ICAgICAgKi8KIAotICAgICAgICAgICAgICAgIC8qIGdldHRpbmcgdGhlIGZ1bGwgcGFja2V0IHdv
dWxkIG92ZXJmbG93IHRoZSBidWZmZXIsIHNvCi0gICAgICAgICAgICAgICAgICAgb25seSBnZXQg
dGhlIGNvcnJlY3QgYW1vdW50IGFuZCBrZWVwIHRoZSByZW1haW5kZXIgKi8KLSAgICAgICAgICAg
ICAgICByYzMyID0gKHVpbnQzMl90KShidWZmZXJfc2l6ZSAtIHRvdGFsX3JlYWQpOworICAgICAg
ICAgICAgc3dpdGNoIChkYXRhWzBdKSB7CisgICAgICAgICAgICBjYXNlIFNTSF9GWFBfU1RBVFVT
OgorICAgICAgICAgICAgICAgIC8qIHdlIG11c3QgcmVtb3ZlIGFsbCBvdXRzdGFuZGluZyBSRUFE
IHJlcXVlc3RzLCBhcyBlaXRoZXIgd2UKKyAgICAgICAgICAgICAgICAgICBnb3QgYW4gZXJyb3Ig
b3Igd2UncmUgYXQgZW5kIG9mIGZpbGUgKi8KKyAgICAgICAgICAgICAgICBzZnRwX3BhY2tldGxp
c3RfZmx1c2goaGFuZGxlKTsKIAotICAgICAgICAgICAgICAgIC8qIHN0b3JlIGRhdGEgdG8ga2Vl
cCBmb3IgbmV4dCBjYWxsICovCi0gICAgICAgICAgICAgICAgZmlsZXAtPmRhdGEgPSBkYXRhOwot
ICAgICAgICAgICAgICAgIGZpbGVwLT5kYXRhX2xlbiA9IGRhdGFfbGVuOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZpbGVwLT5kYXRhX2xlbiA9IDA7
CisgICAgICAgICAgICAgICAgcmMzMiA9IF9saWJzc2gyX250b2h1MzIoZGF0YSArIDUpOworICAg
ICAgICAgICAgICAgIExJQlNTSDJfRlJFRShzZXNzaW9uLCBkYXRhKTsKIAotICAgICAgICAgICAg
LyogY29weSB0aGUgcmVjZWl2ZWQgZGF0YSBmcm9tIHRoZSByZWNlaXZlZCBGWFBfREFUQSBwYWNr
ZXQgdG8gdGhlCi0gICAgICAgICAgICAgICBidWZmZXIgYXQgdGhlIGNvcnJlY3QgaW5kZXggKi8K
LSAgICAgICAgICAgIG1lbWNweShidWZmZXIgKyB0b3RhbF9yZWFkLCBkYXRhICsgOSwgcmMzMik7
Ci0gICAgICAgICAgICBmaWxlcC0+b2Zmc2V0ICs9IHJjMzI7Ci0gICAgICAgICAgICB0b3RhbF9y
ZWFkICs9IHJjMzI7CisgICAgICAgICAgICAgICAgaWYgKHJjMzIgPT0gTElCU1NIMl9GWF9FT0Yp
IHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZXAtPmVvZiA9IFRSVUU7CisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiB0b3RhbF9yZWFkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2Z0cC0+bGFzdF9lcnJubyA9IHJjMzI7
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbGlic3NoMl9lcnJvcihzZXNzaW9uLCBMSUJT
U0gyX0VSUk9SX1NGVFBfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiU0ZUUCBSRUFEIGVycm9yIik7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBpZighZmlsZXAtPmRhdGFfbGVuKQotICAg
ICAgICAgICAgICAgIC8qIGZyZWUgdGhlIGFsbG9jYXRlZCBkYXRhIGlmIG5vdCBzdG9yZWQgdG8g
a2VlcCAqLwotICAgICAgICAgICAgICAgIExJQlNTSDJfRlJFRShzZXNzaW9uLCBkYXRhKTsKLSAg
ICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8qIGZvcmNlIHRoZSBsb29wIHRvIGVu
ZCBzaW5jZSB0aGUgcmVjZWl2ZSBidWZmZXIgaXMgZnVsbAotICAgICAgICAgICAgICAgICAgIGFs
cmVhZHksIGJ1dCByZW1vdmUgdGhpcyBjaHVuayBmcm9tIHRoZSBsaXN0IGZpcnN0ICovCi0gICAg
ICAgICAgICAgICAgX2xpYnNzaDJfbGlzdF9yZW1vdmUoJmNodW5rLT5ub2RlKTsgLyogcmVtb3Zl
IGZyb20gbGlzdCAqLwotICAgICAgICAgICAgICAgIExJQlNTSDJfRlJFRShzZXNzaW9uLCBjaHVu
ayk7IC8qIGZyZWUgbWVtb3J5ICovCisgICAgICAgICAgICBjYXNlIFNTSF9GWFBfREFUQToKKyAg
ICAgICAgICAgICAgICByYzMyID0gX2xpYnNzaDJfbnRvaHUzMihkYXRhICsgNSk7CisgICAgICAg
ICAgICAgICAgaWYgKHJjMzIgPiAoZGF0YV9sZW4gLSA5KSkKKyAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIF9saWJzc2gyX2Vycm9yKHNlc3Npb24sIExJQlNTSDJfRVJST1JfU0ZUUF9QUk9UT0NP
TCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRlRQIFByb3Rv
Y29sIGJhZG5lc3MiKTsKKworICAgICAgICAgICAgICAgIGlmKHJjMzIgIT0gY2h1bmstPmxlbikg
eworICAgICAgICAgICAgICAgICAgICAvKiBhIHNob3J0IHJlYWQgZG9lcyBub3QgaW1wbHkgZW5k
IG9mIGZpbGUsIGJ1dCB3ZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdCB0aGUg
b2Zmc2V0X3NlbnQgc2luY2UgaXQgd2FzIGFkdmFuY2VkIHdpdGggYQorICAgICAgICAgICAgICAg
ICAgICAgICBmdWxsIGNodW5rLT5sZW4gYmVmb3JlICovCisgICAgICAgICAgICAgICAgICAgIGZp
bGVwLT5vZmZzZXRfc2VudCAtPSAoY2h1bmstPmxlbiAtIHJjMzIpOworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIGlmKHRvdGFsX3JlYWQgKyByYzMyID4gYnVmZmVyX3NpemUp
IHsKKyAgICAgICAgICAgICAgICAgICAgLyogZmlndXJlIG91dCB0aGUgb3ZlcmxhcCBhbW91bnQg
Ki8KKyAgICAgICAgICAgICAgICAgICAgZmlsZXAtPmRhdGFfbGVmdCA9ICh0b3RhbF9yZWFkICsg
cmMzMikgLSBidWZmZXJfc2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAvKiBnZXR0aW5nIHRo
ZSBmdWxsIHBhY2tldCB3b3VsZCBvdmVyZmxvdyB0aGUgYnVmZmVyLCBzbworICAgICAgICAgICAg
ICAgICAgICAgICBvbmx5IGdldCB0aGUgY29ycmVjdCBhbW91bnQgYW5kIGtlZXAgdGhlIHJlbWFp
bmRlciAqLworICAgICAgICAgICAgICAgICAgICByYzMyID0gKHVpbnQzMl90KShidWZmZXJfc2l6
ZSAtIHRvdGFsX3JlYWQpOwogCi0gICAgICAgICAgICAgICAgY2h1bmsgPSBOVUxMOwotICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBkYXRhIHRv
IGtlZXAgZm9yIG5leHQgY2FsbCAqLworICAgICAgICAgICAgICAgICAgICBmaWxlcC0+ZGF0YSA9
IGRhdGE7CisgICAgICAgICAgICAgICAgICAgIGZpbGVwLT5kYXRhX2xlbiA9IGRhdGFfbGVuOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
ICAgIGZpbGVwLT5kYXRhX2xlbiA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSBy
ZWNlaXZlZCBkYXRhIGZyb20gdGhlIHJlY2VpdmVkIEZYUF9EQVRBIHBhY2tldCB0bworICAgICAg
ICAgICAgICAgICAgIHRoZSBidWZmZXIgYXQgdGhlIGNvcnJlY3QgaW5kZXggKi8KKyAgICAgICAg
ICAgICAgICBtZW1jcHkoYnVmZmVyICsgdG90YWxfcmVhZCwgZGF0YSArIDksIHJjMzIpOworICAg
ICAgICAgICAgICAgIGZpbGVwLT5vZmZzZXQgKz0gcmMzMjsKKyAgICAgICAgICAgICAgICB0b3Rh
bF9yZWFkICs9IHJjMzI7CisKKyAgICAgICAgICAgICAgICBpZighZmlsZXAtPmRhdGFfbGVuKQor
ICAgICAgICAgICAgICAgICAgICAvKiBmcmVlIHRoZSBhbGxvY2F0ZWQgZGF0YSBpZiBub3Qgc3Rv
cmVkIHRvIGtlZXAgKi8KKyAgICAgICAgICAgICAgICAgICAgTElCU1NIMl9GUkVFKHNlc3Npb24s
IGRhdGEpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBm
b3JjZSB0aGUgbG9vcCB0byBlbmQgc2luY2UgdGhlIHJlY2VpdmUgYnVmZmVyIGlzIGZ1bGwKKyAg
ICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSwgYnV0IHJlbW92ZSB0aGlzIGNodW5rIGZyb20g
dGhlIGxpc3QgZmlyc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgX2xpYnNzaDJfbGlzdF9yZW1v
dmUoJmNodW5rLT5ub2RlKTsgLyogcmVtb3ZlIGZyb20gbGlzdCAqLworICAgICAgICAgICAgICAg
ICAgICBMSUJTU0gyX0ZSRUUoc2Vzc2lvbiwgY2h1bmspOyAvKiBmcmVlIG1lbW9yeSAqLworCisg
ICAgICAgICAgICAgICAgICAgIGNodW5rID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAg
ICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KIAotICAgICAgICBuZXh0ID0g
X2xpYnNzaDJfbGlzdF9uZXh0KCZjaHVuay0+bm9kZSk7CisgICAgICAgICAgICBuZXh0ID0gX2xp
YnNzaDJfbGlzdF9uZXh0KCZjaHVuay0+bm9kZSk7CiAKLSAgICAgICAgX2xpYnNzaDJfbGlzdF9y
ZW1vdmUoJmNodW5rLT5ub2RlKTsgLyogcmVtb3ZlIGZyb20gbGlzdCAqLwotICAgICAgICBMSUJT
U0gyX0ZSRUUoc2Vzc2lvbiwgY2h1bmspOyAvKiBmcmVlIG1lbW9yeSAqLworICAgICAgICAgICAg
X2xpYnNzaDJfbGlzdF9yZW1vdmUoJmNodW5rLT5ub2RlKTsgLyogcmVtb3ZlIGZyb20gbGlzdCAq
LworICAgICAgICAgICAgTElCU1NIMl9GUkVFKHNlc3Npb24sIGNodW5rKTsgLyogZnJlZSBtZW1v
cnkgKi8KIAotICAgICAgICBjaHVuayA9IG5leHQ7Ci0gICAgfQorICAgICAgICAgICAgY2h1bmsg
PSBuZXh0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgaWYoISB0b3RhbF9yZWFk
KSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiTU9PXG4iKTsKKyAgICBkZWZhdWx0OgorICAg
ICAgICBhc3NlcnQoISJTdGF0ZSBtYWNoaW5lIGVycm9yOyB1bnJlY29nbmlzZWQgcmVhZCBzdGF0
ZSIpOwogICAgIH0KIAogICAgIHJldHVybiB0b3RhbF9yZWFkOwotLSAKMS43LjgubXN5c2dpdC4w
Cgo=
--20cf3074b44053297204b86286ad
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--20cf3074b44053297204b86286ad--

From libssh2-devel-bounces@cool.haxx.se  Tue Feb  7 19:17:11 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17IGqTr008658;
	Tue, 7 Feb 2012 19:17:09 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17IGoFZ008643
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Tue, 7 Feb 2012 19:16:50 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q17IGoox008638
	for <libssh2-devel@cool.haxx.se>; Tue, 7 Feb 2012 19:16:50 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Tue, 7 Feb 2012 19:16:50 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: SFTP issues
In-Reply-To: <CADyPeTOEke26pR+xXo8eZNFY0A0n55bkyVyN0BhuuPdeBJOrqQ@mail.gmail.com>
Message-ID: <alpine.DEB.2.00.1202071915260.25243@tvnag.unkk.fr>
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTOEke26pR+xXo8eZNFY0A0n55bkyVyN0BhuuPdeBJOrqQ@mail.gmail.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Tue, 7 Feb 2012, Alexander Lamaison wrote:

> Dan, I think you introduced a new write_state member but forgot to include 
> the changes to libssh2_priv.h in the patch.

Oops, yes I missed adding src/sftp.h to the patch. I'll repost that (fixed) 
patch once we've worked out the sftp_read() quirks.

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Tue Feb  7 19:49:51 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17Ineok031863;
	Tue, 7 Feb 2012 19:49:50 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q17IndpZ031822
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Tue, 7 Feb 2012 19:49:39 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q17IncFw031818
	for <libssh2-devel@cool.haxx.se>; Tue, 7 Feb 2012 19:49:38 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Tue, 7 Feb 2012 19:49:38 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: SFTP issues
In-Reply-To: <CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
Message-ID: <alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Tue, 7 Feb 2012, Alexander Lamaison wrote:

Thanks a lot. I think we're doing good progress!

> - should 'already' be caulculated later as the processing of leftovers
> can change the offset it is based on

It can be moved down a bit into the switch() since the variable is only used 
in the 'idle' state. If we make the leftover code return immediately (as the 
question/answer say) there won't be any need to calculate 'already' after it. 
I agree with your point that it would otherwise have to.

> - why do we not return immediately when we've processed leftovers; as
> Peter pointed out, we aren't allowed to anything that could access the
> transport layer anyway in that case so why carry on?

You mean in the leftover processing first in the idle case? Yes, that can 
probably return at once to make the code clearer.

> - why does the second 'phase' set the next state as state_idle rather
> than state_sent2 (not that it's actually used but it documents intent)

It sets the state to idle to make sure it doesn't wrongly get stuck in the 
sent2 state. It sets the state2 only when an error (like EAGAIN) is received.

> - is total_read guaranteed to be > 0 at the end of the function (where it 
> previously MOOed)

No, it can also be zero in case all this function read was meta-data that 
wasn't actually payload and this function should be OK to have 0 returned for 
that case.

> - why check total_read in the second phase while-loop? the loop doesn't 
> change it

Ah, right. That can certainly be improved. I added that check just before the 
call that might get EAGAIN returned, but as you say - if total_read is 
non-zero at that point it was non-zero already before the loop and the check 
would be better placed already there.

Will you do the additional edits?

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Wed Feb  8 01:16:07 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q180FhTo007110;
	Wed, 8 Feb 2012 01:16:03 +0100
Received: from mail-qw0-f54.google.com (mail-qw0-f54.google.com
	[209.85.216.54])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q180FeDg007055
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Wed, 8 Feb 2012 01:15:41 +0100
Received: by qaea17 with SMTP id a17so59800qae.20
	for <libssh2-devel@cool.haxx.se>; Tue, 07 Feb 2012 16:15:35 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type;
	bh=YGIDuxFtXrL1r9suT7Ic9dgkeN2ZiKo3A1Y0T88PXJw=;
	b=cHlSrmoXGV6KcbEvf1gRUOhUg/JGmcqqfgvGH5SNLGGRBd8mslg49zYr7PuTyTFy5w
	4tBUMrMSVnC53O9fORaHI5E3yi152NItnrzwwU/Eq8+aUWeF9seS1hTuFlT2jFX6swVX
	YU9glxL3xXbxrfTONPGm36m2txm01Q0ahVa4E=
MIME-Version: 1.0
Received: by 10.224.180.76 with SMTP id bt12mr24651623qab.64.1328660135623;
	Tue, 07 Feb 2012 16:15:35 -0800 (PST)
Received: by 10.229.144.211 with HTTP; Tue, 7 Feb 2012 16:15:35 -0800 (PST)
In-Reply-To: <alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
Date: Wed, 8 Feb 2012 00:15:35 +0000
X-Google-Sender-Auth: ARShSdYoo9aZKVr8aTiceklVneU
Message-ID: <CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
Subject: Re: SFTP issues
From: Alexander Lamaison <swish@lammy.co.uk>
To: libssh2 development <libssh2-devel@cool.haxx.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On 7 February 2012 18:49, Daniel Stenberg <daniel@haxx.se> wrote:
> On Tue, 7 Feb 2012, Alexander Lamaison wrote:
>
> Will you do the additional edits?

Sure.  I hope today some time.

Alex
--
Swish - Easy SFTP for Windows Explorer (http://www.swish-sftp.org)
_______________________________________________
libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 02:49:02 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q191fXEn004054;
	Thu, 9 Feb 2012 02:42:02 +0100
Received: from mail-qw0-f54.google.com (mail-qw0-f54.google.com
	[209.85.216.54])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q191fM1G004047
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 02:41:23 +0100
Received: by qaea17 with SMTP id a17so892127qae.20
	for <libssh2-devel@cool.haxx.se>; Wed, 08 Feb 2012 17:41:17 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type;
	bh=9nBiThIRkICF05/3cEKp4ABLInUsRcrg+JgoMyA3KAo=;
	b=gM55Q0Z7XUGL3HJVPhG8a8g5jCNj03qJa+frEUpyDRH82PwngnKHThSP+tMAaXzwoD
	IHiVQWm/EWd4Uk7pPhpZMVME/42LDF8jgL3CzcxVGJwQkvDhwRceY1Ki635iS8y9K2xI
	gAnbRNtMuUD98zAhKD+aHF/ZJVao3E11o5g8o=
MIME-Version: 1.0
Received: by 10.224.106.196 with SMTP id y4mr49642qao.90.1328751677441; Wed,
	08 Feb 2012 17:41:17 -0800 (PST)
Received: by 10.229.144.211 with HTTP; Wed, 8 Feb 2012 17:41:17 -0800 (PST)
In-Reply-To: <CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
Date: Thu, 9 Feb 2012 01:41:17 +0000
X-Google-Sender-Auth: up71BDYqPkyRnU4WnPhV8Y417Vo
Message-ID: <CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
Subject: Re: SFTP issues
From: Alexander Lamaison <swish@lammy.co.uk>
To: libssh2 development <libssh2-devel@cool.haxx.se>
Content-Type: multipart/mixed; boundary=20cf3074b440ba877504b87e1b1e
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

--20cf3074b440ba877504b87e1b1e
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

On 8 February 2012 00:15, Alexander Lamaison <swish@lammy.co.uk> wrote:
> On 7 February 2012 18:49, Daniel Stenberg <daniel@haxx.se> wrote:
>> On Tue, 7 Feb 2012, Alexander Lamaison wrote:
>>
>> Will you do the additional edits?
>
> Sure. =A0I hope today some time.

Ok, here is the next patch; apply it on top of my other one.

The changes are more extensive that I'd planned so I'd appreciate some
careful review.  Basically, the total_read variable turned out to be
completely pointless.  Once I'd fixed the leftovers processing so that
it returned if there was any data, I couldn't work out how it could be
anything other than 0 for most of it's lifetime.  The only time it was
incremented was just after we read data; a situation where we have to
return without reading any more data.  So I got rid of it.

I'm still a little unsure of the code that deals with
freeing/iterating chunks.  Especially in the case where the read was
short (short !=3D EOF).  Especially especially in the case where the
read was 0 (also 0 !=3D EOF).  So could reviewing eyes pay that aspect
particular attention.

Alex
--
Swish - Easy SFTP for Windows Explorer (http://www.swish-sftp.org)

--20cf3074b440ba877504b87e1b1e
Content-Type: application/octet-stream; 
	name="0002-Simplified-sftp_read.patch"
Content-Disposition: attachment; filename="0002-Simplified-sftp_read.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gyf4518a0

RnJvbSA5ZDliNDkwNGZlYmQwNzY0MTRhZDg5YWVjNjJjYWJlMzU3NTI4NjU4IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgTGFtYWlzb24gPGF3bDAzQGRvYy5pYy5hYy51
az4KRGF0ZTogVGh1LCA5IEZlYiAyMDEyIDAxOjMxOjM5ICswMDAwClN1YmplY3Q6IFtQQVRDSCAy
LzJdIFNpbXBsaWZpZWQgc2Z0cF9yZWFkLgoKUmVtb3ZlZCB0aGUgdG90YWxfcmVhZCB2YXJpYWJs
ZSB0aGF0IG9yaWdpbmFsbHkgbXVzdCBoYXZlIHRyYWNrZWQgaG93IG11Y2ggZGF0YSBoYWQgYmVl
biB3cml0dGVuIHRvIHRoZSBidWZmZXIuICBXaXRoIG5vbi1ibG9ja2luZyByZWFkcywgd2UgbXVz
dCByZXR1cm4gc3RyYWlnaHQgYXdheSBvbmNlIHdlIGhhdmUgcmVhZCBkYXRhIGludG8gdGhlIGJ1
ZmZlciBzbyB0aGlzIHZhcmlhYmxlIHNlcnZlZCBub3QgcHVycG9zZS4KCkkgdGhpbmsgaXQgd2Fz
IHN0aWxsIGhhbmdpbmcgYXJvdW5kIGluIGNhc2UgdGhlIGluaXRpYWwgcHJvY2Vzc2luZyBvZiAn
bGVmdG92ZXInIGRhdGEgbWVhbnQgd2Ugd3JvdGUgdG8gdGhlIGJ1ZmZlciBidXQgdGhpcyBjYXNl
LCBsaWtlIHRoZSBvdGhlcnMsIG11c3QgcmV0dXJuIGltbWVkaWF0ZWx5LiAgTm93IHRoYXQgaXQg
ZG9lcywgdGhlIGxhc3QgcmVtYWluaW5nIG5lZWQgZm9yIHRoZSB2YXJpYWJsZSBpcyBnb25lLgot
LS0KIHNyYy9zZnRwLmMgfCAgIDg3ICsrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAxIGZpbGVzIGNoYW5nZWQsIDQwIGluc2VydGlvbnMo
KyksIDQ3IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9zZnRwLmMgYi9zcmMvc2Z0cC5j
CmluZGV4IGVjZDFiNDYuLjdhZjVjNDMgMTAwNjQ0Ci0tLSBhL3NyYy9zZnRwLmMKKysrIGIvc3Jj
L3NmdHAuYwpAQCAtMTA4NSw3ICsxMDg1LDYgQEAgc3RhdGljIHNzaXplX3Qgc2Z0cF9yZWFkKExJ
QlNTSDJfU0ZUUF9IQU5ETEUgKiBoYW5kbGUsIGNoYXIgKmJ1ZmZlciwKICAgICBzdHJ1Y3Qgc2Z0
cF9waXBlbGluZV9jaHVuayAqY2h1bms7CiAgICAgc3RydWN0IHNmdHBfcGlwZWxpbmVfY2h1bmsg
Km5leHQ7CiAgICAgc3NpemVfdCByYzsKLSAgICBzaXplX3QgdG90YWxfcmVhZCA9IDA7CiAgICAg
c3RydWN0IF9saWJzc2gyX3NmdHBfaGFuZGxlX2ZpbGVfZGF0YSAqZmlsZXAgPQogICAgICAgICAm
aGFuZGxlLT51LmZpbGU7CiAKQEAgLTExMjAsMzUgKzExMTksMzYgQEAgc3RhdGljIHNzaXplX3Qg
c2Z0cF9yZWFkKExJQlNTSDJfU0ZUUF9IQU5ETEUgKiBoYW5kbGUsIGNoYXIgKmJ1ZmZlciwKICAg
ICAgICBhbmQgc2Vjb25kIHBoYXNlcyBvbiB0aGUgbmV4dCBjYWxsIGFuZCByZXN1bWUgc2VuZGlu
Zy4KICAgICAqLwogCi0gICAgLyogTnVtYmVyIG9mIGJ5dGVzIGFza2VkIGZvciB0aGF0IGhhdmVu
J3QgYmVlbiBhY2tlZCB5ZXQgKi8KLSAgICBzaXplX3QgYWxyZWFkeSA9IChmaWxlcC0+b2Zmc2V0
X3NlbnQgLSBmaWxlcC0+b2Zmc2V0KTsKLQogICAgIHN3aXRjaCAoc2Z0cC0+cmVhZF9zdGF0ZSkg
ewogICAgIGNhc2UgbGlic3NoMl9OQl9zdGF0ZV9pZGxlOgogCiAgICAgICAgIC8qIFNvbWUgZGF0
YSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gcmVhZCBmcm9tIHRoZSBzZXJ2ZXIgaW4gdGhlCi0gICAg
ICAgICAgIHByZXZpb3VzIGNhbGwgYnV0IGRpZG4ndCBmaXQgaW4gdGhlIGJ1ZmZlciBhdCB0aGUg
dGltZS4gIFdlIGNhbgotICAgICAgICAgICBzdGFydCBieSBhZGRpbmcgdGhhdCB0byB0aGUgYnVm
ZmVyLiAqLworICAgICAgICAgICBwcmV2aW91cyBjYWxsIGJ1dCBkaWRuJ3QgZml0IGluIHRoZSBi
dWZmZXIgYXQgdGhlIHRpbWUuICBJZiBzbywgd2UKKyAgICAgICAgICAgcmV0dXJuIHRoYXQgbm93
IGFzIHdlIGNhbid0IHJpc2sgYmVpbmcgaW50ZXJydXB0ZWQgbGF0ZXIgd2l0aCBkYXRhCisgICAg
ICAgICAgIHBhcnRpYWxseSB3cml0dGVuIHRvIHRoZSBidWZmZXIuICovCiAgICAgICAgIGlmKGZp
bGVwLT5kYXRhX2xlZnQpIHsKICAgICAgICAgICAgIHNpemVfdCBjb3B5ID0gTUlOKGJ1ZmZlcl9z
aXplLCBmaWxlcC0+ZGF0YV9sZWZ0KTsKIAogICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlciwgJmZp
bGVwLT5kYXRhWyBmaWxlcC0+ZGF0YV9sZW4gLSBmaWxlcC0+ZGF0YV9sZWZ0XSwKICAgICAgICAg
ICAgICAgICAgICBjb3B5KTsKIAotICAgICAgICAgICAgdG90YWxfcmVhZCArPSBjb3B5OwogICAg
ICAgICAgICAgZmlsZXAtPmRhdGFfbGVmdCAtPSBjb3B5OwogICAgICAgICAgICAgZmlsZXAtPm9m
ZnNldCArPSBjb3B5OwogCi0gICAgICAgICAgICBpZihmaWxlcC0+ZGF0YV9sZWZ0KQotICAgICAg
ICAgICAgICAgIHJldHVybiB0b3RhbF9yZWFkOworICAgICAgICAgICAgaWYoIWZpbGVwLT5kYXRh
X2xlZnQpIHsKKyAgICAgICAgICAgICAgICBMSUJTU0gyX0ZSRUUoc2Vzc2lvbiwgZmlsZXAtPmRh
dGEpOworICAgICAgICAgICAgICAgIGZpbGVwLT5kYXRhID0gTlVMTDsKKyAgICAgICAgICAgIH0K
IAotICAgICAgICAgICAgTElCU1NIMl9GUkVFKHNlc3Npb24sIGZpbGVwLT5kYXRhKTsKLSAgICAg
ICAgICAgIGZpbGVwLT5kYXRhID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBjb3B5OwogICAg
ICAgICB9CiAKICAgICAgICAgLyogV2UgYWxsb3cgYSBudW1iZXIgb2YgYnl0ZXMgYmVpbmcgcmVx
dWVzdGVkIGF0IGFueSBnaXZlbiB0aW1lCiAgICAgICAgICAgIHdpdGhvdXQgaGF2aW5nIGJlZW4g
YWNrZWQgLSB1bnRpbCB3ZSByZWFjaCBFT0YuICovCiAgICAgICAgIGlmKCFmaWxlcC0+ZW9mKSB7
CisgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgYXNrZWQgZm9yIHRoYXQgaGF2ZW4ndCBi
ZWVuIGFja2VkIHlldCAqLworICAgICAgICAgICAgc2l6ZV90IGFscmVhZHkgPSAoZmlsZXAtPm9m
ZnNldF9zZW50IC0gZmlsZXAtPm9mZnNldCk7CisKICAgICAgICAgICAgIHNpemVfdCBtYXhfcmVh
ZF9haGVhZCA9IGJ1ZmZlcl9zaXplKjQ7CiAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHJlY3Zf
d2luZG93OwogCkBAIC0xMTg2LDExICsxMTg2LDYgQEAgc3RhdGljIHNzaXplX3Qgc2Z0cF9yZWFk
KExJQlNTSDJfU0ZUUF9IQU5ETEUgKiBoYW5kbGUsIGNoYXIgKmJ1ZmZlciwKICAgICAgICAgICAg
ICAgICAvKiBtb3JlIGRhdGEgd2lsbCBiZSBhc2tlZCBmb3IgdGhhbiB3aGF0IHRoZSB3aW5kb3cg
Y3VycmVudGx5CiAgICAgICAgICAgICAgICAgICAgYWxsb3dzLCBleHBhbmQgaXQhICovCiAKLSAg
ICAgICAgICAgICAgICBpZih0b3RhbF9yZWFkKQotICAgICAgICAgICAgICAgICAgICAvKiBzaW5j
ZSB3ZSByaXNrIGdldHRpbmcgRUFHQUlOIGJlbG93LCB3ZSByZXR1cm4gaGVyZSBpZgotICAgICAg
ICAgICAgICAgICAgICAgICB0aGVyZSBpcyBkYXRhIGF2YWlsYWJsZSAqLwotICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gdG90YWxfcmVhZDsKLQogICAgICAgICAgICAgICAgIHJjID0gX2xpYnNz
aDJfY2hhbm5lbF9yZWNlaXZlX3dpbmRvd19hZGp1c3Qoc2Z0cC0+Y2hhbm5lbCwKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9y
ZWFkX2FoZWFkKjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAwLCBOVUxMKTsKQEAgLTEyNTAsMTAgKzEyNDUsNiBAQCBzdGF0aWMg
c3NpemVfdCBzZnRwX3JlYWQoTElCU1NIMl9TRlRQX0hBTkRMRSAqIGhhbmRsZSwgY2hhciAqYnVm
ZmVyLAogCiAgICAgICAgIHdoaWxlKGNodW5rKSB7CiAgICAgICAgICAgICBpZihjaHVuay0+bGVm
dHRvc2VuZCkgewotICAgICAgICAgICAgICAgIGlmKHRvdGFsX3JlYWQpCi0gICAgICAgICAgICAg
ICAgICAgIC8qIHNpbmNlIHdlIHJpc2sgZ2V0dGluZyBFQUdBSU4gYmVsb3csIHdlIHJldHVybiBo
ZXJlIGlmCi0gICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlICov
Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbF9yZWFkOwogCiAgICAgICAgICAgICAg
ICAgcmMgPSBfbGlic3NoMl9jaGFubmVsX3dyaXRlKGNoYW5uZWwsIDAsCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaHVuay0+cGFja2V0W2NodW5rLT5zZW50
XSwKQEAgLTEyOTgsMTEgKzEyODksNiBAQCBzdGF0aWMgc3NpemVfdCBzZnRwX3JlYWQoTElCU1NI
Ml9TRlRQX0hBTkRMRSAqIGhhbmRsZSwgY2hhciAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAg
IGZvciBhbiBBQ0sgZm9yIGl0IGp1c3QgeWV0ICovCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAK
LSAgICAgICAgICAgIGlmKHRvdGFsX3JlYWQpCi0gICAgICAgICAgICAgICAgLyogc2luY2Ugd2Ug
cmlzayBnZXR0aW5nIEVBR0FJTiBiZWxvdywgd2UgcmV0dXJuIGhlcmUgaWYgdGhlcmUKLSAgICAg
ICAgICAgICAgICAgICBpcyBkYXRhIGF2YWlsYWJsZSAqLwotICAgICAgICAgICAgICAgIHJldHVy
biB0b3RhbF9yZWFkOwotCiAgICAgICAgICAgICByYyA9IHNmdHBfcGFja2V0X3JlcXVpcmV2KHNm
dHAsIDIsIHJlYWRfcmVzcG9uc2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjaHVuay0+cmVxdWVzdF9pZCwgJmRhdGEsICZkYXRhX2xlbik7CiAgICAgICAgICAgICBp
ZiAocmMgPCAwKSB7CkBAIC0xMzI2LDcgKzEzMTIsNyBAQCBzdGF0aWMgc3NpemVfdCBzZnRwX3Jl
YWQoTElCU1NIMl9TRlRQX0hBTkRMRSAqIGhhbmRsZSwgY2hhciAqYnVmZmVyLAogCiAgICAgICAg
ICAgICAgICAgaWYgKHJjMzIgPT0gTElCU1NIMl9GWF9FT0YpIHsKICAgICAgICAgICAgICAgICAg
ICAgZmlsZXAtPmVvZiA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbF9y
ZWFkOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICB9CiAg
ICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNmdHAtPmxhc3RfZXJy
bm8gPSByYzMyOwpAQCAtMTM0OCwxMyArMTMzNCwxMyBAQCBzdGF0aWMgc3NpemVfdCBzZnRwX3Jl
YWQoTElCU1NIMl9TRlRQX0hBTkRMRSAqIGhhbmRsZSwgY2hhciAqYnVmZmVyLAogICAgICAgICAg
ICAgICAgICAgICBmaWxlcC0+b2Zmc2V0X3NlbnQgLT0gKGNodW5rLT5sZW4gLSByYzMyKTsKICAg
ICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZih0b3RhbF9yZWFkICsgcmMzMiA+
IGJ1ZmZlcl9zaXplKSB7CisgICAgICAgICAgICAgICAgaWYocmMzMiA+IGJ1ZmZlcl9zaXplKSB7
CiAgICAgICAgICAgICAgICAgICAgIC8qIGZpZ3VyZSBvdXQgdGhlIG92ZXJsYXAgYW1vdW50ICov
Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVwLT5kYXRhX2xlZnQgPSAodG90YWxfcmVhZCArIHJj
MzIpIC0gYnVmZmVyX3NpemU7CisgICAgICAgICAgICAgICAgICAgIGZpbGVwLT5kYXRhX2xlZnQg
PSByYzMyIC0gYnVmZmVyX3NpemU7CiAKICAgICAgICAgICAgICAgICAgICAgLyogZ2V0dGluZyB0
aGUgZnVsbCBwYWNrZXQgd291bGQgb3ZlcmZsb3cgdGhlIGJ1ZmZlciwgc28KICAgICAgICAgICAg
ICAgICAgICAgICAgb25seSBnZXQgdGhlIGNvcnJlY3QgYW1vdW50IGFuZCBrZWVwIHRoZSByZW1h
aW5kZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgcmMzMiA9ICh1aW50MzJfdCkoYnVmZmVyX3Np
emUgLSB0b3RhbF9yZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgcmMzMiA9ICh1aW50MzJfdCli
dWZmZXJfc2l6ZTsKIAogICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBkYXRhIHRvIGtlZXAg
Zm9yIG5leHQgY2FsbCAqLwogICAgICAgICAgICAgICAgICAgICBmaWxlcC0+ZGF0YSA9IGRhdGE7
CkBAIC0xMzY1LDM5ICsxMzUxLDQ2IEBAIHN0YXRpYyBzc2l6ZV90IHNmdHBfcmVhZChMSUJTU0gy
X1NGVFBfSEFORExFICogaGFuZGxlLCBjaGFyICpidWZmZXIsCiAKICAgICAgICAgICAgICAgICAv
KiBjb3B5IHRoZSByZWNlaXZlZCBkYXRhIGZyb20gdGhlIHJlY2VpdmVkIEZYUF9EQVRBIHBhY2tl
dCB0bwogICAgICAgICAgICAgICAgICAgIHRoZSBidWZmZXIgYXQgdGhlIGNvcnJlY3QgaW5kZXgg
Ki8KLSAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyICsgdG90YWxfcmVhZCwgZGF0YSArIDks
IHJjMzIpOworICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXIsIGRhdGEgKyA5LCByYzMyKTsK
ICAgICAgICAgICAgICAgICBmaWxlcC0+b2Zmc2V0ICs9IHJjMzI7Ci0gICAgICAgICAgICAgICAg
dG90YWxfcmVhZCArPSByYzMyOwogCi0gICAgICAgICAgICAgICAgaWYoIWZpbGVwLT5kYXRhX2xl
bikKKyAgICAgICAgICAgICAgICBpZihmaWxlcC0+ZGF0YV9sZW4gPT0gMCkKICAgICAgICAgICAg
ICAgICAgICAgLyogZnJlZSB0aGUgYWxsb2NhdGVkIGRhdGEgaWYgbm90IHN0b3JlZCB0byBrZWVw
ICovCiAgICAgICAgICAgICAgICAgICAgIExJQlNTSDJfRlJFRShzZXNzaW9uLCBkYXRhKTsKLSAg
ICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyogZm9yY2UgdGhlIGxv
b3AgdG8gZW5kIHNpbmNlIHRoZSByZWNlaXZlIGJ1ZmZlciBpcyBmdWxsCi0gICAgICAgICAgICAg
ICAgICAgICAgIGFscmVhZHksIGJ1dCByZW1vdmUgdGhpcyBjaHVuayBmcm9tIHRoZSBsaXN0IGZp
cnN0ICovCi0gICAgICAgICAgICAgICAgICAgIF9saWJzc2gyX2xpc3RfcmVtb3ZlKCZjaHVuay0+
bm9kZSk7IC8qIHJlbW92ZSBmcm9tIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgTElCU1NI
Ml9GUkVFKHNlc3Npb24sIGNodW5rKTsgLyogZnJlZSBtZW1vcnkgKi8KIAotICAgICAgICAgICAg
ICAgICAgICBjaHVuayA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgICAgICAgICAgLyogcmVtb3ZlIHRoZSBjaHVuayB3ZSBqdXN0IHByb2Nlc3NlZCBrZWVw
aW5nIHRyYWNrIG9mIHRoZQorICAgICAgICAgICAgICAgICAqIG5leHQgb25lIGluIGNhc2Ugd2Ug
bmVlZCBpdCAqLworICAgICAgICAgICAgICAgIG5leHQgPSBfbGlic3NoMl9saXN0X25leHQoJmNo
dW5rLT5ub2RlKTsKKyAgICAgICAgICAgICAgICBfbGlic3NoMl9saXN0X3JlbW92ZSgmY2h1bmst
Pm5vZGUpOworICAgICAgICAgICAgICAgIExJQlNTSDJfRlJFRShzZXNzaW9uLCBjaHVuayk7Cisg
ICAgICAgICAgICAgICAgY2h1bmsgPSBOVUxMOworCisgICAgICAgICAgICAgICAgaWYocmMzMiA+
IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogd2UgbXVzdCByZXR1cm4gYXMgd2Ugd3JvdGUg
c29tZSBkYXRhIHRvIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJj
MzI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQSB6
ZXJvLWJ5dGUgcmVhZCBpcyBub3QgbmVjZXNzYXJpbHkgRU9GIHNvIHdlIG11c3Qgbm90CisgICAg
ICAgICAgICAgICAgICAgICAqIHJldHVybiAwICh0aGF0IHdvdWxkIHNpZ25hbCBFT0YgdG8gdGhl
IGNhbGxlcikgc28KKyAgICAgICAgICAgICAgICAgICAgICogaW5zdGVhZCB3ZSBjYXJyeSBvbiB0
byB0aGUgbmV4dCBjaHVuayAqLworICAgICAgICAgICAgICAgICAgICBjaHVuayA9IG5leHQ7CiAg
ICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBfbGlic3NoMl9lcnJvcihzZXNzaW9uLCBM
SUJTU0gyX0VSUk9SX1NGVFBfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJTRlRQIFByb3RvY29sIGJhZG5lc3M6IHVucmVjb2duaXNlZCAiCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkIHJlcXVlc3QgcmVzcG9uc2UiKTsK
ICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbmV4dCA9IF9saWJzc2gyX2xpc3RfbmV4dCgm
Y2h1bmstPm5vZGUpOwotCi0gICAgICAgICAgICBfbGlic3NoMl9saXN0X3JlbW92ZSgmY2h1bmst
Pm5vZGUpOyAvKiByZW1vdmUgZnJvbSBsaXN0ICovCi0gICAgICAgICAgICBMSUJTU0gyX0ZSRUUo
c2Vzc2lvbiwgY2h1bmspOyAvKiBmcmVlIG1lbW9yeSAqLwotCi0gICAgICAgICAgICBjaHVuayA9
IG5leHQ7CiAgICAgICAgIH0KKwogICAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6CiAgICAg
ICAgIGFzc2VydCghIlN0YXRlIG1hY2hpbmUgZXJyb3I7IHVucmVjb2duaXNlZCByZWFkIHN0YXRl
Iik7CiAgICAgfQogCi0gICAgcmV0dXJuIHRvdGFsX3JlYWQ7CisgICAgcmV0dXJuIDA7CiB9CiAK
IC8qIGxpYnNzaDJfc2Z0cF9yZWFkCi0tIAoxLjcuOC5tc3lzZ2l0LjAKCg==
--20cf3074b440ba877504b87e1b1e
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--20cf3074b440ba877504b87e1b1e--

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 12:15:48 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19BFUvW011314;
	Thu, 9 Feb 2012 12:15:45 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q19BFS4j011301
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 12:15:28 +0100
Received: (qmail 27774 invoked by uid 501); 9 Feb 2012 11:15:28 -0000
Message-ID: <20120209111528.27773.qmail@stuge.se>
Date: Thu, 9 Feb 2012 12:15:28 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: SFTP issues
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Alexander Lamaison wrote:
> The changes are more extensive that I'd planned so I'd appreciate some
> careful review.  Basically, the total_read variable turned out to be
> completely pointless.

Yes. What about the loop? It's kept for the chunk stuff, so that
libssh2_sftp_read() never returns 0 bytes to the caller unless EOF?

I think it would be nice to return EAGAIN if we read 0 bytes from
transport.


> @@ -1348,13 +1334,13 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer,
>                      filep->offset_sent -= (chunk->len - rc32);
>                  }
>  
> -                if(total_read + rc32 > buffer_size) {
> +                if(rc32 > buffer_size) {
>                      /* figure out the overlap amount */
> -                    filep->data_left = (total_read + rc32) - buffer_size;
> +                    filep->data_left = rc32 - buffer_size;

Doesn't this lose the bytes that we received from transport but which
do not fit into the buffer given to us by the user?


> +                /* remove the chunk we just processed keeping track of the
> +                 * next one in case we need it */
> +                next = _libssh2_list_next(&chunk->node);
> +                _libssh2_list_remove(&chunk->node);
> +                LIBSSH2_FREE(session, chunk);
> +                chunk = NULL;
> +
> +                if(rc32 > 0) {
> +                    /* we must return as we wrote some data to the buffer */
> +                    return rc32;
> +                } else {
> +                    /* A zero-byte read is not necessarily EOF so we must not
> +                     * return 0 (that would signal EOF to the caller) so
> +                     * instead we carry on to the next chunk */
> +                    chunk = next;
>                  }

Here I suggest return EAGAIN instead of having the loop and chunk
messyness.


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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 13:06:40 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19C6J9V019037;
	Thu, 9 Feb 2012 13:06:30 +0100
Received: from mail-qy0-f182.google.com (mail-qy0-f182.google.com
	[209.85.216.182])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19C6HFP018997
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 13:06:18 +0100
Received: by qcmt40 with SMTP id t40so1097095qcm.41
	for <libssh2-devel@cool.haxx.se>; Thu, 09 Feb 2012 04:06:13 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type
	:content-transfer-encoding;
	bh=hCPWr/cOc2WHa7KJIRdNdOrTSpEtcUYcbAo7ngc93mI=;
	b=JfJfg61J9BZgytct3FkkZOgILjwGdE9mhZ0O3oL7j5+5jb7vSiZ2BdBWGufi8U4TBn
	Vfcs3+w5QtKpLzzDnmoutLeSlhbz54jgY7BkvU3L2mLbXjamltGw8LNCrLomVJJUlP0Q
	X0GJAqFCF74n3kZv9vwXRPuKuGfgkxrmKyFRk=
MIME-Version: 1.0
Received: by 10.229.77.72 with SMTP id f8mr1070750qck.34.1328789173403; Thu,
	09 Feb 2012 04:06:13 -0800 (PST)
Received: by 10.229.144.211 with HTTP; Thu, 9 Feb 2012 04:06:13 -0800 (PST)
In-Reply-To: <20120209111528.27773.qmail@stuge.se>
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
Date: Thu, 9 Feb 2012 12:06:13 +0000
X-Google-Sender-Auth: PiOVnmCsfVr1h3rBjslolv8ZjPM
Message-ID: <CADyPeTP_9AjvBAOXCihQXMiF7obTZgNkrY=G7jF8BSM4uWG+bw@mail.gmail.com>
Subject: Re: SFTP issues
From: Alexander Lamaison <swish@lammy.co.uk>
To: libssh2 development <libssh2-devel@cool.haxx.se>
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id
	q19C6HFP018997
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-1"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id q19C6J9V019037

On 9 February 2012 11:15, Peter Stuge <peter@stuge.se> wrote:
> Alexander Lamaison wrote:
>> The changes are more extensive that I'd planned so I'd appreciate some
>> careful review.  Basically, the total_read variable turned out to be
>> completely pointless.
>
> Yes. What about the loop? It's kept for the chunk stuff, so that
> libssh2_sftp_read() never returns 0 bytes to the caller unless EOF?

Yes.  Originally I got rid of the loop but then realised we might read 0.

> I think it would be nice to return EAGAIN if we read 0 bytes from
> transport.

I like this idea.  That would be cleaner and might remove the weird
situation where we return 0 at the end of the function without it
being EOF.

>> @@ -1348,13 +1334,13 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer,
>>                      filep->offset_sent -= (chunk->len - rc32);
>>                  }
>>
>> -                if(total_read + rc32 > buffer_size) {
>> +                if(rc32 > buffer_size) {
>>                      /* figure out the overlap amount */
>> -                    filep->data_left = (total_read + rc32) - buffer_size;
>> +                    filep->data_left = rc32 - buffer_size;
>
> Doesn't this lose the bytes that we received from transport but which
> do not fit into the buffer given to us by the user?

Not unless it did so before.  total_read was always 0 at this point so
the changes shouldn't make any difference.

>> +                /* remove the chunk we just processed keeping track of the
>> +                 * next one in case we need it */
>> +                next = _libssh2_list_next(&chunk->node);
>> +                _libssh2_list_remove(&chunk->node);
>> +                LIBSSH2_FREE(session, chunk);
>> +                chunk = NULL;
>> +
>> +                if(rc32 > 0) {
>> +                    /* we must return as we wrote some data to the buffer */
>> +                    return rc32;
>> +                } else {
>> +                    /* A zero-byte read is not necessarily EOF so we must not
>> +                     * return 0 (that would signal EOF to the caller) so
>> +                     * instead we carry on to the next chunk */
>> +                    chunk = next;
>>                  }
>
> Here I suggest return EAGAIN instead of having the loop and chunk
> messyness.

I'll try this out tonight.

Alex

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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 13:28:01 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19CRjm7031327;
	Thu, 9 Feb 2012 13:27:59 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q19CRhuY031322
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 13:27:43 +0100
Received: (qmail 1149 invoked by uid 501); 9 Feb 2012 12:27:43 -0000
Message-ID: <20120209122743.1148.qmail@stuge.se>
Date: Thu, 9 Feb 2012 13:27:43 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: SFTP issues
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<CADyPeTP_9AjvBAOXCihQXMiF7obTZgNkrY=G7jF8BSM4uWG+bw@mail.gmail.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <CADyPeTP_9AjvBAOXCihQXMiF7obTZgNkrY=G7jF8BSM4uWG+bw@mail.gmail.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from base64 to 8bit by giant.haxx.se id q19CRjm7031327

Alexander Lamaison wrote:
> >> @@ -1348,13 +1334,13 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer,
> >> Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â filep->offset_sent -= (chunk->len - rc32);
> >> Â  Â  Â  Â  Â  Â  Â  Â  Â }
> >>
> >> - Â  Â  Â  Â  Â  Â  Â  Â if(total_read + rc32 > buffer_size) {
> >> + Â  Â  Â  Â  Â  Â  Â  Â if(rc32 > buffer_size) {
> >> Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â /* figure out the overlap amount */
> >> - Â  Â  Â  Â  Â  Â  Â  Â  Â  Â filep->data_left = (total_read + rc32) - buffer_size;
> >> + Â  Â  Â  Â  Â  Â  Â  Â  Â  Â filep->data_left = rc32 - buffer_size;
> >
> > Doesn't this lose the bytes that we received from transport but which
> > do not fit into the buffer given to us by the user?
> 
> Not unless it did so before.

Sure. Look at the logic. data_left is being set to a smaller number
of bytes than actually received from transport. Where do the
remaining bytes go?


> > suggest return EAGAIN instead of having the loop and chunk
> 
> I'll try this out tonight.

Cool.


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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 14:17:57 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19DHhos032648;
	Thu, 9 Feb 2012 14:17:54 +0100
Received: from mail-qy0-f182.google.com (mail-qy0-f182.google.com
	[209.85.216.182])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19DHfBM032623
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 14:17:42 +0100
Received: by qcmt40 with SMTP id t40so1137559qcm.41
	for <libssh2-devel@cool.haxx.se>; Thu, 09 Feb 2012 05:17:37 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type
	:content-transfer-encoding;
	bh=+8XktyVjG0Tp4Fri7F6HX2h11WjLlO5VY3wvhJMoY2c=;
	b=W3ZVTE2ICkDbIusds5XESnSXUtHCZ/3oAUKPkWoKEEVs4CMFXByZsNYnSvhU+p71bv
	wkQN5CMhL115rvQA0cd0NQ9z2ErhTxV1117CbPsR9mE7ROOCAaDqLvJmTkuxproEI2sk
	F1zI6MmIU6GXsTUC4CXCphQaqzpfRT5K2rgTk=
MIME-Version: 1.0
Received: by 10.229.78.159 with SMTP id l31mr1179423qck.114.1328793456996;
	Thu, 09 Feb 2012 05:17:36 -0800 (PST)
Received: by 10.229.144.211 with HTTP; Thu, 9 Feb 2012 05:17:36 -0800 (PST)
In-Reply-To: <20120209122743.1148.qmail@stuge.se>
References: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<CADyPeTP_9AjvBAOXCihQXMiF7obTZgNkrY=G7jF8BSM4uWG+bw@mail.gmail.com>
	<20120209122743.1148.qmail@stuge.se>
Date: Thu, 9 Feb 2012 13:17:36 +0000
X-Google-Sender-Auth: Xgy77tvYY_QRE2ecnsC6gIaKRq0
Message-ID: <CADyPeTN5kwqnFy77dkuEnntaPe=a+4iiLbhsa_LS3mjz6S63AA@mail.gmail.com>
Subject: Re: SFTP issues
From: Alexander Lamaison <swish@lammy.co.uk>
To: libssh2 development <libssh2-devel@cool.haxx.se>
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id
	q19DHfBM032623
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-1"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id q19DHhos032648

On 9 February 2012 12:27, Peter Stuge <peter@stuge.se> wrote:
> Alexander Lamaison wrote:
>> >> @@ -1348,13 +1334,13 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * handle, char *buffer,
>> >>                      filep->offset_sent -= (chunk->len - rc32);
>> >>                  }
>> >>
>> >> -                if(total_read + rc32 > buffer_size) {
>> >> +                if(rc32 > buffer_size) {
>> >>                      /* figure out the overlap amount */
>> >> -                    filep->data_left = (total_read + rc32) - buffer_size;
>> >> +                    filep->data_left = rc32 - buffer_size;
>> >
>> > Doesn't this lose the bytes that we received from transport but which
>> > do not fit into the buffer given to us by the user?
>>
>> Not unless it did so before.
>
> Sure. Look at the logic. data_left is being set to a smaller number
> of bytes than actually received from transport. Where do the
> remaining bytes go?

Right.  That's its purpose, isn't it?  It stores how big the leftovers
are.  Why would that be >= the number of bytes received from the
transport?

Alex

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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 14:38:24 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19DcBCO015899;
	Thu, 9 Feb 2012 14:38:23 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q19Dc9xW015885
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 14:38:09 +0100
Received: (qmail 7274 invoked by uid 501); 9 Feb 2012 13:38:10 -0000
Message-ID: <20120209133810.7273.qmail@stuge.se>
Date: Thu, 9 Feb 2012 14:38:10 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: SFTP issues
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<CADyPeTP_9AjvBAOXCihQXMiF7obTZgNkrY=G7jF8BSM4uWG+bw@mail.gmail.com>
	<20120209122743.1148.qmail@stuge.se>
	<CADyPeTN5kwqnFy77dkuEnntaPe=a+4iiLbhsa_LS3mjz6S63AA@mail.gmail.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <CADyPeTN5kwqnFy77dkuEnntaPe=a+4iiLbhsa_LS3mjz6S63AA@mail.gmail.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from base64 to 8bit by giant.haxx.se id q19DcBCO015899

Alexander Lamaison wrote:
> >> >> + Â  Â  Â  Â  Â  Â  Â  Â  Â  Â filep->data_left = rc32 - buffer_size;
> >> >
> >> > Doesn't this lose the bytes that we received from transport but which
> >> > do not fit into the buffer given to us by the user?
> >>
> >> Not unless it did so before.
> >
> > Sure. Look at the logic. data_left is being set to a smaller number
> > of bytes than actually received from transport. Where do the
> > remaining bytes go?
> 
> Right.  That's its purpose, isn't it?  It stores how big the
> leftovers are.

Yes, you're of course right. Thanks for the patience. Looking forward
to the patch without loop! (Is there a reason not to squash it
together with your previous changes?)


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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 14:43:21 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19DhHXi021998;
	Thu, 9 Feb 2012 14:43:21 +0100
Received: from mail-qy0-f182.google.com (mail-qy0-f182.google.com
	[209.85.216.182])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19DhEf8021944
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 14:43:15 +0100
Received: by qcmt40 with SMTP id t40so1154335qcm.41
	for <libssh2-devel@cool.haxx.se>; Thu, 09 Feb 2012 05:43:10 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type
	:content-transfer-encoding;
	bh=/83rcSbagxfetZqrGQzeYU2vmoWNU1ZBHmfWO0wDCFc=;
	b=nRU+yH+F7CDbIfDWqGs0So4M5LkrfqdiHgaI9ROe/sVWwJMGJztiW26u1NDhQ82pOS
	zRtoB2HAT74YKkzmLLn0cOTcz5eRPgzYYQj/pL7222cNNsYXpoDVEFQWX16S5rjiOl9c
	duO52S1KoVj7o2fOaDiEM3EeZ4Vn/s6fsmHZo=
MIME-Version: 1.0
Received: by 10.229.76.89 with SMTP id b25mr1262915qck.54.1328794990822; Thu,
	09 Feb 2012 05:43:10 -0800 (PST)
Received: by 10.229.144.211 with HTTP; Thu, 9 Feb 2012 05:43:10 -0800 (PST)
In-Reply-To: <20120209133810.7273.qmail@stuge.se>
References: <alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<CADyPeTP_9AjvBAOXCihQXMiF7obTZgNkrY=G7jF8BSM4uWG+bw@mail.gmail.com>
	<20120209122743.1148.qmail@stuge.se>
	<CADyPeTN5kwqnFy77dkuEnntaPe=a+4iiLbhsa_LS3mjz6S63AA@mail.gmail.com>
	<20120209133810.7273.qmail@stuge.se>
Date: Thu, 9 Feb 2012 13:43:10 +0000
X-Google-Sender-Auth: Puys8VQMcuiF6OqWZmgS7HAZz4I
Message-ID: <CADyPeTM6ccpR+KnZ9xpTuZ5wdZK_48XM5MDR9YDJRe+xWE4uUA@mail.gmail.com>
Subject: Re: SFTP issues
From: Alexander Lamaison <swish@lammy.co.uk>
To: libssh2 development <libssh2-devel@cool.haxx.se>
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id
	q19DhEf8021944
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-1"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id q19DhHXi021998

On 9 February 2012 13:38, Peter Stuge <peter@stuge.se> wrote:
> Alexander Lamaison wrote:
>> >> >> +                    filep->data_left = rc32 - buffer_size;
>> >> >
>> >> > Doesn't this lose the bytes that we received from transport but which
>> >> > do not fit into the buffer given to us by the user?
>> >>
>> >> Not unless it did so before.
>> >
>> > Sure. Look at the logic. data_left is being set to a smaller number
>> > of bytes than actually received from transport. Where do the
>> > remaining bytes go?
>>
>> Right.  That's its purpose, isn't it?  It stores how big the
>> leftovers are.
>
> Yes, you're of course right. Thanks for the patience. Looking forward
> to the patch without loop! (Is there a reason not to squash it
> together with your previous changes?)

In two words, git bisect.  The smaller the change, the more precisely
we can attribute the blame should something go wrong.

Alex

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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 14:47:25 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19DlM3M024648;
	Thu, 9 Feb 2012 14:47:24 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q19DlLpo024631
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 14:47:21 +0100
Received: (qmail 8090 invoked by uid 501); 9 Feb 2012 13:47:22 -0000
Message-ID: <20120209134722.8089.qmail@stuge.se>
Date: Thu, 9 Feb 2012 14:47:22 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: SFTP issues
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<CADyPeTP_9AjvBAOXCihQXMiF7obTZgNkrY=G7jF8BSM4uWG+bw@mail.gmail.com>
	<20120209122743.1148.qmail@stuge.se>
	<CADyPeTN5kwqnFy77dkuEnntaPe=a+4iiLbhsa_LS3mjz6S63AA@mail.gmail.com>
	<20120209133810.7273.qmail@stuge.se>
	<CADyPeTM6ccpR+KnZ9xpTuZ5wdZK_48XM5MDR9YDJRe+xWE4uUA@mail.gmail.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <CADyPeTM6ccpR+KnZ9xpTuZ5wdZK_48XM5MDR9YDJRe+xWE4uUA@mail.gmail.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Alexander Lamaison wrote:
> > Is there a reason not to squash it together with your previous changes?
> 
> In two words, git bisect.

It's still just one logical change, right? Fixing up the way
sftp_read returns data?


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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 14:49:14 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19Dn9r6025398;
	Thu, 9 Feb 2012 14:49:14 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19Dn7Cl025391
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 14:49:07 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q19Dn7kC025387
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 14:49:07 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Thu, 9 Feb 2012 14:49:07 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: SFTP issues
In-Reply-To: <20120209111528.27773.qmail@stuge.se>
Message-ID: <alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
References: <CADyPeTOqeJV9SfCy8U5pDtC6a0n3GJ5LxoZ-QCYhBVkiFSwxdQ@mail.gmail.com>
	<alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Thu, 9 Feb 2012, Peter Stuge wrote:

> I think it would be nice to return EAGAIN if we read 0 bytes from transport.

I don't. EAGAIN is only ever introduced in the transport layer when there's 
actually an EAGAIN from the socket layer. Introducing it elsewhere has always 
only introduced badness in the past and we've had to backpedal out from that 
several times.

For example, EAGAIN implies that you need to call the same function again to 
make it "finish" what was previously started while 0 means that it wasn't 
abruptly stopped in the middle of something that needs to be continued but 
that other functions may very well be used.

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 14:50:05 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19Do4iG026221;
	Thu, 9 Feb 2012 14:50:05 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19Do2PM026035
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 14:50:02 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q19Do2jc025964
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 14:50:02 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Thu, 9 Feb 2012 14:50:02 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: SFTP issues
In-Reply-To: <20120209134722.8089.qmail@stuge.se>
Message-ID: <alpine.DEB.2.00.1202091449150.18645@tvnag.unkk.fr>
References: <CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<CADyPeTP_9AjvBAOXCihQXMiF7obTZgNkrY=G7jF8BSM4uWG+bw@mail.gmail.com>
	<20120209122743.1148.qmail@stuge.se>
	<CADyPeTN5kwqnFy77dkuEnntaPe=a+4iiLbhsa_LS3mjz6S63AA@mail.gmail.com>
	<20120209133810.7273.qmail@stuge.se>
	<CADyPeTM6ccpR+KnZ9xpTuZ5wdZK_48XM5MDR9YDJRe+xWE4uUA@mail.gmail.com>
	<20120209134722.8089.qmail@stuge.se>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Thu, 9 Feb 2012, Peter Stuge wrote:

>> In two words, git bisect.
>
> It's still just one logical change, right? Fixing up the way sftp_read 
> returns data?

They're iterations, so I think keeping them separate is fine as otherwise 
it'll be a rather huge single change that replaces pretty much the whole 
function at once.

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 15:06:32 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19E6OEv005750;
	Thu, 9 Feb 2012 15:06:31 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q19E6MKH005741
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 15:06:22 +0100
Received: (qmail 9607 invoked by uid 501); 9 Feb 2012 14:06:23 -0000
Message-ID: <20120209140623.9606.qmail@stuge.se>
Date: Thu, 9 Feb 2012 15:06:23 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: SFTP issues
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Daniel Stenberg wrote:
>> I think it would be nice to return EAGAIN if we read 0 bytes from 
>> transport.
>
> I don't. EAGAIN is only ever introduced in the transport layer when
> there's actually an EAGAIN from the socket layer. Introducing it
> elsewhere has always only introduced badness in the past and we've
> had to backpedal out from that several times.

It seems to me that the semantics are correct in this case.


> For example, EAGAIN implies that you need to call the same function
> again to make it "finish" what was previously started while 0 means
> that it wasn't abruptly stopped in the middle of something that
> needs to be continued but that other functions may very well be
> used.

Except sftp_read() returning 0 means EOF, unlike for the channel
functions. Just use EAGAIN and avoid recreating the complexity inside
the SFTP layer when the above layer handles the case anyway.


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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 15:07:31 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19E7UEi006251;
	Thu, 9 Feb 2012 15:07:31 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q19E7TGU006227
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 15:07:29 +0100
Received: (qmail 9733 invoked by uid 501); 9 Feb 2012 14:07:30 -0000
Message-ID: <20120209140730.9732.qmail@stuge.se>
Date: Thu, 9 Feb 2012 15:07:30 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: SFTP issues
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<CADyPeTP_9AjvBAOXCihQXMiF7obTZgNkrY=G7jF8BSM4uWG+bw@mail.gmail.com>
	<20120209122743.1148.qmail@stuge.se>
	<CADyPeTN5kwqnFy77dkuEnntaPe=a+4iiLbhsa_LS3mjz6S63AA@mail.gmail.com>
	<20120209133810.7273.qmail@stuge.se>
	<CADyPeTM6ccpR+KnZ9xpTuZ5wdZK_48XM5MDR9YDJRe+xWE4uUA@mail.gmail.com>
	<20120209134722.8089.qmail@stuge.se>
	<alpine.DEB.2.00.1202091449150.18645@tvnag.unkk.fr>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1202091449150.18645@tvnag.unkk.fr>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Daniel Stenberg wrote:
>>> In two words, git bisect.
>>
>> It's still just one logical change, right? Fixing up the way sftp_read 
>> returns data?
>
> They're iterations, so I think keeping them separate is fine as otherwise 
> it'll be a rather huge single change that replaces pretty much the whole 
> function at once.

Perfectly fine, and actually the only right way, when intermediate
commits introduce code which is replaced by later ones.


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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 15:43:49 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19EhVqk000443;
	Thu, 9 Feb 2012 15:43:46 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19EhU0t000437
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 15:43:30 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q19EhTsZ000433
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 15:43:29 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Thu, 9 Feb 2012 15:43:29 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: SFTP issues
In-Reply-To: <20120209140623.9606.qmail@stuge.se>
Message-ID: <alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
References: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
	<20120209140623.9606.qmail@stuge.se>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Thu, 9 Feb 2012, Peter Stuge wrote:

>> For example, EAGAIN implies that you need to call the same function
>> again to make it "finish" what was previously started while 0 means
>> that it wasn't abruptly stopped in the middle of something that
>> needs to be continued but that other functions may very well be
>> used.
>
> Except sftp_read() returning 0 means EOF, unlike for the channel functions.

I'm not sure we're ready to make that promise in the API and statement in the 
documentation. I'd rather say that returning 0 might mean EOF.

> Just use EAGAIN and avoid recreating the complexity inside the SFTP layer 
> when the above layer handles the case anyway.

Sorry, I missed what simplicity you gain with EAGAIN instead of 0?

As I read it (and I'm not 100% sure we're talking about the same code now), it 
would be the perfect example where EAGAIN would be wrong since there could 
possibly be data already drained from the socket and kept internally by 
libssh2 and EAGAIN would then wrongly lure the application to wait for the 
socket again while in reality there is data to handle already.

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 15:48:05 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19Em31d003305;
	Thu, 9 Feb 2012 15:48:04 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19Em2YH003262
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 15:48:02 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q19Em1Ke003216
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 15:48:01 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Thu, 9 Feb 2012 15:48:01 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: SFTP issues
In-Reply-To: <alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
Message-ID: <alpine.DEB.2.00.1202091547420.18645@tvnag.unkk.fr>
References: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
	<20120209140623.9606.qmail@stuge.se>
	<alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Thu, 9 Feb 2012, Daniel Stenberg wrote:

> I'm not sure we're ready to make that promise in the API and statement in 
> the documentation. I'd rather say that returning 0 might mean EOF.

Or do we already say 0 means EOF?

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb  9 16:00:27 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19F0JHA011217;
	Thu, 9 Feb 2012 16:00:27 +0100
Received: from mail0.avcosystems.co.uk (mail0.avcosystems.co.uk
	[195.224.236.86])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q19F0HLn011077
	(version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 9 Feb 2012 16:00:17 +0100
Received: from lexx.avco ([192.168.0.1] helo=lyta)
	by mail0.avcosystems.co.uk with esmtp (Exim 4.69 #1 (Debian))
	(envelope-from <mts-filtered@avcosystems.co.uk>) id 1RvVTa-0008AN-Ub
	for <libssh2-devel@cool.haxx.se>; Thu, 09 Feb 2012 14:59:59 +0000
From: "Mark Smith" <mts-filtered@avcosystems.co.uk>
To: "'libssh2 development'" <libssh2-devel@cool.haxx.se>
References: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr><CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com><alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr><alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr><CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com><alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr><CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com><CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com><20120209111528.27773.qmail@stuge.se><alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr><20120209140623.9606.qmail@stuge.se><alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202091547420.18645@tvnag.unkk.fr>
Subject: RE: SFTP issues
Date: Thu, 9 Feb 2012 15:00:14 -0000
Keywords: Not filed
Message-ID: <FD7412C4830543B38487CCFAA194F5D9@internal.avcosystems.com>
MIME-Version: 1.0
X-Mailer: Microsoft Office Outlook 11
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157
thread-index: AcznOdILfAm3r77pR1m4XfukSiNWewAAPHyg
In-Reply-To: <alpine.DEB.2.00.1202091547420.18645@tvnag.unkk.fr>
X-AVCO-Scan-Signature: 3cdb0c1b4273759171d666cbec1fbf36
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Daniel Stenberg wrote:

> Or do we already say 0 means EOF?

The documentation on the website states that libssh2_sftp_read() is modelled
on the POSIX read(2) function, which has always returned 0 to indicate EOF.

My own code has always assumed this to be the case, which is why when I
suddenly started getting zero returns when not EOF I was puzzled and assumed
it to be a bug.  If we had some other way to determine EOF for SFTP then I
might accept that returning zero might not always mean EOF but there's no
obvious function for determining EOF using any other means than returning
zero out of libssh2_sftp_read() - I'm assuming that libssh2_channel_eof()
cannot be used in this case.

If this is as active a discussion as it seems, perhaps it could be more
effectively explored using IRC?

-- 
Mark

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

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 10 14:22:00 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1ADLZJk018833;
	Fri, 10 Feb 2012 14:21:54 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1ADLYll018769
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Fri, 10 Feb 2012 14:21:34 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q1ADLYwV018752
	for <libssh2-devel@cool.haxx.se>; Fri, 10 Feb 2012 14:21:34 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Fri, 10 Feb 2012 14:21:34 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: RE: SFTP issues
In-Reply-To: <FD7412C4830543B38487CCFAA194F5D9@internal.avcosystems.com>
Message-ID: <alpine.DEB.2.00.1202101419580.10678@tvnag.unkk.fr>
References: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr><CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com><alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr><alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr><CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com><alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr><CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com><CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com><20120209111528.27773.qmail@stuge.se><alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr><20120209140623.9606.qmail@stuge.se><alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202091547420.18645@tvnag.unkk.fr>
	<FD7412C4830543B38487CCFAA194F5D9@internal.avcosystems.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Thu, 9 Feb 2012, Mark Smith wrote:

>> Or do we already say 0 means EOF?
>
> The documentation on the website states that libssh2_sftp_read() is modelled 
> on the POSIX read(2) function, which has always returned 0 to indicate EOF.

Sorry, I confused this function with another one when I stated that about the 
return code.

Would anyone mind if I push these three commits now on master to easier allow 
us all to see the complete source and continue working on improving it?

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 10 16:23:29 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1AFN5Ds008435;
	Fri, 10 Feb 2012 16:23:26 +0100
Received: from mail-qy0-f182.google.com (mail-qy0-f182.google.com
	[209.85.216.182])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1AFN3iQ008241
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Fri, 10 Feb 2012 16:23:04 +0100
Received: by qcmt40 with SMTP id t40so2006707qcm.41
	for <libssh2-devel@cool.haxx.se>; Fri, 10 Feb 2012 07:22:59 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type;
	bh=Sg2ztpjViJIRiVNaPHl/PwoexJECssK6xTyFiYoGUxM=;
	b=dOpT8mXNjoF8NiVr+JiyfZcArGdI3Y8pr9Ff1dwzfCw6XNBugH1878BscOxsQ+P9SP
	iU8+3uz0xnveYCEKk/xQAqux5bGXrwuQt+bAr5e3e0LFjgNASWTHptZXpekDYs+abt+F
	YwaHTHiFMTe2ILJA/SH8RLyJ3bK6DonosSUbc=
MIME-Version: 1.0
Received: by 10.229.102.79 with SMTP id f15mr4453114qco.94.1328887379399; Fri,
	10 Feb 2012 07:22:59 -0800 (PST)
Received: by 10.229.144.211 with HTTP; Fri, 10 Feb 2012 07:22:59 -0800 (PST)
In-Reply-To: <alpine.DEB.2.00.1202101419580.10678@tvnag.unkk.fr>
References: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
	<20120209140623.9606.qmail@stuge.se>
	<alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202091547420.18645@tvnag.unkk.fr>
	<FD7412C4830543B38487CCFAA194F5D9@internal.avcosystems.com>
	<alpine.DEB.2.00.1202101419580.10678@tvnag.unkk.fr>
Date: Fri, 10 Feb 2012 15:22:59 +0000
X-Google-Sender-Auth: z_SAtNRyOccXHNsO9Di9HHKbjhg
Message-ID: <CADyPeTO6FfOpmiu68Cch14CEjxTvhUXX5-jy=kHk9kUy5gP8Ow@mail.gmail.com>
Subject: Re: SFTP issues
From: Alexander Lamaison <swish@lammy.co.uk>
To: libssh2 development <libssh2-devel@cool.haxx.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On 10 February 2012 13:21, Daniel Stenberg <daniel@haxx.se> wrote:
>
> Would anyone mind if I push these three commits now on master to easier
> allow us all to see the complete source and continue working on improving
> it?

Not at all; I was going to suggest doing so.  I tested them in my
larger project last night and could read a 32MB image with no problem.

Alex
--
Swish - Easy SFTP for Windows Explorer (http://www.swish-sftp.org)
_______________________________________________
libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel

From libssh2-devel-bounces@cool.haxx.se  Sun Feb 12 22:09:33 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1CL95e6019640;
	Sun, 12 Feb 2012 22:09:27 +0100
Received: from mail-vx0-f182.google.com (mail-vx0-f182.google.com
	[209.85.220.182])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1CL935p019498
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Sun, 12 Feb 2012 22:09:04 +0100
Received: by vcmm1 with SMTP id m1so3952799vcm.41
	for <libssh2-devel@cool.haxx.se>; Sun, 12 Feb 2012 13:08:59 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:from:date:message-id:subject:to:content-type
	:content-transfer-encoding;
	bh=46m62B5zWrbTRUFqXY3tsZYHXGfJiEhL2MdRgJ0N2lQ=;
	b=FoLOH+ahceGXjHHFxgMhUYppmc5eQvdxJ1+z5FVeUFkOd7DItLnGYSnDTv7GE/YmGx
	+1F8mmKz7Jp3xzOtzGp5Q3Hg0KDhc2ZtZK0ubyX5ve6XIUa90IHYaCde7AM/RgscdIYT
	A0OSGRnU+aa9dI/xcpxj0Tg7NnvqWipLslU7Y=
Received: by 10.220.39.67 with SMTP id f3mr7134246vce.46.1329080939244; Sun,
	12 Feb 2012 13:08:59 -0800 (PST)
MIME-Version: 1.0
Received: by 10.52.187.1 with HTTP; Sun, 12 Feb 2012 13:08:39 -0800 (PST)
From: Luis Lavena <luislavena@gmail.com>
Date: Sun, 12 Feb 2012 18:08:39 -0300
Message-ID: <CAN_J9atN7TtT9dAp4=bSKcjYfgndWUE1LShJyt3b3ry1YBYAhw@mail.gmail.com>
Subject: Windows: failed to build X11 example
To: libssh2 development <libssh2-devel@cool.haxx.se>
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id
	q1CL935p019498
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-1"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id q1CL95e6019640

Hello,

I encountered the following error when trying to build libssh2 1.4.0 on Windows:

https://gist.github.com/6a234cd94c1ceb0ac7c8

GCC used was 4.6.2, OpenSSL was 1.0.0g and Zlib was 1.2.6

The culprit seems to be the attempt to compile X11 sample when Windows
do not provide X11 headers or support for it (at least not directly)

Wouldn't be better if X11 presence is detected at configure time and
x11 example excluded from compilation if not possible to build it?

Thank you.
-- 
Luis Lavena
AREA 17
-
Perfection in design is achieved not when there is nothing more to add,
but rather when there is nothing more to take away.
Antoine de Saint-Exupéry

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

From libssh2-devel-bounces@cool.haxx.se  Sun Feb 12 23:36:30 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1CMaCto005147;
	Sun, 12 Feb 2012 23:36:28 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1CMaBkZ005130
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Sun, 12 Feb 2012 23:36:11 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q1CMaBac005125
	for <libssh2-devel@cool.haxx.se>; Sun, 12 Feb 2012 23:36:11 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Sun, 12 Feb 2012 23:36:11 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: Windows: failed to build X11 example
In-Reply-To: <CAN_J9atN7TtT9dAp4=bSKcjYfgndWUE1LShJyt3b3ry1YBYAhw@mail.gmail.com>
Message-ID: <alpine.DEB.2.00.1202122334450.27419@tvnag.unkk.fr>
References: <CAN_J9atN7TtT9dAp4=bSKcjYfgndWUE1LShJyt3b3ry1YBYAhw@mail.gmail.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Sun, 12 Feb 2012, Luis Lavena wrote:

> The culprit seems to be the attempt to compile X11 sample when Windows do 
> not provide X11 headers or support for it (at least not directly)

Which headers would that be?

> Wouldn't be better if X11 presence is detected at configure time and x11 
> example excluded from compilation if not possible to build it?

Probably, yes, if there's no other way to fix the problem.

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Mon Feb 13 00:12:45 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1CNCYRC032331;
	Mon, 13 Feb 2012 00:12:43 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q1CNCX7u032314
	for <libssh2-devel@cool.haxx.se>; Mon, 13 Feb 2012 00:12:33 +0100
Received: (qmail 17077 invoked by uid 501); 12 Feb 2012 23:12:34 -0000
Message-ID: <20120212231234.17076.qmail@stuge.se>
Date: Mon, 13 Feb 2012 00:12:34 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: Windows: failed to build X11 example
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <CAN_J9atN7TtT9dAp4=bSKcjYfgndWUE1LShJyt3b3ry1YBYAhw@mail.gmail.com>
	<alpine.DEB.2.00.1202122334450.27419@tvnag.unkk.fr>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1202122334450.27419@tvnag.unkk.fr>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Daniel Stenberg wrote:
>> The culprit seems to be the attempt to compile X11 sample when Windows do 
>> not provide X11 headers or support for it (at least not directly)
>
> Which headers would that be?

The example e.g. does:

sock = socket(AF_UNIX, SOCK_STREAM, 0);

I'd suggest to use automake.. We'll need a new AM_CONDITIONAL in
configure.ac


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

From libssh2-devel-bounces@cool.haxx.se  Mon Feb 13 00:45:57 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1CNjgk5022713;
	Mon, 13 Feb 2012 00:45:56 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q1CNjfMj022700
	for <libssh2-devel@cool.haxx.se>; Mon, 13 Feb 2012 00:45:41 +0100
Received: (qmail 19461 invoked by uid 501); 12 Feb 2012 23:45:41 -0000
Message-ID: <20120212234541.19460.qmail@stuge.se>
Date: Mon, 13 Feb 2012 00:45:41 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: Windows: failed to build X11 example
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <CAN_J9atN7TtT9dAp4=bSKcjYfgndWUE1LShJyt3b3ry1YBYAhw@mail.gmail.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="mSxgbZZZvrAyzONB"
Content-Disposition: inline
In-Reply-To: <CAN_J9atN7TtT9dAp4=bSKcjYfgndWUE1LShJyt3b3ry1YBYAhw@mail.gmail.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se


--mSxgbZZZvrAyzONB
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Luis Lavena wrote:
> Wouldn't be better if X11 presence is detected at configure time and
> x11 example excluded from compilation if not possible to build it?

The attached patch works for me when cross-compiling for MinGW, in
that it excludes the x11 example. Try it out. Comments welcome.


//Peter

--mSxgbZZZvrAyzONB
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="0001-example-x11-Build-only-when-sys-un.h-is-found-by-con.patch"

From 4774d500e724bc4e548f743a0cb644ab05599474 Mon Sep 17 00:00:00 2001
From: Peter Stuge <peter@stuge.se>
Date: Mon, 13 Feb 2012 00:34:27 +0100
Subject: [PATCH] example/x11: Build only when sys/un.h is found by configure

The example can't be built on systems without AF_UNIX sockets.
---
 configure.ac        |    3 ++-
 example/Makefile.am |    6 +++++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/configure.ac b/configure.ac
index 5f94099..6ab89e8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -220,7 +220,8 @@ AC_HELP_STRING([--disable-hidden-symbols],[Leave all symbols with default visibi
 AC_CHECK_HEADERS([errno.h fcntl.h stdio.h stdlib.h unistd.h sys/uio.h])
 AC_CHECK_HEADERS([sys/select.h sys/socket.h sys/ioctl.h sys/time.h])
 AC_CHECK_HEADERS([arpa/inet.h netinet/in.h])
-AC_CHECK_HEADERS([sys/un.h])
+AC_CHECK_HEADERS([sys/un.h], [have_sys_un_h=yes], [have_sys_un_h=no])
+AM_CONDITIONAL([HAVE_SYS_UN_H], test "x$have_sys_un_h" = xyes)
 
 case $host in
   *-*-cygwin* | *-*-cegcc*)
diff --git a/example/Makefile.am b/example/Makefile.am
index 26cbf8a..8c6636f 100644
--- a/example/Makefile.am
+++ b/example/Makefile.am
@@ -7,7 +7,11 @@ noinst_PROGRAMS = direct_tcpip ssh2 scp scp_nonblock scp_write		\
  scp_write_nonblock sftp sftp_nonblock sftp_write sftp_write_nonblock	\
  sftp_mkdir sftp_mkdir_nonblock sftp_RW_nonblock sftp_write_sliding	\
  sftpdir sftpdir_nonblock ssh2_exec ssh2_agent ssh2_echo sftp_append	\
- subsystem_netconf tcpip-forward x11
+ subsystem_netconf tcpip-forward
+
+if HAVE_SYS_UN_H
+noinst_PROGRAMS += x11
+endif
 
 AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/example
 LDADD = $(top_builddir)/src/libssh2.la
-- 
1.7.4.1.343.ga91df.dirty


--mSxgbZZZvrAyzONB
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--mSxgbZZZvrAyzONB--

From libssh2-devel-bounces@cool.haxx.se  Mon Feb 13 01:53:50 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1D0rVWu011330;
	Mon, 13 Feb 2012 01:53:48 +0100
Received: from mail-vx0-f182.google.com (mail-vx0-f182.google.com
	[209.85.220.182])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1D0rS27011281
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Mon, 13 Feb 2012 01:53:29 +0100
Received: by vcmm1 with SMTP id m1so4035097vcm.41
	for <libssh2-devel@cool.haxx.se>; Sun, 12 Feb 2012 16:53:25 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:from:date:message-id:subject:to
	:content-type:content-transfer-encoding;
	bh=6yPnx/nqqFtyVysPBgIDk8uo7cX2s+aGN198PV/a8ss=;
	b=lO5OhFBEFM93lLOqWNmWMrFpnlyLp0AQz+66itX2QGawITl18WoQwukP1ry1vTr+28
	1AAu7qPfkOrq3SB8+W7xj94WjRvR0FVh5goIVSJRPoR2S9lSwAaY1wEXentwdluxVQmd
	JKW/ZVxdnOquv5nPP6HEjjD99yVdstrhp/y2I=
Received: by 10.220.108.138 with SMTP id f10mr7336100vcp.16.1329094405267;
	Sun, 12 Feb 2012 16:53:25 -0800 (PST)
MIME-Version: 1.0
Received: by 10.52.187.1 with HTTP; Sun, 12 Feb 2012 16:53:05 -0800 (PST)
In-Reply-To: <20120212234541.19460.qmail@stuge.se>
References: <CAN_J9atN7TtT9dAp4=bSKcjYfgndWUE1LShJyt3b3ry1YBYAhw@mail.gmail.com>
	<20120212234541.19460.qmail@stuge.se>
From: Luis Lavena <luislavena@gmail.com>
Date: Sun, 12 Feb 2012 21:53:05 -0300
Message-ID: <CAN_J9at2hpbhnWGYd6GQc4rsHumkJBKKxUtqn9GG1tkpy_9YMQ@mail.gmail.com>
Subject: Re: Windows: failed to build X11 example
To: libssh2 development <libssh2-devel@cool.haxx.se>
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id
	q1D0rS27011281
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-1"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id q1D0rVWu011330

On Sun, Feb 12, 2012 at 8:45 PM, Peter Stuge <peter@stuge.se> wrote:
> Luis Lavena wrote:
>> Wouldn't be better if X11 presence is detected at configure time and
>> x11 example excluded from compilation if not possible to build it?
>
> The attached patch works for me when cross-compiling for MinGW, in
> that it excludes the x11 example. Try it out. Comments welcome.
>
>

Thank you, that patch also worked native for MinGW.

`make` completed without issue.

Cheers,
-- 
Luis Lavena
AREA 17
-
Perfection in design is achieved not when there is nothing more to add,
but rather when there is nothing more to take away.
Antoine de Saint-Exupéry

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

From libssh2-devel-bounces@cool.haxx.se  Mon Feb 13 02:19:46 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1D1Jb0c026834;
	Mon, 13 Feb 2012 02:19:45 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q1D1JZUP026825
	for <libssh2-devel@cool.haxx.se>; Mon, 13 Feb 2012 02:19:35 +0100
Received: (qmail 26395 invoked by uid 501); 13 Feb 2012 01:19:37 -0000
Message-ID: <20120213011937.26394.qmail@stuge.se>
Date: Mon, 13 Feb 2012 02:19:37 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: Windows: failed to build X11 example
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <CAN_J9atN7TtT9dAp4=bSKcjYfgndWUE1LShJyt3b3ry1YBYAhw@mail.gmail.com>
	<20120212234541.19460.qmail@stuge.se>
	<CAN_J9at2hpbhnWGYd6GQc4rsHumkJBKKxUtqn9GG1tkpy_9YMQ@mail.gmail.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <CAN_J9at2hpbhnWGYd6GQc4rsHumkJBKKxUtqn9GG1tkpy_9YMQ@mail.gmail.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Luis Lavena wrote:
> >> Wouldn't be better if X11 presence is detected at configure time and
> >> x11 example excluded from compilation if not possible to build it?
> >
> > The attached patch works for me when cross-compiling for MinGW, in
> > that it excludes the x11 example. Try it out. Comments welcome.
> 
> Thank you, that patch also worked native for MinGW.
> 
> `make` completed without issue.

Pushed. Thanks for testing.


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

From libssh2-devel-bounces@cool.haxx.se  Mon Feb 13 16:40:52 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1DFeTS8004497;
	Mon, 13 Feb 2012 16:40:49 +0100
Received: from earth.stuge.se (earth.stuge.se [212.116.89.126])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1DFeRsM004477
	for <libssh2-devel@cool.haxx.se>; Mon, 13 Feb 2012 16:40:28 +0100
Received: (qmail 1525 invoked from network); 13 Feb 2012 15:40:27 -0000
Received: from unknown (HELO earth.stuge.se) (127.0.0.1)
	by localhost with SMTP; 13 Feb 2012 15:40:27 -0000
MIME-Version: 1.0
From: "libssh2 Trac" <trac@libssh2.stuge.se>
X-Trac-Version: 0.12.3dev
Precedence: bulk
Cc: libssh2-devel@cool.haxx.se
Auto-Submitted: auto-generated
X-Mailer: Trac 0.12.3dev, by Edgewall Software
X-Trac-Project: libssh2
Date: Mon, 13 Feb 2012 15:40:27 -0000
X-URL: http://trac.libssh2.org/
Subject: Re: [libssh2] #233: libssh2 _libssh2_packet_add() in packet.c not
	responding properly to SSH_MSG_CHANNEL_REQUEST for openssh keepalive
X-Trac-Ticket-URL: http://trac.libssh2.org/ticket/233#comment:1
Message-ID: <059.a21c46ea797331703639d86699195b85@libssh2.stuge.se>
References: <044.66311e4933791f7566e3c1ea80fa5175@libssh2.stuge.se>
X-Trac-Ticket-ID: 233
In-Reply-To: <044.66311e4933791f7566e3c1ea80fa5175@libssh2.stuge.se>
X-MIME-Autoconverted: from base64 to 8bit by giant.haxx.se id q1DFeRsM004477
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Reply-To: trac@libssh2.stuge.se,
        libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

#233: libssh2 _libssh2_packet_add() in packet.c not responding properly to
SSH_MSG_CHANNEL_REQUEST for openssh keepalive
-----------------------+-------------------
  Reporter:  engstrom  |      Owner:
      Type:  defect    |     Status:  new
  Priority:  normal    |  Milestone:  1.4.0
 Component:  protocol  |    Version:  1.3.0
Resolution:            |   Keywords:
Blocked By:            |     Blocks:
-----------------------+-------------------

Comment (by engstrom):

 Is anybody looking at this ticket?  Did I open it in the right Component?

-- 
Ticket URL: <http://trac.libssh2.org/ticket/233#comment:1>
libssh2 <http://trac.libssh2.org/>
C library for writing portable SSH2 clients

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

From libssh2-devel-bounces@cool.haxx.se  Mon Feb 13 20:04:01 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1DJ3hYJ029137;
	Mon, 13 Feb 2012 20:03:58 +0100
Received: from earth.stuge.se (earth.stuge.se [212.116.89.126])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1DJ3eha029109
	for <libssh2-devel@cool.haxx.se>; Mon, 13 Feb 2012 20:03:40 +0100
Received: (qmail 26408 invoked from network); 13 Feb 2012 19:03:41 -0000
Received: from unknown (HELO earth.stuge.se) (127.0.0.1)
	by localhost with SMTP; 13 Feb 2012 19:03:41 -0000
MIME-Version: 1.0
From: "libssh2 Trac" <trac@libssh2.stuge.se>
X-Trac-Version: 0.12.3dev
Precedence: bulk
Cc: libssh2-devel@cool.haxx.se
Auto-Submitted: auto-generated
X-Mailer: Trac 0.12.3dev, by Edgewall Software
X-Trac-Project: libssh2
Date: Mon, 13 Feb 2012 19:03:40 -0000
X-URL: http://trac.libssh2.org/
Subject: Re: [libssh2] #233: libssh2 _libssh2_packet_add() in packet.c not
	responding properly to SSH_MSG_CHANNEL_REQUEST for openssh keepalive
X-Trac-Ticket-URL: http://trac.libssh2.org/ticket/233#comment:2
Message-ID: <059.5a8d820479c8316d152d3e8b0bd40262@libssh2.stuge.se>
References: <044.66311e4933791f7566e3c1ea80fa5175@libssh2.stuge.se>
X-Trac-Ticket-ID: 233
In-Reply-To: <044.66311e4933791f7566e3c1ea80fa5175@libssh2.stuge.se>
X-MIME-Autoconverted: from base64 to 8bit by giant.haxx.se id q1DJ3eha029109
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Reply-To: trac@libssh2.stuge.se,
        libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

#233: libssh2 _libssh2_packet_add() in packet.c not responding properly to
SSH_MSG_CHANNEL_REQUEST for openssh keepalive
-----------------------+-------------------
  Reporter:  engstrom  |      Owner:
      Type:  defect    |     Status:  new
  Priority:  normal    |  Milestone:  1.4.0
 Component:  protocol  |    Version:  1.3.0
Resolution:            |   Keywords:
Blocked By:            |     Blocks:
-----------------------+-------------------

Comment (by bagder):

 It seems to be correctly filed, I think that quite simply nobody has
 looked at it.

-- 
Ticket URL: <http://trac.libssh2.org/ticket/233#comment:2>
libssh2 <http://trac.libssh2.org/>
C library for writing portable SSH2 clients

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

From libssh2-devel-bounces@cool.haxx.se  Mon Feb 13 20:54:59 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1DJskYo008150;
	Mon, 13 Feb 2012 20:54:57 +0100
Received: from earth.stuge.se (earth.stuge.se [212.116.89.126])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1DJsiXX008093
	for <libssh2-devel@cool.haxx.se>; Mon, 13 Feb 2012 20:54:44 +0100
Received: (qmail 5329 invoked from network); 13 Feb 2012 19:54:42 -0000
Received: from unknown (HELO earth.stuge.se) (127.0.0.1)
	by localhost with SMTP; 13 Feb 2012 19:54:42 -0000
MIME-Version: 1.0
From: "libssh2 Trac" <trac@libssh2.stuge.se>
X-Trac-Version: 0.12.3dev
Precedence: bulk
Cc: libssh2-devel@cool.haxx.se
Auto-Submitted: auto-generated
X-Mailer: Trac 0.12.3dev, by Edgewall Software
X-Trac-Project: libssh2
Date: Mon, 13 Feb 2012 19:54:42 -0000
X-URL: http://trac.libssh2.org/
Subject: Re: [libssh2] #233: libssh2 _libssh2_packet_add() in packet.c not
	responding properly to SSH_MSG_CHANNEL_REQUEST for openssh keepalive
X-Trac-Ticket-URL: http://trac.libssh2.org/ticket/233#comment:3
Message-ID: <059.d74619e599986fe70e92259d390aa262@libssh2.stuge.se>
References: <044.66311e4933791f7566e3c1ea80fa5175@libssh2.stuge.se>
X-Trac-Ticket-ID: 233
In-Reply-To: <044.66311e4933791f7566e3c1ea80fa5175@libssh2.stuge.se>
X-MIME-Autoconverted: from base64 to 8bit by giant.haxx.se id q1DJsiXX008093
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Reply-To: trac@libssh2.stuge.se,
        libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

#233: libssh2 _libssh2_packet_add() in packet.c not responding properly to
SSH_MSG_CHANNEL_REQUEST for openssh keepalive
-----------------------+-------------------
  Reporter:  engstrom  |      Owner:
      Type:  defect    |     Status:  new
  Priority:  normal    |  Milestone:  1.4.0
 Component:  protocol  |    Version:  1.3.0
Resolution:            |   Keywords:
Blocked By:            |     Blocks:
-----------------------+-------------------

Comment (by engstrom):

 Thanks badger, I appreciate the response.

-- 
Ticket URL: <http://trac.libssh2.org/ticket/233#comment:3>
libssh2 <http://trac.libssh2.org/>
C library for writing portable SSH2 clients

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

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 17 16:16:17 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1HFFmVW004682;
	Fri, 17 Feb 2012 16:16:13 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1HFFlxC004665
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Fri, 17 Feb 2012 16:15:47 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q1HFFl8C004660
	for <libssh2-devel@cool.haxx.se>; Fri, 17 Feb 2012 16:15:47 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Fri, 17 Feb 2012 16:15:47 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: sftp_write and EAGAIN
Message-ID: <alpine.DEB.2.00.1202171610300.19391@tvnag.unkk.fr>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED;
	BOUNDARY="1129329158-1781119183-1329491747=:19391"
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

--1129329158-1781119183-1329491747=:19391
Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII

Hi friends,

As I promised earlier, here is my take at doing the same fix to sftp_write as 
we've worked on for sftp_read.

I'll appreciate eyeballs and testing!

-- 

  / daniel.haxx.se
--1129329158-1781119183-1329491747=:19391
Content-Type: TEXT/x-diff; name=0001-sftp_write-cannot-return-acked-data-and-EAGAIN.patch
Content-Transfer-Encoding: BASE64
Content-ID: <alpine.DEB.2.00.1202171615470.19391@tvnag.unkk.fr>
Content-Description: 
Content-Disposition: attachment; filename=0001-sftp_write-cannot-return-acked-data-and-EAGAIN.patch

RnJvbSBlMDczNDI0NDNmMDdlMDUwZTM4OTYwY2U2OThlYTY2Y2MzMmQ0NTJh
IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQ0KRnJvbTogRGFuaWVsIFN0ZW5i
ZXJnIDxkYW5pZWxAaGF4eC5zZT4NCkRhdGU6IFR1ZSwgNyBGZWIgMjAxMiAw
MDozNTo1MSArMDEwMA0KU3ViamVjdDogW1BBVENIXSBzZnRwX3dyaXRlOiBj
YW5ub3QgcmV0dXJuIGFja2VkIGRhdGEgKmFuZCogRUFHQUlODQoNCldoZW5l
dmVyIHdlIGhhdmUgYWNrZWQgZGF0YSBhbmQgaXMgYWJvdXQgdG8gY2FsbCBh
IGZ1bmN0aW9uIHRoYXQgKk1BWSoNCnJldHVybiBFQUdBSU4gd2UgbXVzdCBy
ZXR1cm4gdGhlIG51bWJlciBub3cgYW5kIHdhaXQgdG8gZ2V0IGNhbGxlZA0K
YWdhaW4uIE91ciBBUEkgb25seSBhbGxvd3MgZGF0YSAqb3IqIEVBR0FJTiBh
bmQgd2UgbXVzdCBuZXZlciB0cnkgdG8gZ2V0DQpib3RoLg0KLS0tDQogc3Jj
L3NmdHAuYyB8ICAyNTkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr
Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogc3JjL3NmdHAuaCB8
ICAgIDcgKy0NCiAyIGZpbGVzIGNoYW5nZWQsIDEzOSBpbnNlcnRpb25zKCsp
LCAxMjcgZGVsZXRpb25zKC0pDQoNCmRpZmYgLS1naXQgYS9zcmMvc2Z0cC5j
IGIvc3JjL3NmdHAuYw0KaW5kZXggN2FmNWM0My4uYzBjOGM1MiAxMDA2NDQN
Ci0tLSBhL3NyYy9zZnRwLmMNCisrKyBiL3NyYy9zZnRwLmMNCkBAIC0xNjQz
LDE1NyArMTY0MywxNjggQEAgc3RhdGljIHNzaXplX3Qgc2Z0cF93cml0ZShM
SUJTU0gyX1NGVFBfSEFORExFICpoYW5kbGUsIGNvbnN0IGNoYXIgKmJ1ZmZl
ciwNCiAgICAgc3RydWN0IHNmdHBfcGlwZWxpbmVfY2h1bmsgKm5leHQ7DQog
ICAgIHNpemVfdCBhY2tlZCA9IDA7DQogICAgIHNpemVfdCBvcmdfY291bnQg
PSBjb3VudDsNCi0gICAgc2l6ZV90IGVhZ2FpbiA9IDA7DQorICAgIHNpemVf
dCBhbHJlYWR5Ow0KIA0KLSAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgc2VudCBv
ZmYgdGhhdCBoYXZlbid0IGJlZW4gYWNrZWQgYW5kIHRoZXJlZm9yIHdlIHdp
bGwNCi0gICAgICAgZ2V0IHBhc3NlZCBpbiBoZXJlIGFnYWluLg0KKyAgICBz
d2l0Y2goc2Z0cC0+d3JpdGVfc3RhdGUpIHsNCisgICAgZGVmYXVsdDoNCisg
ICAgY2FzZSBsaWJzc2gyX05CX3N0YXRlX2lkbGU6DQogDQotICAgICAgIEFs
c28sIGFkZCB1cCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYWN0dWFsbHkg
YWxyZWFkeSBoYXZlIGJlZW4gYWNrZWQNCi0gICAgICAgYnV0IHdlIGhhdmVu
J3QgYmVlbiBhYmxlIHRvIHJldHVybiBhcyBzdWNoIHlldCwgc28gd2Ugd2ls
bCBnZXQgdGhhdA0KLSAgICAgICBkYXRhIGFzIHdlbGwgcGFzc2VkIGluIGhl
cmUgYWdhaW4uDQotICAgICovDQotICAgIHNpemVfdCBhbHJlYWR5ID0gKGhh
bmRsZS0+dS5maWxlLm9mZnNldF9zZW50IC0gaGFuZGxlLT51LmZpbGUub2Zm
c2V0KSsNCi0gICAgICAgIGhhbmRsZS0+dS5maWxlLmFja2VkOw0KKyAgICAg
ICAgLyogTnVtYmVyIG9mIGJ5dGVzIHNlbnQgb2ZmIHRoYXQgaGF2ZW4ndCBi
ZWVuIGFja2VkIGFuZCB0aGVyZWZvciB3ZQ0KKyAgICAgICAgICAgd2lsbCBn
ZXQgcGFzc2VkIGluIGhlcmUgYWdhaW4uDQorDQorICAgICAgICAgICBBbHNv
LCBhZGQgdXAgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGFjdHVhbGx5IGFs
cmVhZHkgaGF2ZSBiZWVuDQorICAgICAgICAgICBhY2tlZCBidXQgd2UgaGF2
ZW4ndCBiZWVuIGFibGUgdG8gcmV0dXJuIGFzIHN1Y2ggeWV0LCBzbyB3ZSB3
aWxsDQorICAgICAgICAgICBnZXQgdGhhdCBkYXRhIGFzIHdlbGwgcGFzc2Vk
IGluIGhlcmUgYWdhaW4uDQorICAgICAgICAqLw0KKyAgICAgICAgYWxyZWFk
eSA9IChoYW5kbGUtPnUuZmlsZS5vZmZzZXRfc2VudCAtIGhhbmRsZS0+dS5m
aWxlLm9mZnNldCkrDQorICAgICAgICAgICAgaGFuZGxlLT51LmZpbGUuYWNr
ZWQ7DQorDQorICAgICAgICBpZihjb3VudCA+PSBhbHJlYWR5KSB7DQorICAg
ICAgICAgICAgLyogc2tpcCB0aGUgcGFydCBhbHJlYWR5IG1hZGUgaW50byBw
YWNrZXRzICovDQorICAgICAgICAgICAgYnVmZmVyICs9IGFscmVhZHk7DQor
ICAgICAgICAgICAgY291bnQgLT0gYWxyZWFkeTsNCisgICAgICAgIH0NCisg
ICAgICAgIGVsc2UNCisgICAgICAgICAgICAvKiB0aGVyZSBpcyBtb3JlIGRh
dGEgYWxyZWFkeSBmaW5lIHRoYW4gd2hhdCB3ZSBnb3QgaW4gdGhpcyBjYWxs
ICovDQorICAgICAgICAgICAgY291bnQgPSAwOw0KKw0KKyAgICAgICAgc2Z0
cC0+d3JpdGVfc3RhdGUgPSBsaWJzc2gyX05CX3N0YXRlX2lkbGU7DQorICAg
ICAgICB3aGlsZShjb3VudCkgew0KKyAgICAgICAgICAgIC8qIFRPRE86IFBv
c3NpYmx5IHRoaXMgc2hvdWxkIGhhdmUgc29tZSBsb2dpYyB0byBwcmV2ZW50
IGEgdmVyeQ0KKyAgICAgICAgICAgICAgIHZlcnkgc21hbGwgZnJhY3Rpb24g
dG8gYmUgbGVmdCBidXQgbGV0cyBpZ25vcmUgdGhhdCBmb3Igbm93ICovDQor
ICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IE1JTihNQVhfU0ZUUF9PVVRH
T0lOR19TSVpFLCBjb3VudCk7DQorICAgICAgICAgICAgdWludDMyX3QgcmVx
dWVzdF9pZDsNCiANCi0gICAgaWYoY291bnQgPj0gYWxyZWFkeSkgew0KLSAg
ICAgICAgLyogc2tpcCB0aGUgcGFydCBhbHJlYWR5IG1hZGUgaW50byBwYWNr
ZXRzICovDQotICAgICAgICBidWZmZXIgKz0gYWxyZWFkeTsNCi0gICAgICAg
IGNvdW50IC09IGFscmVhZHk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICAg
ICAgLyogdGhlcmUgaXMgbW9yZSBkYXRhIGFscmVhZHkgZmluZSB0aGFuIHdo
YXQgd2UgZ290IGluIHRoaXMgY2FsbCAqLw0KLSAgICAgICAgY291bnQgPSAw
Ow0KLQ0KLSAgICB3aGlsZShjb3VudCkgew0KLSAgICAgICAgLyogVE9ETzog
UG9zc2libHkgdGhpcyBzaG91bGQgaGF2ZSBzb21lIGxvZ2ljIHRvIHByZXZl
bnQgYSB2ZXJ5IHZlcnkNCi0gICAgICAgICAgIHNtYWxsIGZyYWN0aW9uIHRv
IGJlIGxlZnQgYnV0IGxldHMgaWdub3JlIHRoYXQgZm9yIG5vdyAqLw0KLSAg
ICAgICAgdWludDMyX3Qgc2l6ZSA9IE1JTihNQVhfU0ZUUF9PVVRHT0lOR19T
SVpFLCBjb3VudCk7DQotICAgICAgICB1aW50MzJfdCByZXF1ZXN0X2lkOw0K
LQ0KLSAgICAgICAgLyogMjUgPSBwYWNrZXRfbGVuKDQpICsgcGFja2V0X3R5
cGUoMSkgKyByZXF1ZXN0X2lkKDQpICsNCi0gICAgICAgICAgIGhhbmRsZV9s
ZW4oNCkgKyBvZmZzZXQoOCkgKyBjb3VudCg0KSAqLw0KLSAgICAgICAgcGFj
a2V0X2xlbiA9IGhhbmRsZS0+aGFuZGxlX2xlbiArIHNpemUgKyAyNTsNCi0N
Ci0gICAgICAgIGNodW5rID0gTElCU1NIMl9BTExPQyhzZXNzaW9uLCBwYWNr
ZXRfbGVuICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXpl
b2Yoc3RydWN0IHNmdHBfcGlwZWxpbmVfY2h1bmspKTsNCi0gICAgICAgIGlm
ICghY2h1bmspDQotICAgICAgICAgICAgcmV0dXJuIF9saWJzc2gyX2Vycm9y
KHNlc3Npb24sIExJQlNTSDJfRVJST1JfQUxMT0MsDQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICJtYWxsb2MgZmFpbCBmb3IgRlhQX1dS
SVRFIik7DQorICAgICAgICAgICAgLyogMjUgPSBwYWNrZXRfbGVuKDQpICsg
cGFja2V0X3R5cGUoMSkgKyByZXF1ZXN0X2lkKDQpICsNCisgICAgICAgICAg
ICAgICBoYW5kbGVfbGVuKDQpICsgb2Zmc2V0KDgpICsgY291bnQoNCkgKi8N
CisgICAgICAgICAgICBwYWNrZXRfbGVuID0gaGFuZGxlLT5oYW5kbGVfbGVu
ICsgc2l6ZSArIDI1Ow0KKw0KKyAgICAgICAgICAgIGNodW5rID0gTElCU1NI
Ml9BTExPQyhzZXNzaW9uLCBwYWNrZXRfbGVuICsNCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzZnRwX3BpcGVs
aW5lX2NodW5rKSk7DQorICAgICAgICAgICAgaWYgKCFjaHVuaykNCisgICAg
ICAgICAgICAgICAgcmV0dXJuIF9saWJzc2gyX2Vycm9yKHNlc3Npb24sIExJ
QlNTSDJfRVJST1JfQUxMT0MsDQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAibWFsbG9jIGZhaWwgZm9yIEZYUF9XUklURSIpOw0K
IA0KLSAgICAgICAgY2h1bmstPmxlbiA9IHNpemU7DQotICAgICAgICBjaHVu
ay0+c2VudCA9IDA7DQotICAgICAgICBjaHVuay0+bGVmdHRvc2VuZCA9IHBh
Y2tldF9sZW47DQorICAgICAgICAgICAgY2h1bmstPmxlbiA9IHNpemU7DQor
ICAgICAgICAgICAgY2h1bmstPnNlbnQgPSAwOw0KKyAgICAgICAgICAgIGNo
dW5rLT5sZWZ0dG9zZW5kID0gcGFja2V0X2xlbjsNCiANCi0gICAgICAgIHMg
PSBjaHVuay0+cGFja2V0Ow0KLSAgICAgICAgX2xpYnNzaDJfc3RvcmVfdTMy
KCZzLCBwYWNrZXRfbGVuIC0gNCk7DQorICAgICAgICAgICAgcyA9IGNodW5r
LT5wYWNrZXQ7DQorICAgICAgICAgICAgX2xpYnNzaDJfc3RvcmVfdTMyKCZz
LCBwYWNrZXRfbGVuIC0gNCk7DQogDQotICAgICAgICAqKHMrKykgPSBTU0hf
RlhQX1dSSVRFOw0KLSAgICAgICAgcmVxdWVzdF9pZCA9IHNmdHAtPnJlcXVl
c3RfaWQrKzsNCi0gICAgICAgIGNodW5rLT5yZXF1ZXN0X2lkID0gcmVxdWVz
dF9pZDsNCi0gICAgICAgIF9saWJzc2gyX3N0b3JlX3UzMigmcywgcmVxdWVz
dF9pZCk7DQotICAgICAgICBfbGlic3NoMl9zdG9yZV9zdHIoJnMsIGhhbmRs
ZS0+aGFuZGxlLCBoYW5kbGUtPmhhbmRsZV9sZW4pOw0KLSAgICAgICAgX2xp
YnNzaDJfc3RvcmVfdTY0KCZzLCBoYW5kbGUtPnUuZmlsZS5vZmZzZXRfc2Vu
dCk7DQotICAgICAgICBoYW5kbGUtPnUuZmlsZS5vZmZzZXRfc2VudCArPSBz
aXplOyAvKiBhZHZhbmNlIG9mZnNldCBhdCBvbmNlICovDQotICAgICAgICBf
bGlic3NoMl9zdG9yZV9zdHIoJnMsIGJ1ZmZlciwgc2l6ZSk7DQorICAgICAg
ICAgICAgKihzKyspID0gU1NIX0ZYUF9XUklURTsNCisgICAgICAgICAgICBy
ZXF1ZXN0X2lkID0gc2Z0cC0+cmVxdWVzdF9pZCsrOw0KKyAgICAgICAgICAg
IGNodW5rLT5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsNCisgICAgICAgICAg
ICBfbGlic3NoMl9zdG9yZV91MzIoJnMsIHJlcXVlc3RfaWQpOw0KKyAgICAg
ICAgICAgIF9saWJzc2gyX3N0b3JlX3N0cigmcywgaGFuZGxlLT5oYW5kbGUs
IGhhbmRsZS0+aGFuZGxlX2xlbik7DQorICAgICAgICAgICAgX2xpYnNzaDJf
c3RvcmVfdTY0KCZzLCBoYW5kbGUtPnUuZmlsZS5vZmZzZXRfc2VudCk7DQor
ICAgICAgICAgICAgaGFuZGxlLT51LmZpbGUub2Zmc2V0X3NlbnQgKz0gc2l6
ZTsgLyogYWR2YW5jZSBvZmZzZXQgYXQgb25jZSAqLw0KKyAgICAgICAgICAg
IF9saWJzc2gyX3N0b3JlX3N0cigmcywgYnVmZmVyLCBzaXplKTsNCiANCi0g
ICAgICAgIC8qIGFkZCB0aGlzIG5ldyBlbnRyeSBMQVNUIGluIHRoZSBsaXN0
ICovDQotICAgICAgICBfbGlic3NoMl9saXN0X2FkZCgmaGFuZGxlLT5wYWNr
ZXRfbGlzdCwgJmNodW5rLT5ub2RlKTsNCisgICAgICAgICAgICAvKiBhZGQg
dGhpcyBuZXcgZW50cnkgTEFTVCBpbiB0aGUgbGlzdCAqLw0KKyAgICAgICAg
ICAgIF9saWJzc2gyX2xpc3RfYWRkKCZoYW5kbGUtPnBhY2tldF9saXN0LCAm
Y2h1bmstPm5vZGUpOw0KIA0KLSAgICAgICAgYnVmZmVyICs9IHNpemU7DQot
ICAgICAgICBjb3VudCAtPSBzaXplOyAvKiBkZWR1Y3QgdGhlIHNpemUgd2Ug
dXNlZCwgYXMgd2UgbWlnaHQgaGF2ZQ0KLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgdG8gY3JlYXRlIG1vcmUgcGFja2V0cyAqLw0KLSAgICB9DQorICAg
ICAgICAgICAgYnVmZmVyICs9IHNpemU7DQorICAgICAgICAgICAgY291bnQg
LT0gc2l6ZTsgLyogZGVkdWN0IHRoZSBzaXplIHdlIHVzZWQsIGFzIHdlIG1p
Z2h0IGhhdmUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBj
cmVhdGUgbW9yZSBwYWNrZXRzICovDQorICAgICAgICB9DQogDQotICAgIC8q
IG1vdmUgdGhyb3VnaCB0aGUgV1JJVEUgcGFja2V0cyB0aGF0IGhhdmVuJ3Qg
YmVlbiBzZW50IGFuZCBzZW5kIGFzIG1hbnkNCi0gICAgICAgYXMgcG9zc2li
bGUgLSByZW1lbWJlciB0aGF0IHdlIGRvbid0IGJsb2NrICovDQotICAgIGNo
dW5rID0gX2xpYnNzaDJfbGlzdF9maXJzdCgmaGFuZGxlLT5wYWNrZXRfbGlz
dCk7DQorICAgICAgICAvKiBtb3ZlIHRocm91Z2ggdGhlIFdSSVRFIHBhY2tl
dHMgdGhhdCBoYXZlbid0IGJlZW4gc2VudCBhbmQgc2VuZCBhcyBtYW55DQor
ICAgICAgICAgICBhcyBwb3NzaWJsZSAtIHJlbWVtYmVyIHRoYXQgd2UgZG9u
J3QgYmxvY2sgKi8NCisgICAgICAgIGNodW5rID0gX2xpYnNzaDJfbGlzdF9m
aXJzdCgmaGFuZGxlLT5wYWNrZXRfbGlzdCk7DQogDQotICAgIHdoaWxlKGNo
dW5rKSB7DQotICAgICAgICBpZihjaHVuay0+bGVmdHRvc2VuZCkgew0KLSAg
ICAgICAgICAgIHJjID0gX2xpYnNzaDJfY2hhbm5lbF93cml0ZShjaGFubmVs
LCAwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAmY2h1bmstPnBhY2tldFtjaHVuay0+c2VudF0sDQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLT5sZWZ0dG9zZW5k
KTsNCi0gICAgICAgICAgICBpZihyYyA8IDApIHsNCi0gICAgICAgICAgICAg
ICAgaWYocmMgIT0gTElCU1NIMl9FUlJPUl9FQUdBSU4pDQotICAgICAgICAg
ICAgICAgICAgICAvKiBlcnJvciAqLw0KKyAgICAgICAgd2hpbGUoY2h1bmsp
IHsNCisgICAgICAgICAgICBpZihjaHVuay0+bGVmdHRvc2VuZCkgew0KKyAg
ICAgICAgICAgICAgICByYyA9IF9saWJzc2gyX2NoYW5uZWxfd3JpdGUoY2hh
bm5lbCwgMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICZjaHVuay0+cGFja2V0W2NodW5rLT5zZW50XSwNCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5r
LT5sZWZ0dG9zZW5kKTsNCisgICAgICAgICAgICAgICAgaWYocmMgPCAwKQ0K
KyAgICAgICAgICAgICAgICAgICAgLyogcmVtYWluIGluIGlkbGUgc3RhdGUg
Ki8NCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYzsNCi0gICAgICAg
ICAgICAgICAgZWFnYWluKys7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0K
Kw0KKyAgICAgICAgICAgICAgICAvKiByZW1lbWJlciB3aGVyZSB0byBjb250
aW51ZSBzZW5kaW5nIHRoZSBuZXh0IHRpbWUgKi8NCisgICAgICAgICAgICAg
ICAgY2h1bmstPmxlZnR0b3NlbmQgLT0gcmM7DQorICAgICAgICAgICAgICAg
IGNodW5rLT5zZW50ICs9IHJjOw0KKw0KKyAgICAgICAgICAgICAgICBpZihj
aHVuay0+bGVmdHRvc2VuZCkNCisgICAgICAgICAgICAgICAgICAgIC8qIGRh
dGEgbGVmdCB0byBzZW5kLCBnZXQgb3V0IG9mIGxvb3AgKi8NCisgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgIH0NCiANCi0gICAg
ICAgICAgICAvKiByZW1lbWJlciB3aGVyZSB0byBjb250aW51ZSBzZW5kaW5n
IHRoZSBuZXh0IHRpbWUgKi8NCi0gICAgICAgICAgICBjaHVuay0+bGVmdHRv
c2VuZCAtPSByYzsNCi0gICAgICAgICAgICBjaHVuay0+c2VudCArPSByYzsN
CisgICAgICAgICAgICAvKiBtb3ZlIG9uIHRvIHRoZSBuZXh0IGNodW5rIHdp
dGggZGF0YSB0byBzZW5kICovDQorICAgICAgICAgICAgY2h1bmsgPSBfbGli
c3NoMl9saXN0X25leHQoJmNodW5rLT5ub2RlKTsNCisgICAgICAgIH0NCisN
CisgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLw0KKyAgICBjYXNlIGxpYnNz
aDJfTkJfc3RhdGVfc2VudDoNCisNCisgICAgICAgIHNmdHAtPndyaXRlX3N0
YXRlID0gbGlic3NoMl9OQl9zdGF0ZV9pZGxlOw0KKyAgICAgICAgLyoNCisg
ICAgICAgICAqIENvdW50IGFsbCBBQ0tlZCBwYWNrZXRzDQorICAgICAgICAg
Ki8NCisgICAgICAgIGNodW5rID0gX2xpYnNzaDJfbGlzdF9maXJzdCgmaGFu
ZGxlLT5wYWNrZXRfbGlzdCk7DQogDQorICAgICAgICB3aGlsZShjaHVuaykg
ew0KICAgICAgICAgICAgIGlmKGNodW5rLT5sZWZ0dG9zZW5kKQ0KLSAgICAg
ICAgICAgICAgICAvKiBkYXRhIGxlZnQgdG8gc2VuZCwgZ2V0IG91dCBvZiBs
b29wICovDQorICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBjaHVuayBzdGls
bCBoYXMgZGF0YSBsZWZ0IHRvIHNlbmQsIHdlIHNob3VsZG4ndCB3YWl0DQor
ICAgICAgICAgICAgICAgICAgIGZvciBhbiBBQ0sgZm9yIGl0IGp1c3QgeWV0
ICovDQogICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLQ0K
LSAgICAgICAgLyogbW92ZSBvbiB0byB0aGUgbmV4dCBjaHVuayB3aXRoIGRh
dGEgdG8gc2VuZCAqLw0KLSAgICAgICAgY2h1bmsgPSBfbGlic3NoMl9saXN0
X25leHQoJmNodW5rLT5ub2RlKTsNCi0gICAgfQ0KIA0KLSAgICAvKg0KLSAg
ICAgKiBDb3VudCBhbGwgQUNLZWQgcGFja2V0cw0KLSAgICAgKi8NCi0gICAg
Y2h1bmsgPSBfbGlic3NoMl9saXN0X2ZpcnN0KCZoYW5kbGUtPnBhY2tldF9s
aXN0KTsNCisgICAgICAgICAgICBlbHNlIGlmKGFja2VkKQ0KKyAgICAgICAg
ICAgICAgICAvKiBpZiB3ZSBoYXZlIHNlbnQgZGF0YSB0aGF0IGlzIGFja2Vk
LCB3ZSBtdXN0IHJldHVybiB0aGF0DQorICAgICAgICAgICAgICAgICAgIGlu
Zm8gYmVmb3JlIHdlIGNhbGwgYSBmdW5jdGlvbiB0aGF0IG1pZ2h0IHJldHVy
biBFQUdBSU4gKi8NCisgICAgICAgICAgICAgICAgYnJlYWs7DQogDQotICAg
IHdoaWxlKGNodW5rKSB7DQotICAgICAgICBpZihjaHVuay0+bGVmdHRvc2Vu
ZCkNCi0gICAgICAgICAgICAvKiBpZiB0aGUgY2h1bmsgc3RpbGwgaGFzIGRh
dGEgbGVmdCB0byBzZW5kLCB3ZSBzaG91bGRuJ3Qgd2FpdCBmb3INCi0gICAg
ICAgICAgICAgICBhbiBBQ0sgZm9yIGl0IGp1c3QgeWV0ICovDQotICAgICAg
ICAgICAgYnJlYWs7DQorICAgICAgICAgICAgLyogd2UgY2hlY2sgdGhlIHBh
Y2tldHMgaW4gb3JkZXIgKi8NCisgICAgICAgICAgICByYyA9IHNmdHBfcGFj
a2V0X3JlcXVpcmUoc2Z0cCwgU1NIX0ZYUF9TVEFUVVMsDQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLT5yZXF1ZXN0X2lk
LCAmZGF0YSwgJmRhdGFfbGVuKTsNCisgICAgICAgICAgICBpZiAocmMgPCAw
KSB7DQorICAgICAgICAgICAgICAgIGlmIChyYyA9PSBMSUJTU0gyX0VSUk9S
X0VBR0FJTikNCisgICAgICAgICAgICAgICAgICAgIHNmdHAtPndyaXRlX3N0
YXRlID0gbGlic3NoMl9OQl9zdGF0ZV9zZW50Ow0KKyAgICAgICAgICAgICAg
ICByZXR1cm4gcmM7DQorICAgICAgICAgICAgfQ0KIA0KLSAgICAgICAgLyog
d2UgY2hlY2sgdGhlIHBhY2tldHMgaW4gb3JkZXIgKi8NCi0gICAgICAgIHJj
ID0gc2Z0cF9wYWNrZXRfcmVxdWlyZShzZnRwLCBTU0hfRlhQX1NUQVRVUywN
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuay0+cmVx
dWVzdF9pZCwgJmRhdGEsICZkYXRhX2xlbik7DQotICAgICAgICBpZiAocmMg
PT0gTElCU1NIMl9FUlJPUl9FQUdBSU4pIHsNCi0gICAgICAgICAgICBlYWdh
aW4rKzsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAg
ICAgIGVsc2UgaWYgKHJjKSB7DQotICAgICAgICAgICAgcmV0dXJuIF9saWJz
c2gyX2Vycm9yKHNlc3Npb24sIHJjLCAiV2FpdGluZyBmb3IgU0ZUUCBzdGF0
dXMiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldGNvZGUgPSBfbGlic3No
Ml9udG9odTMyKGRhdGEgKyA1KTsNCi0gICAgICAgIExJQlNTSDJfRlJFRShz
ZXNzaW9uLCBkYXRhKTsNCisgICAgICAgICAgICByZXRjb2RlID0gX2xpYnNz
aDJfbnRvaHUzMihkYXRhICsgNSk7DQorICAgICAgICAgICAgTElCU1NIMl9G
UkVFKHNlc3Npb24sIGRhdGEpOw0KIA0KLSAgICAgICAgc2Z0cC0+bGFzdF9l
cnJubyA9IHJldGNvZGU7DQotICAgICAgICBpZiAocmV0Y29kZSA9PSBMSUJT
U0gyX0ZYX09LKSB7DQotICAgICAgICAgICAgYWNrZWQgKz0gY2h1bmstPmxl
bjsgLyogbnVtYmVyIG9mIHBheWxvYWQgZGF0YSB0aGF0IHdhcyBhY2tlZA0K
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgKi8N
CisgICAgICAgICAgICBzZnRwLT5sYXN0X2Vycm5vID0gcmV0Y29kZTsNCisg
ICAgICAgICAgICBpZiAocmV0Y29kZSA9PSBMSUJTU0gyX0ZYX09LKSB7DQor
ICAgICAgICAgICAgICAgIGFja2VkICs9IGNodW5rLT5sZW47IC8qIG51bWJl
ciBvZiBwYXlsb2FkIGRhdGEgdGhhdCB3YXMgYWNrZWQNCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSAqLw0KIA0KLSAg
ICAgICAgICAgIC8qIHdlIGluY3JlYXNlIHRoZSBvZmZzZXQgdmFsdWUgZm9y
IGFsbCBhY2tzICovDQotICAgICAgICAgICAgaGFuZGxlLT51LmZpbGUub2Zm
c2V0ICs9IGNodW5rLT5sZW47DQorICAgICAgICAgICAgICAgIC8qIHdlIGlu
Y3JlYXNlIHRoZSBvZmZzZXQgdmFsdWUgZm9yIGFsbCBhY2tzICovDQorICAg
ICAgICAgICAgICAgIGhhbmRsZS0+dS5maWxlLm9mZnNldCArPSBjaHVuay0+
bGVuOw0KIA0KLSAgICAgICAgICAgIG5leHQgPSBfbGlic3NoMl9saXN0X25l
eHQoJmNodW5rLT5ub2RlKTsNCisgICAgICAgICAgICAgICAgbmV4dCA9IF9s
aWJzc2gyX2xpc3RfbmV4dCgmY2h1bmstPm5vZGUpOw0KIA0KLSAgICAgICAg
ICAgIF9saWJzc2gyX2xpc3RfcmVtb3ZlKCZjaHVuay0+bm9kZSk7IC8qIHJl
bW92ZSBmcm9tIGxpc3QgKi8NCi0gICAgICAgICAgICBMSUJTU0gyX0ZSRUUo
c2Vzc2lvbiwgY2h1bmspOyAvKiBmcmVlIG1lbW9yeSAqLw0KKyAgICAgICAg
ICAgICAgICBfbGlic3NoMl9saXN0X3JlbW92ZSgmY2h1bmstPm5vZGUpOyAv
KiByZW1vdmUgZnJvbSBsaXN0ICovDQorICAgICAgICAgICAgICAgIExJQlNT
SDJfRlJFRShzZXNzaW9uLCBjaHVuayk7IC8qIGZyZWUgbWVtb3J5ICovDQog
DQotICAgICAgICAgICAgY2h1bmsgPSBuZXh0Ow0KLSAgICAgICAgfQ0KLSAg
ICAgICAgZWxzZSB7DQotICAgICAgICAgICAgLyogZmx1c2ggYWxsIHBlbmRp
bmcgcGFja2V0cyBmcm9tIHRoZSBvdXRnb2luZyBsaXN0ICovDQotICAgICAg
ICAgICAgc2Z0cF9wYWNrZXRsaXN0X2ZsdXNoKGhhbmRsZSk7DQorICAgICAg
ICAgICAgICAgIGNodW5rID0gbmV4dDsNCisgICAgICAgICAgICB9DQorICAg
ICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgIC8qIGZsdXNoIGFs
bCBwZW5kaW5nIHBhY2tldHMgZnJvbSB0aGUgb3V0Z29pbmcgbGlzdCAqLw0K
KyAgICAgICAgICAgICAgICBzZnRwX3BhY2tldGxpc3RfZmx1c2goaGFuZGxl
KTsNCiANCi0gICAgICAgICAgICAvKiBzaW5jZSB3ZSByZXR1cm4gZXJyb3Ig
bm93LCB0aGUgYXBwbGljYXRvbiB3aWxsIG5vdCBnZXQgYW55DQotICAgICAg
ICAgICAgICAgb3V0c3RhbmRpbmcgZGF0YSBhY2tlZCwgc28gd2UgbmVlZCB0
byByZXdpbmQgdGhlIG9mZnNldCB0bw0KLSAgICAgICAgICAgICAgIHdoZXJl
IHRoZSBhcHBsaWNhdGlvbiBrbm93cyBpdCBoYXMgcmVhY2hlZCB3aXRoIGFj
a2VkIGRhdGEgKi8NCi0gICAgICAgICAgICBoYW5kbGUtPnUuZmlsZS5vZmZz
ZXQgLT0gaGFuZGxlLT51LmZpbGUuYWNrZWQ7DQorICAgICAgICAgICAgICAg
IC8qIHNpbmNlIHdlIHJldHVybiBlcnJvciBub3csIHRoZSBhcHBsaWNhdG9u
IHdpbGwgbm90IGdldCBhbnkNCisgICAgICAgICAgICAgICAgICAgb3V0c3Rh
bmRpbmcgZGF0YSBhY2tlZCwgc28gd2UgbmVlZCB0byByZXdpbmQgdGhlIG9m
ZnNldCB0bw0KKyAgICAgICAgICAgICAgICAgICB3aGVyZSB0aGUgYXBwbGlj
YXRpb24ga25vd3MgaXQgaGFzIHJlYWNoZWQgd2l0aCBhY2tlZCBkYXRhICov
DQorICAgICAgICAgICAgICAgIGhhbmRsZS0+dS5maWxlLm9mZnNldCAtPSBo
YW5kbGUtPnUuZmlsZS5hY2tlZDsNCiANCi0gICAgICAgICAgICAvKiB0aGVu
IHJlc2V0IHRoZSBvZmZzZXRfc2VudCB0byBiZSB0aGUgc2FtZSBhcyB0aGUg
b2Zmc2V0ICovDQotICAgICAgICAgICAgaGFuZGxlLT51LmZpbGUub2Zmc2V0
X3NlbnQgPSBoYW5kbGUtPnUuZmlsZS5vZmZzZXQ7DQorICAgICAgICAgICAg
ICAgIC8qIHRoZW4gcmVzZXQgdGhlIG9mZnNldF9zZW50IHRvIGJlIHRoZSBz
YW1lIGFzIHRoZSBvZmZzZXQgKi8NCisgICAgICAgICAgICAgICAgaGFuZGxl
LT51LmZpbGUub2Zmc2V0X3NlbnQgPSBoYW5kbGUtPnUuZmlsZS5vZmZzZXQ7
DQogDQotICAgICAgICAgICAgLyogY2xlYXIgdGhlIGFja2VkIGNvdW50ZXIg
c2luY2Ugd2UgY2FuIGhhdmUgbm8gcGVuZGluZyBkYXRhIHRvDQotICAgICAg
ICAgICAgICAgYWNrIGFmdGVyIGFuIGVycm9yICovDQotICAgICAgICAgICAg
aGFuZGxlLT51LmZpbGUuYWNrZWQgPSAwOw0KKyAgICAgICAgICAgICAgICAv
KiBjbGVhciB0aGUgYWNrZWQgY291bnRlciBzaW5jZSB3ZSBjYW4gaGF2ZSBu
byBwZW5kaW5nIGRhdGEgdG8NCisgICAgICAgICAgICAgICAgICAgYWNrIGFm
dGVyIGFuIGVycm9yICovDQorICAgICAgICAgICAgICAgIGhhbmRsZS0+dS5m
aWxlLmFja2VkID0gMDsNCiANCi0gICAgICAgICAgICAvKiB0aGUgc2VydmVy
IHJldHVybmVkIGFuIGVycm9yIGZvciB0aGF0IHdyaXR0ZW4gY2h1bmssIHBy
b3BhZ2F0ZQ0KLSAgICAgICAgICAgICAgIHRoaXMgYmFjayB0byBvdXIgcGFy
ZW50IGZ1bmN0aW9uICovDQotICAgICAgICAgICAgcmV0dXJuIF9saWJzc2gy
X2Vycm9yKHNlc3Npb24sIExJQlNTSDJfRVJST1JfU0ZUUF9QUk9UT0NPTCwN
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZYUCB3cml0
ZSBmYWlsZWQiKTsNCisgICAgICAgICAgICAgICAgLyogdGhlIHNlcnZlciBy
ZXR1cm5lZCBhbiBlcnJvciBmb3IgdGhhdCB3cml0dGVuIGNodW5rLCBwcm9w
YWdhdGUNCisgICAgICAgICAgICAgICAgICAgdGhpcyBiYWNrIHRvIG91ciBw
YXJlbnQgZnVuY3Rpb24gKi8NCisgICAgICAgICAgICAgICAgcmV0dXJuIF9s
aWJzc2gyX2Vycm9yKHNlc3Npb24sIExJQlNTSDJfRVJST1JfU0ZUUF9QUk9U
T0NPTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJGWFAgd3JpdGUgZmFpbGVkIik7DQorICAgICAgICAgICAgfQ0KICAgICAg
ICAgfQ0KKyAgICAgICAgYnJlYWs7DQogICAgIH0NCiANCiAgICAgLyogaWYg
dGhlcmUgd2VyZSBhY2tlZCBkYXRhIGluIGEgcHJldmlvdXMgY2FsbCB0aGF0
IHdhc24ndCByZXR1cm5lZCB0aGVuLA0KQEAgLTE4MTMsOSArMTgyNCw3IEBA
IHN0YXRpYyBzc2l6ZV90IHNmdHBfd3JpdGUoTElCU1NIMl9TRlRQX0hBTkRM
RSAqaGFuZGxlLCBjb25zdCBjaGFyICpidWZmZXIsDQogDQogICAgICAgICBy
ZXR1cm4gcmV0Ow0KICAgICB9DQotICAgIGVsc2UgaWYoZWFnYWluKQ0KLSAg
ICAgICAgcmV0dXJuIF9saWJzc2gyX2Vycm9yKHNlc3Npb24sIExJQlNTSDJf
RVJST1JfRUFHQUlOLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJXb3VsZCBibG9jayBzZnRwX3dyaXRlIik7DQorDQogICAgIGVsc2UNCiAg
ICAgICAgIHJldHVybiAwOyAvKiBub3RoaW5nIHdhcyBhY2tlZCwgYW5kIG5v
IEVBR0FJTiB3YXMgcmVjZWl2ZWQhICovDQogfQ0KZGlmZiAtLWdpdCBhL3Ny
Yy9zZnRwLmggYi9zcmMvc2Z0cC5oDQppbmRleCAyYmZmNzEyLi5mNzQwNjBm
IDEwMDY0NA0KLS0tIGEvc3JjL3NmdHAuaA0KKysrIGIvc3JjL3NmdHAuaA0K
QEAgLTEsNyArMSw3IEBADQogI2lmbmRlZiBfTElCU1NIMl9TRlRQX0gNCiAj
ZGVmaW5lIF9MSUJTU0gyX1NGVFBfSA0KIC8qDQotICogQ29weXJpZ2h0IChD
KSAyMDEwLCAyMDExIGJ5IERhbmllbCBTdGVuYmVyZw0KKyAqIENvcHlyaWdo
dCAoQykgMjAxMCAtIDIwMTIgYnkgRGFuaWVsIFN0ZW5iZXJnDQogICogQXV0
aG9yOiBEYW5pZWwgU3RlbmJlcmcgPGRhbmllbEBoYXh4LnNlPg0KICAqDQog
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3JtcywNCkBAIC0xNTgsOSArMTU4LDEyIEBAIHN0cnVjdCBfTElCU1NI
Ml9TRlRQDQogICAgIHNpemVfdCBvcGVuX3BhY2tldF9zZW50Ow0KICAgICB1
aW50MzJfdCBvcGVuX3JlcXVlc3RfaWQ7DQogDQotICAgIC8qIFN0YXRlIHZh
cmlhYmxlcyB1c2VkIGluIGxpYnNzaDJfc2Z0cF9yZWFkKCkgKi8NCisgICAg
LyogU3RhdGUgdmFyaWFibGUgdXNlZCBpbiBzZnRwX3JlYWQoKSAqLw0KICAg
ICBsaWJzc2gyX25vbmJsb2NraW5nX3N0YXRlcyByZWFkX3N0YXRlOw0KIA0K
KyAgICAvKiBTdGF0ZSB2YXJpYWJsZSB1c2VkIGluIHNmdHBfd3JpdGUoKSAq
Lw0KKyAgICBsaWJzc2gyX25vbmJsb2NraW5nX3N0YXRlcyB3cml0ZV9zdGF0
ZTsNCisNCiAgICAgLyogU3RhdGUgdmFyaWFibGVzIHVzZWQgaW4gbGlic3No
Ml9zZnRwX3JlYWRkaXIoKSAqLw0KICAgICBsaWJzc2gyX25vbmJsb2NraW5n
X3N0YXRlcyByZWFkZGlyX3N0YXRlOw0KICAgICB1bnNpZ25lZCBjaGFyICpy
ZWFkZGlyX3BhY2tldDsNCi0tIA0KMS43LjkNCg0K

--1129329158-1781119183-1329491747=:19391
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--1129329158-1781119183-1329491747=:19391--

From libssh2-devel-bounces@cool.haxx.se  Sun Feb 19 02:54:37 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1J1s7aZ010955;
	Sun, 19 Feb 2012 02:54:31 +0100
Received: from mail-pz0-f54.google.com (mail-pz0-f54.google.com
	[209.85.210.54])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1J1s4Fi010829
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Sun, 19 Feb 2012 02:54:05 +0100
Received: by daec6 with SMTP id c6so5114314dae.41
	for <libssh2-devel@cool.haxx.se>; Sat, 18 Feb 2012 17:54:00 -0800 (PST)
Received-SPF: pass (google.com: domain of alexander.lamaison@gmail.com
	designates 10.68.130.40 as permitted sender)
	client-ip=10.68.130.40; 
Authentication-Results: mr.google.com; spf=pass (google.com: domain of
	alexander.lamaison@gmail.com designates 10.68.130.40 as
	permitted sender) smtp.mail=alexander.lamaison@gmail.com;
	dkim=pass header.i=alexander.lamaison@gmail.com
Received: from mr.google.com ([10.68.130.40])
	by 10.68.130.40 with SMTP id ob8mr46399686pbb.106.1329616440326
	(num_hops = 1); Sat, 18 Feb 2012 17:54:00 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type;
	bh=z916C+mwJRloMEabkGPAiu8u/GBbWzWr+6Lby1MgGeU=;
	b=m3Y5DAb5hrdAjQJLA7TwTzSpvvHB2gCOEJaxgfUOy9alJ0/4P0G9u1FOydnTeFC47C
	FhXhwvwbj1eOWo4srNviU7gsT8Q70Kbe6D0RLYmuUvWSvAuASU7yvwZ4c9M11Ap2pUCQ
	9pN3A21gkRvVSOXKUKaMx7SsuOULSE/3Ebo3I=
MIME-Version: 1.0
Received: by 10.68.130.40 with SMTP id ob8mr38020291pbb.106.1329616440283;
	Sat, 18 Feb 2012 17:54:00 -0800 (PST)
Received: by 10.143.97.8 with HTTP; Sat, 18 Feb 2012 17:54:00 -0800 (PST)
In-Reply-To: <alpine.DEB.2.00.1202171610300.19391@tvnag.unkk.fr>
References: <alpine.DEB.2.00.1202171610300.19391@tvnag.unkk.fr>
Date: Sun, 19 Feb 2012 01:54:00 +0000
X-Google-Sender-Auth: 99wX5y5k0EnUZondT2kQdLRaqUk
Message-ID: <CADyPeTNbSZbrakx1te9Cfk6nAV9BtGGf0_OYM_5D1L4WYBithQ@mail.gmail.com>
Subject: Re: sftp_write and EAGAIN
From: Alexander Lamaison <swish@lammy.co.uk>
To: libssh2 development <libssh2-devel@cool.haxx.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On 17 February 2012 15:15, Daniel Stenberg <daniel@haxx.se> wrote:
> Hi friends,
>
> As I promised earlier, here is my take at doing the same fix to sftp_write
> as we've worked on for sftp_read.
>
> I'll appreciate eyeballs and testing!

It looks OK to me and passes my test suite.

One thing: why do we need that final while-loop? Are we keeping that
around (as with sftp_read) solely for the case where nothing was
acked?  When would that happen? Can chunk->len ever be zero?  Is this
worth keeping the loop around for; unlike sftp_read, we can return 0
without it signalling completion?

Also, why do we increment acked? I can't see any execution of the loop
that could have acked as anything other than zero at the point it is
incremented.

Alex

--
Swish - Easy SFTP for Windows Explorer (http://www.swish-sftp.org)
_______________________________________________
libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel

From libssh2-devel-bounces@cool.haxx.se  Sun Feb 19 12:15:39 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1JBFC39029684;
	Sun, 19 Feb 2012 12:15:35 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1JBF9hs029638
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Sun, 19 Feb 2012 12:15:09 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q1JBF9vF029633
	for <libssh2-devel@cool.haxx.se>; Sun, 19 Feb 2012 12:15:09 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Sun, 19 Feb 2012 12:15:09 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: sftp_write and EAGAIN
In-Reply-To: <CADyPeTNbSZbrakx1te9Cfk6nAV9BtGGf0_OYM_5D1L4WYBithQ@mail.gmail.com>
Message-ID: <alpine.DEB.2.00.1202191211180.26722@tvnag.unkk.fr>
References: <alpine.DEB.2.00.1202171610300.19391@tvnag.unkk.fr>
	<CADyPeTNbSZbrakx1te9Cfk6nAV9BtGGf0_OYM_5D1L4WYBithQ@mail.gmail.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Sun, 19 Feb 2012, Alexander Lamaison wrote:

> It looks OK to me and passes my test suite.

Great. It did pass my tests too but they are very simple. I'll push this now.

Regarding your questions about the logic, I decided I wanted to make the 
tiniest possible change to the logic and just fix the EAGAIN/data flaw. Your 
points are valid and could indeed be adressed but I'll prefer to do them 
separately.

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Sun Feb 19 12:26:36 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1JBQTcq006451;
	Sun, 19 Feb 2012 12:26:36 +0100
Received: from mail-qw0-f54.google.com (mail-qw0-f54.google.com
	[209.85.216.54])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1JBQRbN006414
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Sun, 19 Feb 2012 12:26:28 +0100
Received: by qaea17 with SMTP id a17so5468117qae.20
	for <libssh2-devel@cool.haxx.se>; Sun, 19 Feb 2012 03:26:22 -0800 (PST)
Received-SPF: pass (google.com: domain of alexander.lamaison@gmail.com
	designates 10.229.77.72 as permitted sender)
	client-ip=10.229.77.72; 
Authentication-Results: mr.google.com; spf=pass (google.com: domain of
	alexander.lamaison@gmail.com designates 10.229.77.72 as
	permitted sender) smtp.mail=alexander.lamaison@gmail.com;
	dkim=pass header.i=alexander.lamaison@gmail.com
Received: from mr.google.com ([10.229.77.72])
	by 10.229.77.72 with SMTP id f8mr12039923qck.34.1329650782950 (num_hops
	= 1); Sun, 19 Feb 2012 03:26:22 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type;
	bh=oKWciH/O1PgWHBfK5bmOqNqvxuCMkv5I5AWFv8afYRQ=;
	b=uoAJx0bDDIQysGWGJX04z14I8L2K6mpkaw+XVXNXLs1MyD3cnUps4g9DZXTiOS9tyF
	rgodvs68pcMkB5EMXsmHarexxP8qlEl+5dGCK69h91UitB+ZrRhVB0gDmy0LtDUZpsNr
	IYnyYk5AL3gxmEnRyBu76ShOBf+fulyBkl27k=
MIME-Version: 1.0
Received: by 10.229.77.72 with SMTP id f8mr10197425qck.34.1329650782878; Sun,
	19 Feb 2012 03:26:22 -0800 (PST)
Received: by 10.229.144.211 with HTTP; Sun, 19 Feb 2012 03:26:22 -0800 (PST)
In-Reply-To: <alpine.DEB.2.00.1202191211180.26722@tvnag.unkk.fr>
References: <alpine.DEB.2.00.1202171610300.19391@tvnag.unkk.fr>
	<CADyPeTNbSZbrakx1te9Cfk6nAV9BtGGf0_OYM_5D1L4WYBithQ@mail.gmail.com>
	<alpine.DEB.2.00.1202191211180.26722@tvnag.unkk.fr>
Date: Sun, 19 Feb 2012 11:26:22 +0000
X-Google-Sender-Auth: 7ZA--Rd9BXrZj25QpPEHWgIOBdg
Message-ID: <CADyPeTNcp=DP6EiW9QCU4Dmg4RRcDm2AadNu=y8MbxgCVDfsiQ@mail.gmail.com>
Subject: Re: sftp_write and EAGAIN
From: Alexander Lamaison <swish@lammy.co.uk>
To: libssh2 development <libssh2-devel@cool.haxx.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On 19 February 2012 11:15, Daniel Stenberg <daniel@haxx.se> wrote:
> On Sun, 19 Feb 2012, Alexander Lamaison wrote:
>
> Regarding your questions about the logic, I decided I wanted to make the
> tiniest possible change to the logic and just fix the EAGAIN/data flaw. Your
> points are valid and could indeed be adressed but I'll prefer to do them
> separately.

That's fine.  I'm a fan of small patches.

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

From libssh2-devel-bounces@cool.haxx.se  Wed Feb 22 11:28:01 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1MARVmC010472;
	Wed, 22 Feb 2012 11:27:56 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1MARTfb010446
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Wed, 22 Feb 2012 11:27:29 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q1MARSx0010442
	for <libssh2-devel@cool.haxx.se>; Wed, 22 Feb 2012 11:27:28 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Wed, 22 Feb 2012 11:27:28 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: a patch release
Message-ID: <alpine.DEB.2.00.1202221125500.4464@tvnag.unkk.fr>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Hi!

The gcrypt fix and the SFTP fixes warrant a little patch release I think. I 
will therefor package and upload one within a couple of days unless someone 
has a good reason!

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb 23 17:17:40 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1NGHCZT001713;
	Thu, 23 Feb 2012 17:17:36 +0100
Received: from thor.int.qindel.com (smtp.qindel.com [62.97.67.18])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1NGH9If001671
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 17:17:09 +0100
Received: from localhost (localhost [127.0.0.1])
	by thor.int.qindel.com (Postfix) with ESMTP id D8ECA1A88D
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 17:13:18 +0100 (CET)
X-Virus-Scanned: amavisd-new at 
X-Spam-Flag: NO
X-Spam-Score: -1.973
X-Spam-Level: 
X-Spam-Status: No, score=-1.973 tagged_above=-10 required=6.6
	tests=[ALL_TRUSTED=-1.8, AWL=0.129, BAYES_00=-2.599,
	FORGED_YAHOO_RCVD=2.297] autolearn=no
Received: from thor.int.qindel.com ([127.0.0.1])
	by localhost (thor.int.qindel.com [127.0.0.1]) (amavisd-new, port 10024)
	with ESMTP id qGtvmBAW16IV for <libssh2-devel@cool.haxx.se>;
	Thu, 23 Feb 2012 17:13:18 +0100 (CET)
Received: by thor.int.qindel.com (Postfix, from userid 106)
	id 7614E1A884; Thu, 23 Feb 2012 17:13:18 +0100 (CET)
Received: from [172.26.9.189] (unknown [172.26.9.189])
	by thor.int.qindel.com (Postfix) with ESMTPSA id 630EB1A852
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 17:13:18 +0100 (CET)
Message-ID: <4F466680.9040605@yahoo.com>
Date: Thu, 23 Feb 2012 17:17:04 +0100
From: Salvador Fandino <sfandino@yahoo.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:11.0) Gecko/20120217 Thunderbird/11.0
MIME-Version: 1.0
To: libssh2-devel@cool.haxx.se
Subject: Re: SFTP issues
References: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
	<20120209140623.9606.qmail@stuge.se>
	<alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202091547420.18645@tvnag.unkk.fr>
	<FD7412C4830543B38487CCFAA194F5D9@internal.avcosystems.com>
	<alpine.DEB.2.00.1202101419580.10678@tvnag.unkk.fr>
	<CADyPeTO6FfOpmiu68Cch14CEjxTvhUXX5-jy=kHk9kUy5gP8Ow@mail.gmail.com>
In-Reply-To: <CADyPeTO6FfOpmiu68Cch14CEjxTvhUXX5-jy=kHk9kUy5gP8Ow@mail.gmail.com>
X-Copyrighted-Material: 
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

[I already sent this mail through gmane yesterday, but it never made
into the list, so I am resending it directly]

On 02/10/2012 04:22 PM, Alexander Lamaison wrote:
> On 10 February 2012 13:21, Daniel Stenberg <daniel-7AX/Qt632QQ@public.gmane.org> wrote:
>>
>> Would anyone mind if I push these three commits now on master to easier
>> allow us all to see the complete source and continue working on improving
>> it?
> 
> Not at all; I was going to suggest doing so.  I tested them in my
> larger project last night and could read a 32MB image with no problem.

32MB is very short...

Let me explain: I am the author of the Perl module Net::SFTP::Foreign, a
full implementation of the SFTP protocol v3 in Perl. This module has
support for several backends, and one of them use Net::SSH2, the Perl
wrapper for libssh2.

I have been testing my module with libssh2 1.4.0 and found that put
transfers always stall after reading around 262130 +-10 from the channel
(note that my module does not use the SFTP functionality from libssh2,
it just connects to the remote server, creates a new channel and then
writes and reads from it).

After seeing this thread I got the source from git, hoping that my
problem would have being also solved, but is hasn't.

My intention was to investigate this bug further removing all the perl
layers in order to send you a proper bug report, but as you are already
working in a similar problem, I thought it would be better to let you
know about my problem now.

Actually, I got into testing 1.4.0 because one of the users of
Net::SFTP::Foreign reported it has problems when his transfers go over
1.5GB using Net::SSH2 compiled against libssh2 1.2.8.

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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb 23 17:28:28 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1NGSK8l009257;
	Thu, 23 Feb 2012 17:28:27 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q1NGSI8V009229
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 17:28:18 +0100
Received: (qmail 20415 invoked by uid 501); 23 Feb 2012 16:28:20 -0000
Message-ID: <20120223162820.20414.qmail@stuge.se>
Date: Thu, 23 Feb 2012 17:28:20 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: SFTP issues
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
	<20120209140623.9606.qmail@stuge.se>
	<alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202091547420.18645@tvnag.unkk.fr>
	<FD7412C4830543B38487CCFAA194F5D9@internal.avcosystems.com>
	<alpine.DEB.2.00.1202101419580.10678@tvnag.unkk.fr>
	<CADyPeTO6FfOpmiu68Cch14CEjxTvhUXX5-jy=kHk9kUy5gP8Ow@mail.gmail.com>
	<4F466680.9040605@yahoo.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <4F466680.9040605@yahoo.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Salvador Fandino wrote:
> problems when his transfers go over
> 1.5GB using Net::SSH2 compiled against libssh2 1.2.8.

You have to send more information. "It doesn't work" is impossible to
act on. Send logs. Send packet dumps. Actually with libssh2 they are
one and the same.

It's impossible to help without any information.


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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb 23 18:34:54 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1NHYZJ3023502;
	Thu, 23 Feb 2012 18:34:52 +0100
Received: from plane.gmane.org (plane.gmane.org [80.91.229.3])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1NHYXN8023487
	(version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 18:34:33 +0100
Received: from list by plane.gmane.org with local (Exim 4.69)
	(envelope-from <gnslg-libssh2-devel-2@m.gmane.org>)
	id 1S0cYs-00013T-KB
	for libssh2-devel@cool.haxx.se; Thu, 23 Feb 2012 18:34:34 +0100
Received: from 95.61.119.171 ([95.61.119.171])
	by main.gmane.org with esmtp (Gmexim 0.1 (Debian))
	id 1AlnuQ-0007hv-00
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 18:34:34 +0100
Received: from sfandino by 95.61.119.171 with local (Gmexim 0.1 (Debian))
	id 1AlnuQ-0007hv-00
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 18:34:34 +0100
X-Injected-Via-Gmane: http://gmane.org/
To: libssh2-devel@cool.haxx.se
From: Salvador Fandino <sfandino@yahoo.com>
Subject: Re: SFTP issues
Date: Thu, 23 Feb 2012 18:34:23 +0100
Lines: 22
Message-ID: <ji5tav$ect$1@dough.gmane.org>
References: <CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
	<20120209140623.9606.qmail@stuge.se>
	<alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202091547420.18645@tvnag.unkk.fr>
	<FD7412C4830543B38487CCFAA194F5D9@internal.avcosystems.com>
	<alpine.DEB.2.00.1202101419580.10678@tvnag.unkk.fr>
	<CADyPeTO6FfOpmiu68Cch14CEjxTvhUXX5-jy=kHk9kUy5gP8Ow@mail.gmail.com>
	<4F466680.9040605@yahoo.com> <20120223162820.20414.qmail@stuge.se>
Mime-Version: 1.0
X-Complaints-To: usenet@dough.gmane.org
X-Gmane-NNTP-Posting-Host: 95.61.119.171
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:11.0) Gecko/20120217 Thunderbird/11.0
In-Reply-To: <20120223162820.20414.qmail@stuge.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On 02/23/2012 05:28 PM, Peter Stuge wrote:
> Salvador Fandino wrote:
>> problems when his transfers go over
>> 1.5GB using Net::SSH2 compiled against libssh2 1.2.8.
> 
> You have to send more information. "It doesn't work" is impossible to
> act on. Send logs. Send packet dumps. Actually with libssh2 they are
> one and the same.
> 
> It's impossible to help without any information.

Did you read the part where I said I am planning to write a proper bug
report? Just that it is going to take me some time to get rid of the
Perl layer.

All that I am suggesting is that, while you are working on a similar
problem, you use bigger files for testing.

In any case, if you don't mind the Perl layer, I can send a full
description of how to reproduce the problem.



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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb 23 19:35:13 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1NIYq6C031962;
	Thu, 23 Feb 2012 19:35:11 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1NIYov5031947
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 19:34:50 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q1NIYo6O031943
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 19:34:50 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Thu, 23 Feb 2012 19:34:50 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: SFTP issues
In-Reply-To: <ji5tav$ect$1@dough.gmane.org>
Message-ID: <alpine.DEB.2.00.1202231934190.30657@tvnag.unkk.fr>
References: <CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
	<20120209140623.9606.qmail@stuge.se>
	<alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202091547420.18645@tvnag.unkk.fr>
	<FD7412C4830543B38487CCFAA194F5D9@internal.avcosystems.com>
	<alpine.DEB.2.00.1202101419580.10678@tvnag.unkk.fr>
	<CADyPeTO6FfOpmiu68Cch14CEjxTvhUXX5-jy=kHk9kUy5gP8Ow@mail.gmail.com>
	<4F466680.9040605@yahoo.com>
	<20120223162820.20414.qmail@stuge.se> <ji5tav$ect$1@dough.gmane.org>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Thu, 23 Feb 2012, Salvador Fandino wrote:

> All that I am suggesting is that, while you are working on a similar 
> problem, you use bigger files for testing.

I regularly test both SCP and SFTP with my 1GB test files with no problems.

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb 23 19:50:55 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1NIonUh013880;
	Thu, 23 Feb 2012 19:50:54 +0100
Received: from mail-qw0-f47.google.com (mail-qw0-f47.google.com
	[209.85.216.47])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1NIolVE013842
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 19:50:48 +0100
Received: by qadz30 with SMTP id z30so7525734qad.20
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 10:50:43 -0800 (PST)
Received-SPF: pass (google.com: domain of alexander.lamaison@gmail.com
	designates 10.229.135.80 as permitted sender)
	client-ip=10.229.135.80; 
Authentication-Results: mr.google.com; spf=pass (google.com: domain of
	alexander.lamaison@gmail.com designates 10.229.135.80 as
	permitted sender) smtp.mail=alexander.lamaison@gmail.com;
	dkim=pass header.i=alexander.lamaison@gmail.com
Received: from mr.google.com ([10.229.135.80])
	by 10.229.135.80 with SMTP id m16mr1766664qct.134.1330023043675
	(num_hops = 1); Thu, 23 Feb 2012 10:50:43 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type
	:content-transfer-encoding;
	bh=qcVR3VIIXdvFZTwP+y+7RFhRgiF9ukaY3zm1qA05HD4=;
	b=p4a3kKQVcqgwK4MW0RJi8S2Qb9eIosCfqbyjh1fdp/6m9AdddyjMHEWnPDdrAxm4Tr
	rYfhXEV6X6Ry74onTVeWWbNBK/3MQybslXUEFI4dYJ1GbAI7FcHKVTBWJnkZr6I7d7wj
	rl7+1r9vnY/+dmts0ydJa1ICTMQGWKXEqwe6A=
MIME-Version: 1.0
Received: by 10.229.135.80 with SMTP id m16mr1517192qct.134.1330023043556;
	Thu, 23 Feb 2012 10:50:43 -0800 (PST)
Received: by 10.229.144.211 with HTTP; Thu, 23 Feb 2012 10:50:43 -0800 (PST)
In-Reply-To: <4F466680.9040605@yahoo.com>
References: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<CADyPeTONQ12KkSyNAmNK=WtgcOrD3oQ-JoYgCp2yknR4iAYwYQ@mail.gmail.com>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
	<20120209140623.9606.qmail@stuge.se>
	<alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202091547420.18645@tvnag.unkk.fr>
	<FD7412C4830543B38487CCFAA194F5D9@internal.avcosystems.com>
	<alpine.DEB.2.00.1202101419580.10678@tvnag.unkk.fr>
	<CADyPeTO6FfOpmiu68Cch14CEjxTvhUXX5-jy=kHk9kUy5gP8Ow@mail.gmail.com>
	<4F466680.9040605@yahoo.com>
Date: Thu, 23 Feb 2012 18:50:43 +0000
X-Google-Sender-Auth: WgZ9fAAu48Y-SjIIO7T3vRDwsKM
Message-ID: <CADyPeTNPU6BT9F+hvwiuAwMRv65NPe1DymgpKXWaf=f6M_K8KA@mail.gmail.com>
Subject: Re: SFTP issues
From: Alexander Lamaison <swish@lammy.co.uk>
To: libssh2 development <libssh2-devel@cool.haxx.se>
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id
	q1NIolVE013842
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-1"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id q1NIonUh013880

On 22 February 2012 22:55, Salvador Fandiño <sfandino@yahoo.com> wrote:

> I have been testing my module with libssh2 1.4.0 and found that put
> transfers always stall after reading around 262130 +-10 from the channel
> (note that my module does not use the SFTP functionality from libssh2, it
> just connects to the remote server, creates a new channel and then writes
> and reads from it).
>
> After seeing this thread I got the source from git, hoping that my problem
> would have being also solved, but is hasn't.
...
> I think it would be a good idea to test the patch with bigger transfers
> before making a new release.

You say you don't use libssh2's SFTP implementation so the changes
introduced by the patch don't apply to your problem.  They only change
sftp.c.

Alex

--
Swish - Easy SFTP for Windows Explorer (http://www.swish-sftp.org)

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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb 23 20:53:20 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1NJqwSO029731;
	Thu, 23 Feb 2012 20:53:17 +0100
Received: from plane.gmane.org (plane.gmane.org [80.91.229.3])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1NJquHF029714
	(version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 20:52:56 +0100
Received: from list by plane.gmane.org with local (Exim 4.69)
	(envelope-from <gnslg-libssh2-devel-2@m.gmane.org>)
	id 1S0eil-0003Uj-TL
	for libssh2-devel@cool.haxx.se; Thu, 23 Feb 2012 20:52:55 +0100
Received: from 8.pool85-54-102.dynamic.orange.es ([85.54.102.8])
	by main.gmane.org with esmtp (Gmexim 0.1 (Debian))
	id 1AlnuQ-0007hv-00
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 20:52:55 +0100
Received: from sfandino by 8.pool85-54-102.dynamic.orange.es with local
	(Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 20:52:55 +0100
X-Injected-Via-Gmane: http://gmane.org/
To: libssh2-devel@cool.haxx.se
From: =?ISO-8859-1?Q?Salvador_Fandi=F1o?= <sfandino@yahoo.com>
Subject: Re: SFTP issues
Date: Thu, 23 Feb 2012 20:52:25 +0100
Lines: 73
Message-ID: <4F4698F9.7060103@yahoo.com>
References: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
	<20120209140623.9606.qmail@stuge.se>
	<alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202091547420.18645@tvnag.unkk.fr>
	<FD7412C4830543B38487CCFAA194F5D9@internal.avcosystems.com>
	<alpine.DEB.2.00.1202101419580.10678@tvnag.unkk.fr>
	<CADyPeTO6FfOpmiu68Cch14CEjxTvhUXX5-jy=kHk9kUy5gP8Ow@mail.gmail.com>
	<4F466680.9040605@yahoo.com>
	<CADyPeTNPU6BT9F+hvwiuAwMRv65NPe1DymgpKXWaf=f6M_K8KA@mail.gmail.com>
Mime-Version: 1.0
X-Complaints-To: usenet@dough.gmane.org
X-Gmane-NNTP-Posting-Host: 8.pool85-54-102.dynamic.orange.es
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:11.0) Gecko/20120203 Thunderbird/11.0
In-Reply-To: <CADyPeTNPU6BT9F+hvwiuAwMRv65NPe1DymgpKXWaf=f6M_K8KA@mail.gmail.com>
Cc: Alexander Lamaison <public-swish-qR+lIkUhPR310XsdtD+oqA@plane.gmane.org>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-1"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id q1NJqwSO029731

On 02/23/2012 07:50 PM, Alexander Lamaison wrote:
> On 22 February 2012 22:55, Salvador Fandiño<sfandino@yahoo.com>  wrote:
>
>> I have been testing my module with libssh2 1.4.0 and found that put
>> transfers always stall after reading around 262130 +-10 from the channel
>> (note that my module does not use the SFTP functionality from libssh2, it
>> just connects to the remote server, creates a new channel and then writes
>> and reads from it).
>>
>> After seeing this thread I got the source from git, hoping that my problem
>> would have being also solved, but is hasn't.
> ...
>> I think it would be a good idea to test the patch with bigger transfers
>> before making a new release.
>
> You say you don't use libssh2's SFTP implementation so the changes
> introduced by the patch don't apply to your problem.  They only change
> sftp.c.

yes, I know, I was hoping that the libssh2 sftp code were using the same 
calls for accessing the channel data as Net::SSH2, but after inspecting 
libssh2 code I can see that it is actually using a lower level API.

Net::SSH2 uses libssh2_channel_read_ex and, this may ring a bell, the 
transfer stalls after exactly 256 * 1024 bytes have been read from the 
channel.

What follows is the combined debug log from Net::SFTP and Net::SSH2, I 
guess it is easy understandable. Lines beginning by // are my comments:

...
# reading at 0/4
Net::SSH2::Channel::read(size = 4, ext = 0)
- read 4 bytes
- read 4 total
# 4 bytes read from SSH channel, total 262108
# reading at 4/4
# reading at 4/28
Net::SSH2::Channel::read(size = 24, ext = 0)
- read 24 bytes
- read 24 total
# 24 bytes read from SSH channel, total 262132
# reading at 28/28
# 4125 bytes written to SSH channel, total 38558276
# reading at 0/4
Net::SSH2::Channel::read(size = 4, ext = 0)
- read 4 bytes
- read 4 total
# 4 bytes read from SSH channel, total 262136
# reading at 4/4
# reading at 4/28

// At this point, 262136 bytes have been read from the channel
// Net::SFTP::Foreign tries to read the remaining 24 bytes of the
// SSH2_FXP_STATUS response (the packet length, 4bytes, have
// already been read)

Net::SSH2::Channel::read(size = 24, ext = 0)

// Net::SSH2 calls libssh2_channel_read_ex(channel, XLATEXT, b, 24)

- read 8 bytes

// it reads 8 bytes and returns, at this point, 256*1024 bytes
// have been read from the channel.
// Net::SSH2 calls libssh2_channel_read_ex(channel, XLATEXT, b, 16)
// and it never returns, the debugger reveals the process is
// inside "poll".






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

From libssh2-devel-bounces@cool.haxx.se  Thu Feb 23 21:12:42 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1NKCYHJ015166;
	Thu, 23 Feb 2012 21:12:41 +0100
Received: from mail-qy0-f182.google.com (mail-qy0-f182.google.com
	[209.85.216.182])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1NKCVBU015069
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 21:12:32 +0100
Received: by qcsg15 with SMTP id g15so110233qcs.41
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 12:12:28 -0800 (PST)
Received-SPF: pass (google.com: domain of alexander.lamaison@gmail.com
	designates 10.229.135.80 as permitted sender)
	client-ip=10.229.135.80; 
Authentication-Results: mr.google.com; spf=pass (google.com: domain of
	alexander.lamaison@gmail.com designates 10.229.135.80 as
	permitted sender) smtp.mail=alexander.lamaison@gmail.com;
	dkim=pass header.i=alexander.lamaison@gmail.com
Received: from mr.google.com ([10.229.135.80])
	by 10.229.135.80 with SMTP id m16mr1959839qct.134.1330027948420
	(num_hops = 1); Thu, 23 Feb 2012 12:12:28 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:date
	:x-google-sender-auth:message-id:subject:from:to:content-type
	:content-transfer-encoding;
	bh=mPtkHMpR6amha6Ph7yaZW3vkt6ItmopxBiqcVwFFqdo=;
	b=wWydmU680VwqxC6W1ctc+gYSL1i+STPAqPDbTbK3ZJuZO+JaTa0NZhAPQRPIwYGNFE
	ZaB8NQ/fyQEUw4SW9nfzEj5dEab/Ese2JW+sfi8rhPNqyON5mWMaAhpx/b4Lv8g8z63L
	kINFhcYtJFZHPrb9b55Vs9v8ZjLq/rPGm1jek=
MIME-Version: 1.0
Received: by 10.229.135.80 with SMTP id m16mr1686160qct.134.1330027948256;
	Thu, 23 Feb 2012 12:12:28 -0800 (PST)
Received: by 10.229.144.211 with HTTP; Thu, 23 Feb 2012 12:12:28 -0800 (PST)
In-Reply-To: <CADyPeTOXpaXaXXZSSv_=id+N1=q4S5pVFVsVZVbaQHAWH+iJJg@mail.gmail.com>
References: <alpine.DEB.2.00.1202041325410.4003@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202051134350.13479@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202071427590.14182@tvnag.unkk.fr>
	<CADyPeTMO0RndBbxfQLO-G3eZdgZS+T0ZpCjAOap1g8yKJfKgHQ@mail.gmail.com>
	<alpine.DEB.2.00.1202071926520.25243@tvnag.unkk.fr>
	<CADyPeTM_nBi224fiEksHu04rh74AWbSrOpns=aHPpWJR6G1G_w@mail.gmail.com>
	<CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
	<20120209140623.9606.qmail@stuge.se>
	<alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202091547420.18645@tvnag.unkk.fr>
	<FD7412C4830543B38487CCFAA194F5D9@internal.avcosystems.com>
	<alpine.DEB.2.00.1202101419580.10678@tvnag.unkk.fr>
	<CADyPeTO6FfOpmiu68Cch14CEjxTvhUXX5-jy=kHk9kUy5gP8Ow@mail.gmail.com>
	<4F466680.9040605@yahoo.com>
	<CADyPeTNPU6BT9F+hvwiuAwMRv65NPe1DymgpKXWaf=f6M_K8KA@mail.gmail.com>
	<4F4698F9.7060103@yahoo.com>
	<CADyPeTOXpaXaXXZSSv_=id+N1=q4S5pVFVsVZVbaQHAWH+iJJg@mail.gmail.com>
Date: Thu, 23 Feb 2012 20:12:28 +0000
X-Google-Sender-Auth: 8jE0k0w0tR09heRAQ10KOaby2EA
Message-ID: <CADyPeTP8k2GGSMhcwT3P7mgmu7G8cWMngd-YwuuBBYDaiLW0SQ@mail.gmail.com>
Subject: SFTP issues
From: Alexander Lamaison <swish@lammy.co.uk>
To: "development, libssh2" <libssh2-devel@cool.haxx.se>
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id
	q1NKCVBU015069
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-1"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from quoted-printable to 8bit by giant.haxx.se id q1NKCYHJ015166

I don't think your message made it through to the list - just me.
Probably best not to submit through GMane.  Here it is:

On 23 February 2012 19:52, Salvador Fandiño <sfandino@yahoo.com> wrote:
>
>
> On 02/23/2012 07:50 PM, Alexander Lamaison wrote:
>>
>> On 22 February 2012 22:55, Salvador
>> Fandiño<sfandino-/E1597aS9LQAvxtiuMwx3w@public.gmane.org>  wrote:
>>
>>
>>> I have been testing my module with libssh2 1.4.0 and found that put
>>> transfers always stall after reading around 262130 +-10 from the channel
>>> (note that my module does not use the SFTP functionality from libssh2, it
>>> just connects to the remote server, creates a new channel and then writes
>>> and reads from it).
>>>
>>> After seeing this thread I got the source from git, hoping that my
>>> problem
>>> would have being also solved, but is hasn't.
>>
>> ...
>>>
>>> I think it would be a good idea to test the patch with bigger transfers
>>> before making a new release.
>>
>>
>> You say you don't use libssh2's SFTP implementation so the changes
>> introduced by the patch don't apply to your problem.  They only change
>> sftp.c.
>
>
> yes, I know, I was hoping that the libssh2 sftp code were using the same
> calls for accessing the channel data as Net::SSH2, but after inspecting
> libssh2 code I can see that it is actually using a lower level API.
>
> Net::SSH2 uses libssh2_channel_read_ex and, this may ring a bell, the
> transfer stalls after exactly 256 * 1024 bytes have been read from the
> channel.

This happens to be the default channel windows size.  Just a thought;
I've no idea if it's related.

> What follows is the combined debug log from Net::SFTP and Net::SSH2, I guess
> it is easy understandable. Lines beginning by // are my comments:
>
> ...
> # reading at 0/4
> Net::SSH2::Channel::read(size = 4, ext = 0)
> - read 4 bytes
> - read 4 total
> # 4 bytes read from SSH channel, total 262108
> # reading at 4/4
> # reading at 4/28
> Net::SSH2::Channel::read(size = 24, ext = 0)
> - read 24 bytes
> - read 24 total
> # 24 bytes read from SSH channel, total 262132
> # reading at 28/28
> # 4125 bytes written to SSH channel, total 38558276
> # reading at 0/4
> Net::SSH2::Channel::read(size = 4, ext = 0)
> - read 4 bytes
> - read 4 total
> # 4 bytes read from SSH channel, total 262136
> # reading at 4/4
> # reading at 4/28
>
> // At this point, 262136 bytes have been read from the channel
> // Net::SFTP::Foreign tries to read the remaining 24 bytes of the
> // SSH2_FXP_STATUS response (the packet length, 4bytes, have
> // already been read)
>
> Net::SSH2::Channel::read(size = 24, ext = 0)
>
> // Net::SSH2 calls libssh2_channel_read_ex(channel, XLATEXT, b, 24)
>
> - read 8 bytes
>
> // it reads 8 bytes and returns, at this point, 256*1024 bytes
> // have been read from the channel.
> // Net::SSH2 calls libssh2_channel_read_ex(channel, XLATEXT, b, 16)
> // and it never returns, the debugger reveals the process is
> // inside "poll".

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

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 24 03:02:36 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1O22AXY001803;
	Fri, 24 Feb 2012 03:02:32 +0100
Received: from smtp101.prem.mail.ac4.yahoo.com
	(smtp101.prem.mail.ac4.yahoo.com [76.13.13.40])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q1O2277r032280
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 03:02:07 +0100
Received: (qmail 26633 invoked from network); 24 Feb 2012 02:02:03 -0000
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com;
	h=DKIM-Signature:X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:References:In-Reply-To:Content-Type;
	b=MJT430GTlpoVn+SxpN/IuBPlbPosvWSsGZaqSfxcSFcC6TjtnFEMJi8M3F+LtX5MykKjjcZ02gzjdgcuDBTSspBqkQ6xIZ+yGWmJu5T48I5zfu9yggF8r9wV0+cnffwUa6Uz8xv6EVyE1ZPHPMyWzlOz1udw5pCwF8cVpPABN8g=
	; 
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024;
	t=1330048923; bh=X5wtKd85i9FtThJWfQBdOTs/txH0tN98zUaCHp9Qy2k=;
	h=X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:References:In-Reply-To:Content-Type;
	b=b96ixIPPAQE6TOj/3Wq/9TikLYFJf5AabFD+k8g1tG/c5pD9IjKyhezeY9Ny7ux+7fNDbmUJh6d9pEGOYWDD68OLoC1VUrBZhapn0hYd5kLf+Gx1ZX257MhmLHFuIzIA/AJPn/5V7RL1Jl9pxCF2hr8INqBX0cByKub32uWWEx4=
X-Yahoo-Newman-Property: ymail-3
X-YMail-OSG: DZnp0_oVM1nv1pY5gmskY4ZQzVtluLbIQeqdO5.qDUxBd2J
	yiqKtJB4.cMAU08IgdRNibOBsgDN1XRbghAX7y88YkTvajTu5ZBvRdD75ci6
	Cm25cY55GLvinfJW1SH_yb5Wq420IpK_nS9FobuG9LsmLasSRI3X18XMRTaY
	mQVnBVZWAb0Ddfo.eJ_gqh30k0VlM58QwJaV6jPgwj7OnTyc2MuUhxsSBSFQ
	iJFvjV972QjqLFpojrZjFuMISJpRMIrL_XJFcXpnvqAXOCKfYxIZf97.owE2
	3sGZ1nTbRCRfRIYPitQK36Mg6aMYiXzu8.V7txcnN4hyAoH6FSqCBwBzzWht
	acMX8A58Vja5FAIxiki1SLL0c1lXUds9ytudHX4JFS8s6OoXWan3iryqGHXR
	cRWuA4J_E.ZNAXrdCbRhf1CVTaTdfV12WoMUPsAWjzwaJQMJ6ryVQN2ml6jF
	tEAgmh3pHtAQi4P9R1Ogrr5XvpgbJeP3X
X-Yahoo-SMTP: YHDhoKeswBBUWTyRp8e39VlvJYCW
Received: from [192.168.20.103] (sfandino@85.54.102.8 with plain)
	by smtp101.prem.mail.ac4.yahoo.com with SMTP;
	23 Feb 2012 18:02:02 -0800 PST
Message-ID: <4F46EF8E.2000402@yahoo.com>
Date: Fri, 24 Feb 2012 03:01:50 +0100
From: =?ISO-8859-1?Q?Salvador_Fandi=F1o?= <sfandino@yahoo.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:11.0) Gecko/20120203 Thunderbird/11.0
MIME-Version: 1.0
To: libssh2-devel@cool.haxx.se
Subject: Re: SFTP issues
References: <CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
	<20120209140623.9606.qmail@stuge.se>
	<alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202091547420.18645@tvnag.unkk.fr>
	<FD7412C4830543B38487CCFAA194F5D9@internal.avcosystems.com>
	<alpine.DEB.2.00.1202101419580.10678@tvnag.unkk.fr>
	<CADyPeTO6FfOpmiu68Cch14CEjxTvhUXX5-jy=kHk9kUy5gP8Ow@mail.gmail.com>
	<4F466680.9040605@yahoo.com> <20120223162820.20414.qmail@stuge.se>
	<ji5tav$ect$1@dough.gmane.org>
In-Reply-To: <ji5tav$ect$1@dough.gmane.org>
Content-Type: multipart/mixed; boundary="------------010603020303040903090107"
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

This is a multi-part message in MIME format.
--------------010603020303040903090107
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

On 02/23/2012 06:34 PM, Salvador Fandino wrote:
> On 02/23/2012 05:28 PM, Peter Stuge wrote:
>> Salvador Fandino wrote:
>>> problems when his transfers go over
>>> 1.5GB using Net::SSH2 compiled against libssh2 1.2.8.
>>
>> You have to send more information. "It doesn't work" is impossible to
>> act on. Send logs. Send packet dumps. Actually with libssh2 they are
>> one and the same.
>>
>> It's impossible to help without any information.
>
> Did you read the part where I said I am planning to write a proper bug
> report? Just that it is going to take me some time to get rid of the
> Perl layer.

here it goes:

Attached is a binary log, "dump.gz", of the read and write operations 
generated by Net::SFTP::Foreign and a C program, "replay.c", (actually, 
a hacked version of ssh2.c from the tests directory) that is able to 
load this log and replay it to some SSH server.

Copy "replay.c" and "dump.gz" inside the libssh2-1.4.0 directory and 
build "replay" with the following command:

   gcc  -Iinclude -Isrc  -g -O2 -c -o replay.o replay.c && \
      libtool --tag=CC --mode=link gcc  -g -O2   -o replay \
      replay.o src/libssh2.la

Then, create the directory /tmp/test on the server and run the following 
command:

   zcat dump.gz | USER=your_login \
     PUBKEY=$HOME/.ssh/id_dsa.pub \
     PRIVKEY=$HOME/.ssh/id_dsa ./replay

After a while you will see
   ...
   writing 285 bytes of 285
   written count: 285
   written current: 285
                 written total: 2666819 read total: 262141
   reading 4 bytes of 4
   read count: 3
   read current: 3
                 written total: 2666819 read total: 262144
   reading 1 bytes of 4

an at that point, the transfer will stall.


BTW, I am using Ubuntu Precise Pangolin (current) for amd64, OpenSSL 
1.0.0g and gcc 4.6.1 from the Ubuntu repository and have tested libssh2 
1.4.0 and yesterday's git version.

I am running the test against localhost:22 that identifies itself as 
"SSH-2.0-OpenSSH_5.9p1 Debian-2ubuntu2".




--------------010603020303040903090107
Content-Type: text/x-csrc;
 name="replay.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="replay.c"

/* Self test, based on examples/ssh2.c. */

#include "libssh2_config.h"
#include <libssh2.h>
#include <libssh2_sftp.h>

#ifdef HAVE_WINDOWS_H
# include <windows.h>
#endif
#ifdef HAVE_WINSOCK2_H
# include <winsock2.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif
# ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
# ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif

#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

static int total_read = 0, total_written = 0;
static LIBSSH2_SESSION *session;

static void write_retry(LIBSSH2_CHANNEL *channel, const char *buffer, int len) {
    int current_len = 0;
    while (current_len < len) {
        fprintf(stderr, "writing %d bytes of %d\n", len - current_len, len); fflush(stderr);
        int count = libssh2_channel_write_ex(channel, 0, buffer + current_len, len - current_len);
        fprintf(stderr, "written count: %d\n", count); fflush(stderr);
        if (count <= 0) {
            char *err;
            libssh2_session_last_error(session, &err, 0, 0);
            fprintf(stderr, "write failed: %s", err);
            exit(1);
        }
        current_len += count;
        total_written += count;
        fprintf(stderr, "written current: %d\n\t\twritten total: %d read total: %d\n",
                current_len, total_written, total_read); fflush(stderr);
    }
}

static void read_retry(LIBSSH2_CHANNEL *channel, char *buffer, int len) {
    int current_len = 0;
    while (current_len < len) {
        fprintf(stderr, "reading %d bytes of %d\n", len - current_len, len); fflush(stderr);
        int count = libssh2_channel_read_ex(channel, 0, buffer + current_len, len - current_len);
        fprintf(stderr, "read count: %d\n", count); fflush(stderr);
        if (count <= 0) {
            char *err;
            libssh2_session_last_error(session, &err, 0, 0);
            fprintf(stderr, "read failed: %s", err);
            exit(1);
        }
        current_len += count;
        total_read += count;
        fprintf(stderr, "read current: %d\n\t\twritten total: %d read total: %d\n",
                current_len, total_written, total_read); fflush(stderr);
        if (total_read > LIBSSH2_CHANNEL_WINDOW_DEFAULT) {
            fprintf(stderr, "done\n");
            exit(0);
        }
    }
}

static void discard_packet(LIBSSH2_CHANNEL *channel) {
    char buffer[1024];
    read_retry(channel, buffer, 4);
    unsigned int size = (buffer[0] << 24 ) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3];
    if (size > 1024) {
        fprintf(stderr, "packet too big: %d\n", size);
        exit(1);
    }
    read_retry(channel, buffer, size);
}

int main(int argc, char *argv[])
{
    unsigned long hostaddr;
    int sock, i, auth_pw = 0;
    struct sockaddr_in sin;
    const char *fingerprint;
    char *userauthlist;
    LIBSSH2_CHANNEL *channel;
#ifdef WIN32
    WSADATA wsadata;

    WSAStartup(MAKEWORD(2,0), &wsadata);
#endif
    const char *pubkeyfile="etc/user.pub";
    const char *privkeyfile="etc/user";
    const char *username="password";
    const char *password="password";
    int ec = 1;

    (void)argc;
    (void)argv;

    if (getenv ("USER"))
      username = getenv ("USER");

    if (getenv ("PRIVKEY"))
      privkeyfile = getenv ("PRIVKEY");

    if (getenv ("PUBKEY"))
      pubkeyfile = getenv ("PUBKEY");

    hostaddr = htonl(0x7F000001);

    sock = socket(AF_INET, SOCK_STREAM, 0);
#ifndef WIN32
    fcntl(sock, F_SETFL, 0);
#endif
    sin.sin_family = AF_INET;
    sin.sin_port = htons(22);
    sin.sin_addr.s_addr = hostaddr;
    if (connect(sock, (struct sockaddr*)(&sin),
                sizeof(struct sockaddr_in)) != 0) {
        fprintf(stderr, "failed to connect!\n");
        return -1;
    }

    /* Create a session instance and start it up
     * This will trade welcome banners, exchange keys, and setup crypto, compression, and MAC layers
     */
    session = libssh2_session_init();
    if (libssh2_session_startup(session, sock)) {
        fprintf(stderr, "Failure establishing SSH session\n");
        return -1;
    }

    /* At this point we havn't authenticated,
     * The first thing to do is check the hostkey's fingerprint against our known hosts
     * Your app may have it hard coded, may go to a file, may present it to the user, that's your call
     */
    fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);
    printf("Fingerprint: ");
    for(i = 0; i < 20; i++) {
        printf("%02X ", (unsigned char)fingerprint[i]);
    }
    printf("\n");

    /* check what authentication methods are available */
    userauthlist = libssh2_userauth_list(session, username, strlen(username));
    printf("Authentication methods: %s\n", userauthlist);
    if (strstr(userauthlist, "password") != NULL) {
        auth_pw |= 1;
    }
    if (strstr(userauthlist, "keyboard-interactive") != NULL) {
        auth_pw |= 2;
    }
    if (strstr(userauthlist, "publickey") != NULL) {
        auth_pw |= 4;
    }

    if (auth_pw & 4) {
        /* Authenticate by public key */
        if (libssh2_userauth_publickey_fromfile(session, username, pubkeyfile, privkeyfile, password)) {
            printf("\tAuthentication by public key failed!\n");
            goto shutdown;
        } else {
            printf("\tAuthentication by public key succeeded.\n");
        }
    } else {
        printf("No supported authentication methods found!\n");
        goto shutdown;
    }

    /* Request a shell */
    if (!(channel = libssh2_channel_open_ex(session, "session", 7,
                                            LIBSSH2_CHANNEL_WINDOW_DEFAULT,
                                            LIBSSH2_CHANNEL_PACKET_DEFAULT,
                                            NULL, 0))) {
        fprintf(stderr, "Unable to open a session\n");
        goto shutdown;
    }

    libssh2_channel_handle_extended_data(channel, LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE);

    if (libssh2_channel_process_startup(channel, "subsystem", 9, "sftp", 4) < 0) {
        fprintf(stderr, "Unable to start subsystem\n");
        goto shutdown;
    }

    while (1) {
        switch(getchar()) {
        case 'w':
        {
            unsigned char buffer[65000];
            if (fread(buffer, 1, 4, stdin) != 4) {
                fprintf(stderr, "unable to read dump");
                exit(1);
            }
            int size = (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3];
            if (size > sizeof(buffer)) {
                fprintf(stderr, "saved packet is bigger than buffer: %d", size);
                exit(1);
            }
            if (fread(buffer, 1, size, stdin) != size) {
                fprintf(stderr, "unable to read dump");
                exit(1);
            }
            write_retry(channel, buffer, size);
            break;
        }
        case 'r':
            discard_packet(channel);
            break;
        case EOF:
            exit (0);
        default:
            exit (1);
        }
    }

  shutdown:

    libssh2_session_disconnect(session, "Normal Shutdown");
    libssh2_session_free(session);

#ifdef WIN32
    Sleep(1000);
    closesocket(sock);
#else
    sleep(1);
    close(sock);
#endif

    return ec;
}

--------------010603020303040903090107
Content-Type: application/x-gzip;
 name="dump.gz"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="dump.gz"

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
--------------010603020303040903090107
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--------------010603020303040903090107--

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 24 03:58:52 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1O2wgIc030584;
	Fri, 24 Feb 2012 03:58:51 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1O2weCS030557
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 03:58:41 +0100
Received: from int-mx09.intmail.prod.int.phx2.redhat.com
	(int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1O2wbfj027254
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 21:58:37 -0500
Received: from beast.broked.org (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id q1O2waxr014607
	for <libssh2-devel@cool.haxx.se>; Thu, 23 Feb 2012 21:58:36 -0500
Message-ID: <4F46FC86.2030805@redhat.com>
Date: Thu, 23 Feb 2012 19:57:10 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120209 Thunderbird/10.0.1
MIME-Version: 1.0
To: libssh2-devel@cool.haxx.se
Subject: memory leak in _libssh2_channel_open
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Hi,

I have a long running program which essentially opens a ssh session then
periodically runs an exec operation over the session in a new channel.
I have implemented it as a non-blocking implementation.  I am using 1.4.0.

The code seems to work well but I notice there is a bit of a leak found
by valgrind:
==6656==    at 0x4A074CD: malloc (vg_replace_malloc.c:236)^M
==6656==    by 0x4EAC420: _libssh2_transport_read (transport.c:458)^M
==6656==    by 0x4EA0694: _libssh2_packet_requirev (packet.c:1219)^M
==6656==    by 0x4E97526: _libssh2_channel_open (channel.c:233)^M
==6656==    by 0x4E97A8C: libssh2_channel_open_ex (channel.c:352)^M
==6656==    by 0x405C9F: assembly_ssh_exec (trans_ssh.c:116)^M
==6656==    by 0x4C3754A: job_dispatch (loop_job.c:39)^M
==6656==    by 0x4C35FA6: qb_loop_run (loop.c:45)^M
==6656==    by 0x4034DB: main (caped.c:163)^M

If I run my application for 8 hours, the leak adds up to 300k of memory
consumed.  I had a look into the code for several hours and don't see an
immediate way to fix the problem.  I'm not sure even what the problem
is, as the channel should free all packets on libssh2_channel_free.

The code that implements the exec operation is here:
https://github.com/pacemaker-cloud/pacemaker-cloud/blob/master/src/trans_ssh.c

line 102.

Is my state machine for executing an exec operation incorrect, or is
there a bug in libssh2 here that is known?

Regards
-steve

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

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 24 16:47:29 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OFkhAo017540;
	Fri, 24 Feb 2012 16:47:26 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q1OFkfWf017528
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 16:46:42 +0100
Received: (qmail 28701 invoked by uid 501); 24 Feb 2012 15:46:39 -0000
Message-ID: <20120224154639.28700.qmail@stuge.se>
Date: Fri, 24 Feb 2012 16:46:39 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: memory leak in _libssh2_channel_open
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <4F46FC86.2030805@redhat.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="R92lf0Oi2sxyK3LA"
Content-Disposition: inline
In-Reply-To: <4F46FC86.2030805@redhat.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se


--R92lf0Oi2sxyK3LA
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hi Steve,

Steven Dake wrote:
> I have a long running program which essentially opens a ssh session then
> periodically runs an exec operation over the session in a new channel.
> I have implemented it as a non-blocking implementation.  I am using 1.4.0.
> 
> The code seems to work well but I notice there is a bit of a leak found
> by valgrind:
> ==6656==    at 0x4A074CD: malloc (vg_replace_malloc.c:236)^M
> ==6656==    by 0x4EAC420: _libssh2_transport_read (transport.c:458)^M
> ==6656==    by 0x4EA0694: _libssh2_packet_requirev (packet.c:1219)^M
> ==6656==    by 0x4E97526: _libssh2_channel_open (channel.c:233)^M
> ==6656==    by 0x4E97A8C: libssh2_channel_open_ex (channel.c:352)^M
> ==6656==    by 0x405C9F: assembly_ssh_exec (trans_ssh.c:116)^M
> ==6656==    by 0x4C3754A: job_dispatch (loop_job.c:39)^M
> ==6656==    by 0x4C35FA6: qb_loop_run (loop.c:45)^M
> ==6656==    by 0x4034DB: main (caped.c:163)^M
> 
> If I run my application for 8 hours, the leak adds up to 300k of memory
> consumed.  I had a look into the code for several hours and don't see an
> immediate way to fix the problem.  I'm not sure even what the problem
> is, as the channel should free all packets on libssh2_channel_free.

The leaked memory is the session->payload buffer, which is actually
never freed by libssh2 at all.

Please see if the attached patch fixes the leak while still allowing
your program to keep running for a long time. I'm not completely sure
if the payload would need to be freed explicitly in _session_free()
or if there will always be a packet in the packets list refering to
it. Unsure. It would be helpful if you could test more. If my theory
is correct then memcheck should still report exactly one packet
leaked, regardless of running time. Then I will add freeing also to
_session_free().


> is there a bug in libssh2 here that is known?

Not known bug. I think most don't have long running sessions.


//Peter

--R92lf0Oi2sxyK3LA
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="dontleakpayload.patch"

diff --git a/src/transport.c b/src/transport.c
index 057dcf5..639984c 100644
--- a/src/transport.c
+++ b/src/transport.c
@@ -142,6 +142,7 @@ decrypt(LIBSSH2_SESSION * session, unsigned char *source,
         if (session->remote.crypt->crypt(session, source,
                                          &session->remote.crypt_abstract)) {
             LIBSSH2_FREE(session, p->payload);
+            p->payload = NULL;
             return LIBSSH2_ERROR_DECRYPT;
         }
 
@@ -217,6 +218,7 @@ fullpacket(LIBSSH2_SESSION * session, int encrypted /* 1 or 0 */ )
                                               session->fullpacket_payload_len,
                                               &session->remote.comp_abstract);
             LIBSSH2_FREE(session, p->payload);
+            p->payload = NULL;
             if(rc)
                 return rc;
 
@@ -448,6 +450,13 @@ int _libssh2_transport_read(LIBSSH2_SESSION * session)
                 return LIBSSH2_ERROR_OUT_OF_BOUNDARY;
             }
 
+            /* If a packet was already allocated we must free it now.
+             * It would be nicer to keep track of allocated size, and
+             * only realloc when really neccessary.
+             */
+            if (p->payload)
+                LIBSSH2_FREE(session, p->payload);
+
             /* Get a packet handle put data into. We get one to
                hold all data, including padding and MAC. */
             p->payload = LIBSSH2_ALLOC(session, total_num);

--R92lf0Oi2sxyK3LA
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--R92lf0Oi2sxyK3LA--

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 24 17:09:50 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OG9djf002272;
	Fri, 24 Feb 2012 17:09:48 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OG9bCM002259
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 17:09:38 +0100
Received: from int-mx10.intmail.prod.int.phx2.redhat.com
	(int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1OG9bG6019436
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 11:09:37 -0500
Received: from beast.broked.org (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id q1OG9aCg030044
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 11:09:37 -0500
Message-ID: <4F47B5EB.3090209@redhat.com>
Date: Fri, 24 Feb 2012 09:08:11 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120209 Thunderbird/10.0.1
MIME-Version: 1.0
To: libssh2-devel@cool.haxx.se
Subject: Re: memory leak in _libssh2_channel_open
References: <4F46FC86.2030805@redhat.com> <20120224154639.28700.qmail@stuge.se>
In-Reply-To: <20120224154639.28700.qmail@stuge.se>
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On 02/24/2012 08:46 AM, Peter Stuge wrote:
> Hi Steve,
> 
> Steven Dake wrote:
>> I have a long running program which essentially opens a ssh session then
>> periodically runs an exec operation over the session in a new channel.
>> I have implemented it as a non-blocking implementation.  I am using 1.4.0.
>>
>> The code seems to work well but I notice there is a bit of a leak found
>> by valgrind:
>> ==6656==    at 0x4A074CD: malloc (vg_replace_malloc.c:236)^M
>> ==6656==    by 0x4EAC420: _libssh2_transport_read (transport.c:458)^M
>> ==6656==    by 0x4EA0694: _libssh2_packet_requirev (packet.c:1219)^M
>> ==6656==    by 0x4E97526: _libssh2_channel_open (channel.c:233)^M
>> ==6656==    by 0x4E97A8C: libssh2_channel_open_ex (channel.c:352)^M
>> ==6656==    by 0x405C9F: assembly_ssh_exec (trans_ssh.c:116)^M
>> ==6656==    by 0x4C3754A: job_dispatch (loop_job.c:39)^M
>> ==6656==    by 0x4C35FA6: qb_loop_run (loop.c:45)^M
>> ==6656==    by 0x4034DB: main (caped.c:163)^M
>>
>> If I run my application for 8 hours, the leak adds up to 300k of memory
>> consumed.  I had a look into the code for several hours and don't see an
>> immediate way to fix the problem.  I'm not sure even what the problem
>> is, as the channel should free all packets on libssh2_channel_free.
> 
> The leaked memory is the session->payload buffer, which is actually
> never freed by libssh2 at all.
> 

Peter,

Thanks for responding so quickly,

I'll be happy to try out your patch later today and report results back
sometime this weekend.

> Please see if the attached patch fixes the leak while still allowing
> your program to keep running for a long time. I'm not completely sure
> if the payload would need to be freed explicitly in _session_free()

I had thought along these same lines, but the problem with freeing in
sesson_free is that I don't free my session unless the connection is
determined faulty.  I could free and create a new session occasionally
to hack around that, but seems like there should be a better way ;)

> or if there will always be a packet in the packets list refering to
> it. Unsure. It would be helpful if you could test more. If my theory
> is correct then memcheck should still report exactly one packet
> leaked, regardless of running time. Then I will add freeing also to
> _session_free().
> 
> 

one packet leaked is ok (with me), thousands not ok (current codebase).

>> is there a bug in libssh2 here that is known?
> 
> Not known bug. I think most don't have long running sessions.
> 

Well I'm here to help with finding any bugs/leaks/etc with libssh2.  I
can even help fix them - I've studied the code base for about 12 hours
so have a reasonable idea of how it operates.

Regards
-steve
> 
> //Peter
> 
> 
> 
> _______________________________________________
> libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel

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

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 24 17:15:07 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OGF2rj006280;
	Fri, 24 Feb 2012 17:15:07 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q1OGF0W2005777
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 17:15:00 +0100
Received: (qmail 30931 invoked by uid 501); 24 Feb 2012 16:15:01 -0000
Message-ID: <20120224161501.30930.qmail@stuge.se>
Date: Fri, 24 Feb 2012 17:15:01 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: memory leak in _libssh2_channel_open
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <4F46FC86.2030805@redhat.com> <20120224154639.28700.qmail@stuge.se>
	<4F47B5EB.3090209@redhat.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <4F47B5EB.3090209@redhat.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Steven Dake wrote:
> I'll be happy to try out your patch later today and report results back
> sometime this weekend.

Thanks!


> > Please see if the attached patch fixes the leak while still allowing
> > your program to keep running for a long time. I'm not completely sure
> > if the payload would need to be freed explicitly in _session_free()
> 
> I had thought along these same lines, but the problem with freeing in
> sesson_free is that I don't free my session unless the connection is
> determined faulty.  I could free and create a new session occasionally
> to hack around that, but seems like there should be a better way ;)

No, freeing session->payload in libssh2_session_free() is not the
solution to your problem, but it may be needed to properly clean up.


> one packet leaked is ok (with me), thousands not ok (current codebase).

One packet leaked is not ok with me.


> I'm here to help with finding any bugs/leaks/etc with libssh2.  I
> can even help fix them - I've studied the code base for about 12
> hours so have a reasonable idea of how it operates.

All good. Looking forward to results from testing the patch.


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

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 24 18:15:55 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OHFZPN017609;
	Fri, 24 Feb 2012 18:15:52 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OHFWqR017599
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 18:15:33 +0100
Received: from int-mx02.intmail.prod.int.phx2.redhat.com
	(int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1OHFXFC003554
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 12:15:33 -0500
Received: from beast.broked.org (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id q1OHFWjj007426
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 12:15:33 -0500
Message-ID: <4F47C55F.5070305@redhat.com>
Date: Fri, 24 Feb 2012 10:14:07 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120209 Thunderbird/10.0.1
MIME-Version: 1.0
To: libssh2-devel@cool.haxx.se
Subject: Re: memory leak in _libssh2_channel_open
References: <4F46FC86.2030805@redhat.com> <20120224154639.28700.qmail@stuge.se>
	<4F47B5EB.3090209@redhat.com> <20120224161501.30930.qmail@stuge.se>
In-Reply-To: <20120224161501.30930.qmail@stuge.se>
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On 02/24/2012 09:15 AM, Peter Stuge wrote:
> Steven Dake wrote:
>> I'll be happy to try out your patch later today and report results back
>> sometime this weekend.
> 
> Thanks!
> 
> 
>>> Please see if the attached patch fixes the leak while still allowing
>>> your program to keep running for a long time. I'm not completely sure
>>> if the payload would need to be freed explicitly in _session_free()
>>
>> I had thought along these same lines, but the problem with freeing in
>> sesson_free is that I don't free my session unless the connection is
>> determined faulty.  I could free and create a new session occasionally
>> to hack around that, but seems like there should be a better way ;)
> 
> No, freeing session->payload in libssh2_session_free() is not the
> solution to your problem, but it may be needed to properly clean up.
> 
> 
>> one packet leaked is ok (with me), thousands not ok (current codebase).
> 
> One packet leaked is not ok with me.
> 

Peter,

I tried this patch and it resulted in double free followed by segfault
from gcc memory checker.

Regards
-steve
> 
>> I'm here to help with finding any bugs/leaks/etc with libssh2.  I
>> can even help fix them - I've studied the code base for about 12
>> hours so have a reasonable idea of how it operates.
> 
> All good. Looking forward to results from testing the patch.
> 
> 
> //Peter
> _______________________________________________
> libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel

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

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 24 18:22:25 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OHMLsu022205;
	Fri, 24 Feb 2012 18:22:25 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q1OHMJan022197
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 18:22:19 +0100
Received: (qmail 3832 invoked by uid 501); 24 Feb 2012 17:22:20 -0000
Message-ID: <20120224172220.3831.qmail@stuge.se>
Date: Fri, 24 Feb 2012 18:22:20 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: memory leak in _libssh2_channel_open
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <4F46FC86.2030805@redhat.com> <20120224154639.28700.qmail@stuge.se>
	<4F47B5EB.3090209@redhat.com> <20120224161501.30930.qmail@stuge.se>
	<4F47C55F.5070305@redhat.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <4F47C55F.5070305@redhat.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Steven Dake wrote:
> I tried this patch and it resulted in double free followed by
> segfault from gcc memory checker.

Does valgrind tell where the packet was previously freed?

And when does the double free happen?


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

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 24 18:31:28 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OHVLLJ028626;
	Fri, 24 Feb 2012 18:31:28 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OHVHl6028589
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 18:31:18 +0100
Received: from int-mx09.intmail.prod.int.phx2.redhat.com
	(int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1OHVIob028301
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 24 Feb 2012 12:31:18 -0500
Received: from beast.broked.org (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id q1OHVGne023632; Fri, 24 Feb 2012 12:31:17 -0500
Message-ID: <4F47C90F.4050109@redhat.com>
Date: Fri, 24 Feb 2012 10:29:51 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120209 Thunderbird/10.0.1
MIME-Version: 1.0
To: libssh2-devel@cool.haxx.se, peter@stuge.se
Subject: Re: memory leak in _libssh2_channel_open
References: <4F46FC86.2030805@redhat.com> <20120224154639.28700.qmail@stuge.se>
	<4F47B5EB.3090209@redhat.com> <20120224161501.30930.qmail@stuge.se>
	<4F47C55F.5070305@redhat.com> <20120224172220.3831.qmail@stuge.se>
In-Reply-To: <20120224172220.3831.qmail@stuge.se>
Content-Type: multipart/mixed; boundary="------------060802080201010404050005"
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

This is a multi-part message in MIME format.
--------------060802080201010404050005
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

On 02/24/2012 10:22 AM, Peter Stuge wrote:
> Steven Dake wrote:
>> I tried this patch and it resulted in double free followed by
>> segfault from gcc memory checker.
> 
> Does valgrind tell where the packet was previously freed?
> 
> And when does the double free happen?
> 
> 
> //Peter
> _______________________________________________
> libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel

I have attached a gz of the typescript run of valgrind

All sorts of bad things happen with that patch (those problems didn't
occur prior to patch)

--------------060802080201010404050005
Content-Type: application/x-gzip;
 name="typescript.gz"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="typescript.gz"

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
HwbsEJ63Q2gadS3TTgdW8SK22WfxoclJjxh0uj1isOd0tSfpI5elR81SHTd8UB+2DCj1nWnk
9IkzDRHgTANnGkcasRo/coNh46SP84MwPKmhXrGwyZMFowYi1Mzt061YGlYPKVqtFj+bPfrG
r/vZ+YTN1KUYpq6Lnrr4Dw+yFh/IDOvW1LUGhhAAA2BOBIx4RrCS5j0LVqIkCJONYW71YTSc
vU3eDm/tnne4suu+srSPcjdXJKjsyMn89m4yLT6sirt3VdNmH9Q8c3cnOozSzT3YBqOqrwcd
cM9q1+zbY1128HfTw81vi6/m0RXD22TTzxfTUXmMJqRwP8RQqCStu0lWX1Y7eggcBVPKsYsF
NsbUslF1sWneGkEZROsYwjJ88N2isH3er57RJ0kIZZ0qkvCQzrCti5k+qcdEGKc1ncnGfaQi
TEjtjmKVKavQtKW6yqe1sNLaGL83+6tleRpK3XfAA6q2a9An+tFB6IttJRKxrfseDYgfpGqt
yNPGZGuRbRX518X8j60epZSeqYKS3DlVcH3kuNZq90RpsmmZ3Eym47qddh6RyrXDVrFYbY+N
1+9WOircmStxuusYllyKJZGS8GGyjYNsiTo4WclDGlgj9eOaZpNN9cK6oplwlBIkQSDJXhXN
aHiWr+7nLPofVx/+9ssv0fv/+PFhf+Pik31Sxdp34scrHTZesXlr1Tt+2GgyG0/Mi11tGzVW
vWRni6uHLho/GjX9IBRtXEnubPdIVj9eMR7+wEXTeveDkMxxTdvB/d3dwiigGD91l40f8/ni
ajS/t1kWjWiraKZifGVmjkZ/V8ViMV8sfzB3Z9/YH5PVzY9Xr39vdPO3ZXH1+rUR0Ojz6/li
cm1GnH/6aq6/ml8ti+Lqj5vCgHM/2zid2j5/H07vzSfMMrW4+rSY3zZ6y96///X99i1eCVsR
pbqF8pNXlAemnZmqv9jkkM3vzZky42T1KUZJWeXqH//h//5P8t+X4+Hn4p8/FkPzSv58Yy76
5/Ivfzb0zZd/vjMA3ppfF69LN9Y/Lxej/+t/LebzVdXiyvz+n//v1f9j7vnabCfG//gPm5/M
t54Ww8+vRzfF6PM/lRbC16+XN/M/Xm/fZPkg3vzZave1gWtsnvLd6z/uyu8bKmW+7y/Fbdn+
h6uhdTKYL75WX3f9PuaLxmetbcc84BvDa/Lfrswun71mxEisfGV/ffu3q7+++/lP4x8sPf96
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
--------------060802080201010404050005
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--------------060802080201010404050005--

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 24 19:18:35 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OIIH95028798;
	Fri, 24 Feb 2012 19:18:33 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q1OIIGId028786
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 19:18:16 +0100
Received: (qmail 8123 invoked by uid 501); 24 Feb 2012 18:18:16 -0000
Message-ID: <20120224181816.8122.qmail@stuge.se>
Date: Fri, 24 Feb 2012 19:18:16 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: memory leak in _libssh2_channel_open
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <4F46FC86.2030805@redhat.com> <20120224154639.28700.qmail@stuge.se>
	<4F47B5EB.3090209@redhat.com> <20120224161501.30930.qmail@stuge.se>
	<4F47C55F.5070305@redhat.com> <20120224172220.3831.qmail@stuge.se>
	<4F47C90F.4050109@redhat.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <4F47C90F.4050109@redhat.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Hi!

Steven Dake wrote:
> >> I tried this patch and it resulted in double free followed by
> >> segfault from gcc memory checker.
> > 
> > Does valgrind tell where the packet was previously freed?
> > 
> > And when does the double free happen?
> 
> I have attached a gz of the typescript run of valgrind
> 
> All sorts of bad things happen with that patch (those problems
> didn't occur prior to patch)

Yes. Looking a little closer the change is too naive. I don't like
this code at all. :(

Could you revert the patch and find out if the leak is from data
transfer or from channel create/free?


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

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 24 19:26:46 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OIQfNE003164;
	Fri, 24 Feb 2012 19:26:46 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OIQdXW003136
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 19:26:39 +0100
Received: from int-mx02.intmail.prod.int.phx2.redhat.com
	(int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1OIQbfM001798
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 13:26:37 -0500
Received: from beast.broked.org (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id q1OIQaws030873
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 13:26:36 -0500
Message-ID: <4F47D607.9050503@redhat.com>
Date: Fri, 24 Feb 2012 11:25:11 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120209 Thunderbird/10.0.1
MIME-Version: 1.0
To: libssh2-devel@cool.haxx.se
Subject: Re: memory leak in _libssh2_channel_open
References: <4F46FC86.2030805@redhat.com> <20120224154639.28700.qmail@stuge.se>
	<4F47B5EB.3090209@redhat.com> <20120224161501.30930.qmail@stuge.se>
	<4F47C55F.5070305@redhat.com> <20120224172220.3831.qmail@stuge.se>
	<4F47C90F.4050109@redhat.com> <20120224181816.8122.qmail@stuge.se>
In-Reply-To: <20120224181816.8122.qmail@stuge.se>
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On 02/24/2012 11:18 AM, Peter Stuge wrote:
> Hi!
> 
> Steven Dake wrote:
>>>> I tried this patch and it resulted in double free followed by
>>>> segfault from gcc memory checker.
>>>
>>> Does valgrind tell where the packet was previously freed?
>>>
>>> And when does the double free happen?
>>
>> I have attached a gz of the typescript run of valgrind
>>
>> All sorts of bad things happen with that patch (those problems
>> didn't occur prior to patch)
> 
> Yes. Looking a little closer the change is too naive. I don't like
> this code at all. :(
> 
> Could you revert the patch and find out if the leak is from data
> transfer or from channel create/free?
> 
> 

The leak seems to occur when a non-blocking channel_open occurs, but
returns EAGAIN (and not all the time).  In this case it is transferring
some data, but not enough to close the deal on the open operation.  The
data packets stay around and are not freed appropriately.  The state
machine of open looks to me as if it should keep these packets around to
finish the non-blocking open operation.  I'm not sure if there should be
flushing or freeing of these packets after open finishes.  In any case,
when open returns NULL (and the error is set to EAGAIN) there is no
channel to free, although freeing in this way would likely damage the
integrity of the nb open state machine.

Regards
-steve

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

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

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 24 22:30:11 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OLTkOp014775;
	Fri, 24 Feb 2012 22:30:06 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OLTiZ2014762
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 22:29:44 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q1OLTiFa014759
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 22:29:44 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Fri, 24 Feb 2012 22:29:44 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: SFTP issues
In-Reply-To: <4F46EF8E.2000402@yahoo.com>
Message-ID: <alpine.DEB.2.00.1202242228560.14133@tvnag.unkk.fr>
References: <CADyPeTN2kgesrCBNBgaRFJ_M+L2oRHzcEAfNqikHCJek-JXqmQ@mail.gmail.com>
	<20120209111528.27773.qmail@stuge.se>
	<alpine.DEB.2.00.1202091401260.18645@tvnag.unkk.fr>
	<20120209140623.9606.qmail@stuge.se>
	<alpine.DEB.2.00.1202091538260.18645@tvnag.unkk.fr>
	<alpine.DEB.2.00.1202091547420.18645@tvnag.unkk.fr>
	<FD7412C4830543B38487CCFAA194F5D9@internal.avcosystems.com>
	<alpine.DEB.2.00.1202101419580.10678@tvnag.unkk.fr>
	<CADyPeTO6FfOpmiu68Cch14CEjxTvhUXX5-jy=kHk9kUy5gP8Ow@mail.gmail.com>
	<4F466680.9040605@yahoo.com>
	<20120223162820.20414.qmail@stuge.se> <ji5tav$ect$1@dough.gmane.org>
	<4F46EF8E.2000402@yahoo.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED;
	BOUNDARY="1129329158-1687613639-1330118984=:14133"
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

--1129329158-1687613639-1330118984=:14133
Content-Type: TEXT/PLAIN; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8BIT

On Fri, 24 Feb 2012, Salvador Fandiño wrote:

> Copy "replay.c" and "dump.gz" inside the libssh2-1.4.0 directory and build 
> "replay" with the following command:

What if you enable debug tracing, don't the last couple of hundred lines tell 
you anything? (and perhaps you can show them to us!)

-- 

  / daniel.haxx.se
--1129329158-1687613639-1330118984=:14133
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--1129329158-1687613639-1330118984=:14133--

From libssh2-devel-bounces@cool.haxx.se  Fri Feb 24 23:04:50 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OM4efg011762;
	Fri, 24 Feb 2012 23:04:49 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1OM4dlC011738
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 23:04:39 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q1OM4csf011730
	for <libssh2-devel@cool.haxx.se>; Fri, 24 Feb 2012 23:04:38 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Fri, 24 Feb 2012 23:04:38 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: memory leak in _libssh2_channel_open
In-Reply-To: <4F46FC86.2030805@redhat.com>
Message-ID: <alpine.DEB.2.00.1202242259090.14133@tvnag.unkk.fr>
References: <4F46FC86.2030805@redhat.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Thu, 23 Feb 2012, Steven Dake wrote:

> If I run my application for 8 hours, the leak adds up to 300k of memory 
> consumed.  I had a look into the code for several hours and don't see an 
> immediate way to fix the problem.  I'm not sure even what the problem is, as 
> the channel should free all packets on libssh2_channel_free.

I'm curious if the leak remains if your app exits? I mean, could it be packets 
that are received and are just appended in the incoming package queue and then 
are never discarded from there?

300K during 8 hours seems like a fairly small amount of memory per packet 
(assuming you have traffic semi-often on the connection) which would imply 
that the leak doesn't actually occur that often.

Let me point out that the ->payload allocated pointed is normally passed in 
to _libssh2_packet_add() where the packet is added to the incoming queue and 
it is subsequently freed when that packet has been handled.

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Sat Feb 25 00:14:48 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1ONETaA022475;
	Sat, 25 Feb 2012 00:14:45 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1ONERmH022466
	for <libssh2-devel@cool.haxx.se>; Sat, 25 Feb 2012 00:14:27 +0100
Received: from int-mx09.intmail.prod.int.phx2.redhat.com
	(int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1ONERLN022500
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 24 Feb 2012 18:14:27 -0500
Received: from beast.broked.org (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id q1ONEQpk028405; Fri, 24 Feb 2012 18:14:26 -0500
Message-ID: <4F48197D.1060201@redhat.com>
Date: Fri, 24 Feb 2012 16:13:01 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120209 Thunderbird/10.0.1
MIME-Version: 1.0
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: memory leak in _libssh2_channel_open
References: <4F46FC86.2030805@redhat.com>
	<alpine.DEB.2.00.1202242259090.14133@tvnag.unkk.fr>
In-Reply-To: <alpine.DEB.2.00.1202242259090.14133@tvnag.unkk.fr>
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
Cc: Daniel Stenberg <daniel@haxx.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On 02/24/2012 03:04 PM, Daniel Stenberg wrote:
> On Thu, 23 Feb 2012, Steven Dake wrote:
> 
>> If I run my application for 8 hours, the leak adds up to 300k of
>> memory consumed.  I had a look into the code for several hours and
>> don't see an immediate way to fix the problem.  I'm not sure even what
>> the problem is, as the channel should free all packets on
>> libssh2_channel_free.
> 
> I'm curious if the leak remains if your app exits? I mean, could it be
> packets that are received and are just appended in the incoming package
> queue and then are never discarded from there?
> 

If my app exits, libssh2 is no longer being consumed by my application
and the leak is collected by the operating system.

My app uses libssh2, and connects to a sshd daemon on remote virtual
machines.

It sends various commands every 10 seconds to check health of
applications ie:
systemctl status httpd
systemctl start httpd
systemctl stop httpd

The processes purpose is to maintain high availability of the VMs, so in
a best case scenario it would run for hundreds+ of days.

The problem is compounded by the fact that I intend for thousands of
these processes to be run on one machine (so in the case of 1000 VMs,
thats 300k*1000 leaked per 8 hours).

http://www.pacemaker-cloud.org to understand the use case

> 300K during 8 hours seems like a fairly small amount of memory per
> packet (assuming you have traffic semi-often on the connection) which
> would imply that the leak doesn't actually occur that often.
> 

yes data per packet seems small but adds up over time

> Let me point out that the ->payload allocated pointed is normally passed
> in to _libssh2_packet_add() where the packet is added to the incoming
> queue and it is subsequently freed when that packet has been handled.
> 

Perhaps a packet is coming back that is not handled (and thus not freed).

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

From libssh2-devel-bounces@cool.haxx.se  Sat Feb 25 00:18:45 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1ONIfmb025104;
	Sat, 25 Feb 2012 00:18:45 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1ONIenf025091
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Sat, 25 Feb 2012 00:18:40 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q1ONIeVq025087
	for <libssh2-devel@cool.haxx.se>; Sat, 25 Feb 2012 00:18:40 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Sat, 25 Feb 2012 00:18:40 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: memory leak in _libssh2_channel_open
In-Reply-To: <4F48197D.1060201@redhat.com>
Message-ID: <alpine.DEB.2.00.1202250015510.22794@tvnag.unkk.fr>
References: <4F46FC86.2030805@redhat.com>
	<alpine.DEB.2.00.1202242259090.14133@tvnag.unkk.fr>
	<4F48197D.1060201@redhat.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Fri, 24 Feb 2012, Steven Dake wrote:

>> I'm curious if the leak remains if your app exits? I mean, could it be 
>> packets that are received and are just appended in the incoming package 
>> queue and then are never discarded from there?
>
> If my app exits, libssh2 is no longer being consumed by my application and 
> the leak is collected by the operating system.

Sure, but valgrind would still helpfully point out the memory areas that 
weren't freed by libssh2 and thus were leaks. If they _were_ freed by libssh2 
on exit, they were data lingering in some list. Still a leak of some sorts, 
but it would help us understand what happens.

>> 300K during 8 hours seems like a fairly small amount of memory per
>> packet
>
> yes data per packet seems small but adds up over time

Oh indeed. I'm not making up excuses, I'm just trying to make observations to 
figure out patterns of when it happens.

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Sat Feb 25 00:21:40 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1ONLaZt027467;
	Sat, 25 Feb 2012 00:21:39 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1ONLXZP027436
	for <libssh2-devel@cool.haxx.se>; Sat, 25 Feb 2012 00:21:34 +0100
Received: from int-mx10.intmail.prod.int.phx2.redhat.com
	(int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1ONLY6W025753
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 24 Feb 2012 18:21:34 -0500
Received: from beast.broked.org (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id q1ONLXou011144; Fri, 24 Feb 2012 18:21:33 -0500
Message-ID: <4F481B28.7040409@redhat.com>
Date: Fri, 24 Feb 2012 16:20:08 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120209 Thunderbird/10.0.1
MIME-Version: 1.0
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: memory leak in _libssh2_channel_open
References: <4F46FC86.2030805@redhat.com>
	<alpine.DEB.2.00.1202242259090.14133@tvnag.unkk.fr>
	<4F48197D.1060201@redhat.com>
	<alpine.DEB.2.00.1202250015510.22794@tvnag.unkk.fr>
In-Reply-To: <alpine.DEB.2.00.1202250015510.22794@tvnag.unkk.fr>
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
Cc: Daniel Stenberg <daniel@haxx.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On 02/24/2012 04:18 PM, Daniel Stenberg wrote:
> On Fri, 24 Feb 2012, Steven Dake wrote:
> 
>>> I'm curious if the leak remains if your app exits? I mean, could it
>>> be packets that are received and are just appended in the incoming
>>> package queue and then are never discarded from there?
>>
>> If my app exits, libssh2 is no longer being consumed by my application
>> and the leak is collected by the operating system.
> 
> Sure, but valgrind would still helpfully point out the memory areas that
> weren't freed by libssh2 and thus were leaks. If they _were_ freed by
> libssh2 on exit, they were data lingering in some list. Still a leak of
> some sorts, but it would help us understand what happens.
> 

Yes I understand now - I'll add a signal handler and correctly free data
on exit and report back.

Regards
-steve

>>> 300K during 8 hours seems like a fairly small amount of memory per
>>> packet
>>
>> yes data per packet seems small but adds up over time
> 
> Oh indeed. I'm not making up excuses, I'm just trying to make
> observations to figure out patterns of when it happens.
> 

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

From libssh2-devel-bounces@cool.haxx.se  Sat Feb 25 16:32:20 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1PFVsuq032262;
	Sat, 25 Feb 2012 16:32:17 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1PFVqje032156
	for <libssh2-devel@cool.haxx.se>; Sat, 25 Feb 2012 16:31:52 +0100
Received: from int-mx09.intmail.prod.int.phx2.redhat.com
	(int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1PFVn8B023674
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Sat, 25 Feb 2012 10:31:49 -0500
Received: from beast.broked.org (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id q1PFVmwH014761; Sat, 25 Feb 2012 10:31:49 -0500
Message-ID: <4F48FE8F.7060300@redhat.com>
Date: Sat, 25 Feb 2012 08:30:23 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120209 Thunderbird/10.0.1
MIME-Version: 1.0
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: memory leak in _libssh2_channel_open
References: <4F46FC86.2030805@redhat.com>
	<alpine.DEB.2.00.1202242259090.14133@tvnag.unkk.fr>
	<4F48197D.1060201@redhat.com>
	<alpine.DEB.2.00.1202250015510.22794@tvnag.unkk.fr>
	<4F481B28.7040409@redhat.com>
In-Reply-To: <4F481B28.7040409@redhat.com>
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
Cc: Daniel Stenberg <daniel@haxx.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On 02/24/2012 04:20 PM, Steven Dake wrote:
> On 02/24/2012 04:18 PM, Daniel Stenberg wrote:
>> On Fri, 24 Feb 2012, Steven Dake wrote:
>>
>>>> I'm curious if the leak remains if your app exits? I mean, could it
>>>> be packets that are received and are just appended in the incoming
>>>> package queue and then are never discarded from there?
>>>
>>> If my app exits, libssh2 is no longer being consumed by my application
>>> and the leak is collected by the operating system.
>>
>> Sure, but valgrind would still helpfully point out the memory areas that
>> weren't freed by libssh2 and thus were leaks. If they _were_ freed by
>> libssh2 on exit, they were data lingering in some list. Still a leak of
>> some sorts, but it would help us understand what happens.
>>
> 
> Yes I understand now - I'll add a signal handler and correctly free data
> on exit and report back.
> 

Daniel,

After adding the sigint handler, letting my app run for 12 hours, then
ctrl-c the app inside valgrind, the leaks are collected by the sigint
handler.

My sigint handler frees any open channels at the time via
libssh2_channel_free() and frees any open sessions| via
libssh2_session_free().  There are some other key gen releated 1-3 block
leaks which don't concern me (and I am probably not cleaning up ssh
globally).

So it appears the packets are still present on the session list but
somehow dropped by the open call and not removed.

If you have other suggestions for getting to the root cause please let
me know.  I am happy to help.

Regards
-steve

> Regards
> -steve
> 
>>>> 300K during 8 hours seems like a fairly small amount of memory per
>>>> packet
>>>
>>> yes data per packet seems small but adds up over time
>>
>> Oh indeed. I'm not making up excuses, I'm just trying to make
>> observations to figure out patterns of when it happens.
>>
> 
> _______________________________________________
> libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel

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

From libssh2-devel-bounces@cool.haxx.se  Sat Feb 25 17:13:03 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1PGCrwG004923;
	Sat, 25 Feb 2012 17:13:02 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1PGComi004906
	for <libssh2-devel@cool.haxx.se>; Sat, 25 Feb 2012 17:12:51 +0100
Received: from int-mx10.intmail.prod.int.phx2.redhat.com
	(int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1PGCpw4006747
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)
	for <libssh2-devel@cool.haxx.se>; Sat, 25 Feb 2012 11:12:51 -0500
Received: from beast.broked.org (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id q1PGCoep008813
	for <libssh2-devel@cool.haxx.se>; Sat, 25 Feb 2012 11:12:51 -0500
Message-ID: <4F49082D.7040602@redhat.com>
Date: Sat, 25 Feb 2012 09:11:25 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120209 Thunderbird/10.0.1
MIME-Version: 1.0
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: sharing experiences with nonblocking exec and NVAL from
	libssh2_channel_wait_closed() with community
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Hi,

I have a state machine which does the following:

libssh2_channel_open()
libssh2_channel_exec()
libssh2_channel_send_eof()
libssh2_channel_wait_eof()
libssh2_channel_close()
libssh2_channel_read()
libssh2_channel_wait_closed()
libssh2_channel_free()

In the case thet libssh2_channel_wait_closed() returns
LIBSSH2_ERROR_INVAL, the code goes back to the READ state and schedules
more reads until WAIT_CLOSED returns 0.  This will cause the
wait_closed() operation to finally return 0 (rather then -34 or -37).

The reason for the enter back into the read state is that
libssh2_channel_wait_closed() checks for eof, and even though the code
has already checked and passed the EOF state, further packets appear to
be sent on the channel.  This causes the internal code to mask the EOF
state which can only be corrected by reading packets.

This seems like some kind of odd race condition to me, but fwiw I hope
others find this state machine helpful if implementing nonblocking ssh
connecting software of their own:

https://github.com/pacemaker-cloud/pacemaker-cloud/blob/master/src/trans_ssh.c

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

From libssh2-devel-bounces@cool.haxx.se  Sat Feb 25 20:19:20 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1PJJIdw022266;
	Sat, 25 Feb 2012 20:19:20 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q1PJJGBC022257
	for <libssh2-devel@cool.haxx.se>; Sat, 25 Feb 2012 20:19:16 +0100
Received: (qmail 20650 invoked by uid 501); 25 Feb 2012 19:19:18 -0000
Message-ID: <20120225191918.20649.qmail@stuge.se>
Date: Sat, 25 Feb 2012 20:19:18 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: sharing experiences with nonblocking exec and NVAL from
	libssh2_channel_wait_closed() with community
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <4F49082D.7040602@redhat.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <4F49082D.7040602@redhat.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Steven Dake wrote:
> The reason for the enter back into the read state is that
> libssh2_channel_wait_closed() checks for eof, and even though the code
> has already checked and passed the EOF state, further packets appear to
> be sent on the channel.

I'm not sure if that is allowed. What packets are sent?


> This seems like some kind of odd race condition to me,

Can you show libssh2 trace output from this happening?


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

From libssh2-devel-bounces@cool.haxx.se  Sat Feb 25 21:00:00 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1PJHe7j021245;
	Sat, 25 Feb 2012 20:18:01 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q1PJHc1v021230
	for <libssh2-devel@cool.haxx.se>; Sat, 25 Feb 2012 20:17:38 +0100
Received: (qmail 20496 invoked by uid 501); 25 Feb 2012 19:17:39 -0000
Message-ID: <20120225191739.20495.qmail@stuge.se>
Date: Sat, 25 Feb 2012 20:17:39 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: memory leak in _libssh2_channel_open
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <4F46FC86.2030805@redhat.com>
	<alpine.DEB.2.00.1202242259090.14133@tvnag.unkk.fr>
	<4F48197D.1060201@redhat.com>
	<alpine.DEB.2.00.1202250015510.22794@tvnag.unkk.fr>
	<4F481B28.7040409@redhat.com> <4F48FE8F.7060300@redhat.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <4F48FE8F.7060300@redhat.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Steven Dake wrote:
> After adding the sigint handler, letting my app run for 12 hours, then
> ctrl-c the app inside valgrind, the leaks are collected by the sigint
> handler.
> 
> My sigint handler frees any open channels at the time via
> libssh2_channel_free() and frees any open sessions| via
> libssh2_session_free().

Please try without calling _session_free() so that we can test the
hypothesis.

> So it appears the packets are still present on the session list but
> somehow dropped by the open call and not removed.


Thanks!

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

From libssh2-devel-bounces@cool.haxx.se  Sat Feb 25 22:25:48 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1PLPSuu004113;
	Sat, 25 Feb 2012 22:25:46 +0100
Received: from giant.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1PLPQKl004099
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT);
	Sat, 25 Feb 2012 22:25:26 +0100
Received: from localhost (dast@localhost)
	by giant.haxx.se (8.14.4/8.14.4/Submit) with ESMTP id q1PLPQma004091;
	Sat, 25 Feb 2012 22:25:26 +0100
X-Authentication-Warning: giant.haxx.se: dast owned process doing -bs
Date: Sat, 25 Feb 2012 22:25:26 +0100 (CET)
From: Daniel Stenberg <daniel@haxx.se>
X-X-Sender: dast@giant.haxx.se
To: Steven Dake <sdake@redhat.com>
Subject: Re: memory leak in _libssh2_channel_open
In-Reply-To: <4F48FE8F.7060300@redhat.com>
Message-ID: <alpine.DEB.2.00.1202252220530.13027@tvnag.unkk.fr>
References: <4F46FC86.2030805@redhat.com>
	<alpine.DEB.2.00.1202242259090.14133@tvnag.unkk.fr>
	<4F48197D.1060201@redhat.com>
	<alpine.DEB.2.00.1202250015510.22794@tvnag.unkk.fr>
	<4F481B28.7040409@redhat.com> <4F48FE8F.7060300@redhat.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
X-fromdanielhimself: yes
MIME-Version: 1.0
Cc: libssh2 development <libssh2-devel@cool.haxx.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On Sat, 25 Feb 2012, Steven Dake wrote:

> So it appears the packets are still present on the session list but somehow 
> dropped by the open call and not removed.
>
> If you have other suggestions for getting to the root cause please let me 
> know.  I am happy to help.

My suspicion is that the call to _libssh2_list_add() within the 
src/packet.c:_libssh2_packet_add() function is what adds the packet to the 
incoming queue of packets, and some packets that arrive are never yanked off 
that list.

If you would add some debug code that would count the length of that linked 
list and logged it occasionally we could see if that is true. The list should 
really only grow temporarily and then go back to almost nothing. If that turns 
out to be true, we then of course need to figure out what packets that are 
lingering there and how to stop them from doing it!

(BTW, I'll be away on a week's vacation starting tomorrow so I might not 
respond very quickly until I get back.)

-- 

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

From libssh2-devel-bounces@cool.haxx.se  Sun Feb 26 12:58:44 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1QBwQU1010001;
	Sun, 26 Feb 2012 12:58:41 +0100
Received: from mail-iy0-f182.google.com (mail-iy0-f182.google.com
	[209.85.210.182])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1QBvhA2009591
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Sun, 26 Feb 2012 12:57:44 +0100
Received: by iaeo4 with SMTP id o4so6384394iae.41
	for <libssh2-devel@cool.haxx.se>; Sun, 26 Feb 2012 03:57:37 -0800 (PST)
Received-SPF: pass (google.com: domain of saptah@gmail.com designates
	10.42.168.197 as permitted sender) client-ip=10.42.168.197; 
Authentication-Results: mr.google.com;
	spf=pass (google.com: domain of saptah@gmail.com
	designates 10.42.168.197 as permitted sender)
	smtp.mail=saptah@gmail.com; dkim=pass header.i=saptah@gmail.com
Received: from mr.google.com ([10.42.168.197])
	by 10.42.168.197 with SMTP id x5mr10135080icy.6.1330257457903 (num_hops
	= 1); Sun, 26 Feb 2012 03:57:37 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=yM7rZdrR1U8FeMl4f6GLfYeKv8JHWHdEeadRzTXFeQ4=;
	b=VW9Kh6b+oc3sFSTnWBDCt1NARSFFugiQNjFuqbLRJQXkam1cbejTDmefyUYT2PIib6
	vN+XmEMj5E1zOGp6+nZjaolLhAAmNeCxvaWIUWhYTIuo4eoJYRpos82sU9BeegtvmIaC
	swd4mqUnpiHcZ0vJFXjywwFDerks3kHNAi6S4=
MIME-Version: 1.0
Received: by 10.42.168.197 with SMTP id x5mr8168211icy.6.1330257457782; Sun,
	26 Feb 2012 03:57:37 -0800 (PST)
Received: by 10.42.220.135 with HTTP; Sun, 26 Feb 2012 03:57:37 -0800 (PST)
Date: Sun, 26 Feb 2012 12:57:37 +0100
Message-ID: <CALfKU6OsG5dBcbmim3FciF3FGtB2ZUAgOk4OLfxj6F0gcMqK0g@mail.gmail.com>
Subject: libssh2_channel_read example
From: vicent roca daniel <saptah@gmail.com>
To: libssh2-devel@cool.haxx.se
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1771026746=="
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

--===============1771026746==
Content-Type: multipart/alternative; boundary=90e6ba6e89ca3b200e04b9dcb35b

--90e6ba6e89ca3b200e04b9dcb35b
Content-Type: text/plain; charset=ISO-8859-1

Hi guys,
I'm having problems getting to work properly the function
libssh2_channel_read, this is an example code of what I'm doing:

/* vars def */
int rc = 0;
char buffer2[1024*4];
FILE *file;



file = fopen("somefile.txt, "w");

/* reopen the channel for the new command */
new_channel();

/* execute  command */
rc = libssh2_channel_exec(channel, "/bin/ssh_command argument1");

 while( (read = libssh2_channel_read( channel, buffer2, sizeof(buffer2))) >
0 )
  {
        fwrite(buffer2, sizeof(char), read, file);
  }

fclose( file );



I Don't know if this way of reading an ssh command output, and dumping to a
file is correct, becouse I'm getting some segmentation fails forward in the
code, and I suspect It came from here....

Anu hints are very welcome! Thanks :)

--90e6ba6e89ca3b200e04b9dcb35b
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hi guys,<br>I&#39;m having problems getting to work properly the function l=
ibssh2_channel_read, this is an example code of what I&#39;m doing:<br><br>=
/* vars def */<br>int rc =3D 0;<br>char buffer2[1024*4];<br>FILE *file;<br>
<br><br><br>file =3D fopen(&quot;somefile.txt, &quot;w&quot;);<br><br>/* re=
open the channel for the new command */<br>new_channel();<br><br>/* execute=
=A0 command */=A0=A0=A0 <br>rc =3D libssh2_channel_exec(channel, &quot;/bin=
/ssh_command argument1&quot;);<br>
=A0=A0=A0 <br>=A0while( (read =3D libssh2_channel_read( channel, buffer2, s=
izeof(buffer2))) &gt; 0 )<br>=A0 {<br>=A0=A0=A0 =A0=A0=A0 fwrite(buffer2, s=
izeof(char), read, file);<br>=A0 }<br>=A0 <br>fclose( file );<br><br><br><b=
r>I Don&#39;t know if this way of reading an ssh command output, and dumpin=
g to a file is correct, becouse I&#39;m getting some segmentation fails for=
ward in the code, and I suspect It came from here....<br>
<br>Anu hints are very welcome! Thanks :)<br><br>

--90e6ba6e89ca3b200e04b9dcb35b--

--===============1771026746==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--===============1771026746==--

From libssh2-devel-bounces@cool.haxx.se  Sun Feb 26 16:23:41 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1QFNIXf017557;
	Sun, 26 Feb 2012 16:23:37 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1QFNFjZ017445
	for <libssh2-devel@cool.haxx.se>; Sun, 26 Feb 2012 16:23:16 +0100
Received: from int-mx11.intmail.prod.int.phx2.redhat.com
	(int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1QFNAgV024477
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Sun, 26 Feb 2012 10:23:10 -0500
Received: from beast.broked.org (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id q1QFN8YD031079; Sun, 26 Feb 2012 10:23:09 -0500
Message-ID: <4F4A4E08.1010502@redhat.com>
Date: Sun, 26 Feb 2012 08:21:44 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120209 Thunderbird/10.0.1
MIME-Version: 1.0
To: libssh2-devel@cool.haxx.se
Subject: Re: sharing experiences with nonblocking exec and NVAL from
	libssh2_channel_wait_closed() with community
References: <4F49082D.7040602@redhat.com> <20120225191918.20649.qmail@stuge.se>
In-Reply-To: <20120225191918.20649.qmail@stuge.se>
Content-Type: multipart/mixed; boundary="------------070204040704010502010509"
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24
Cc: peter@stuge.se
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

This is a multi-part message in MIME format.
--------------070204040704010502010509
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

On 02/25/2012 12:19 PM, Peter Stuge wrote:
> Steven Dake wrote:
>> The reason for the enter back into the read state is that
>> libssh2_channel_wait_closed() checks for eof, and even though the code
>> has already checked and passed the EOF state, further packets appear to
>> be sent on the channel.
> 
> I'm not sure if that is allowed. What packets are sent?
> 
97

> 
>> This seems like some kind of odd race condition to me,
> 
> Can you show libssh2 trace output from this happening?
> 
> 

Turns out I was wrong with "read" fixing up the connection.  My code
actually has a timer (5 seconds) on the ssh connection and eventually
times out the connection on the return of -34.  The packet which is sent
is 97 (close).  The offending code is at channelc:2179:
    while (packet) {
        if (((packet->data[0] == SSH_MSG_CHANNEL_DATA)
             || (packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA))
            && (channel->local.id == _libssh2_ntohu32(packet->data + 1))) {
            /* There's data waiting to be read yet, mask the EOF status */
            return 0;
        }
        packet = _libssh2_list_next(&packet->node);
    }


(the return 0)

I have attached the typescript of the scenario happening.

One thing that I noticed after looking at the typescript with libssh2
tracing is that my code may be doing two execs on the same session at
the same time (in a nonblocking way).

I had assumed two outstanding execs would be safe - is that assumption
correct?  Could also relate to my packet leaking..

Thanks!
-steve



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


--------------070204040704010502010509
Content-Type: application/x-gzip;
 name="typescript.gz"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="typescript.gz"

H4sICCBISk8CA3R5cGVzY3JpcHQA7b1plxXF1i388R33jPH8gvslxQZQiMq+2YqSLSCtgiAi
YjUbKKnOakBE/e3vmjMyInPnzo27Cqn7nDH0eBShMjIyYsWKNVcz1931/c29Q+fgcHX/cLrh
7O44d492HD92muma47ue77jJJIomge/kN52bd+/95/8+dj8/2Fh9Mb28Nl09OJysPN/dnq7w
d1b2p3u7Byt7q+vTbfnP/YvrW7tHGysH++v/3/999JXnBuHzR/u7u4f6SUd+//GHjlpZX92b
Xjw4eL7hbEz3Lr7a+5//3Myv3XIebe483XWcx861HZnezvrUObt6cPD64qvd/Y29/enBwcXG
i886rzYPnzurGxv4Hees5yr8z3PPOuvPV3eeyTcd7jrffnfr1rVbV5zNHedcFLiZs31wXpnX
7Owebq5PHzvl7s7OdP1wU9ZAfm5vf/cZh5TH5bXT7bWt16MTWHq2268Pft1625y9hXNOfDf9
p+bcTWPBYPr1f/PNj7Y212TL/MeOqyLPC0PPube/unOwt7t/OHEO5AdlTk8oVkd7ztPdfedg
d/3F9NBJ55/N3P6zd6c7G5s7z5xiVWazL/999+pFX7kX24eeeCpU7twgURg6d/kGjnDo+MGK
Hzhrrw+nB87qoeP+ljxdC/wk9SM/2PhsOEDsxZlvB/h2uv5SVsFrH1/jTOaeSHzv2E9kx30i
iI77RHjsWYXxcZ+Ijr1WUXrcJ+Lg2E8ce3WT8LhPpO6xnzj2DmbH3sHsuDuYut6xn0iO+4QX
HPuJ40pJ6h/7HcGxvzxI+/pJHppu4rGhgrq9N92RXz+JVDo3RpamzvXpa6f+rVVP1+vvJ87G
5tOnm9OLz6dbW9urOxef7e8e7XnhxYPnq96FsT+7OP1NXxCLf8TjH82/Pwtm33/19t171+uH
oqoPnl/cP1i9gH9vHByMPBnNPll++/DOvSfl3YmzOj3w/PTi+uH+Bfwy880v/Sie+eXa+oX9
zV92NlanW/iPy1uvD1YPd/fV1uaROpjah+XHzJDyy7Wt3VdPN2VW/P399ae7R/vyZ+aXF9bF
hDA/G2xMD/CLkdmnY7O/W/43zN535ZTOzP5mXnLln2+vrmsZsL+6mMX6P7Y3IvsL+5ti5E23
N7zYHfzn5V0RWnmjWt/dHnl9MP96LN1pvX4oebdv3uHn7+zuTEd+PBn5cUx3wY9nsz9+I791
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
--------------070204040704010502010509
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--------------070204040704010502010509--

From libssh2-devel-bounces@cool.haxx.se  Sun Feb 26 19:44:50 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1QIiLdN025258;
	Sun, 26 Feb 2012 19:44:45 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1QIiHg5025151
	for <libssh2-devel@cool.haxx.se>; Sun, 26 Feb 2012 19:44:18 +0100
Received: from int-mx10.intmail.prod.int.phx2.redhat.com
	(int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1QIiCXj019667
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)
	for <libssh2-devel@cool.haxx.se>; Sun, 26 Feb 2012 13:44:12 -0500
Received: from beast.broked.org.com (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id q1QIiB14026833; Sun, 26 Feb 2012 13:44:12 -0500
From: Steven Dake <sdake@redhat.com>
To: libssh2-devel@cool.haxx.se
Subject: [PATCH] Add tracing to print packets left on session at
	libssh2_session_free
Date: Sun, 26 Feb 2012 11:42:42 -0700
Message-Id: <1330281762-20255-1-git-send-email-sdake@redhat.com>
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
Cc: Steven Dake <sdake@redhat.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Signed-off-by: Steven Dake <sdake@redhat.com>
---
 src/session.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/src/session.c b/src/session.c
index f15d003..81cd704 100644
--- a/src/session.c
+++ b/src/session.c
@@ -828,6 +828,7 @@ session_free(LIBSSH2_SESSION *session)
     LIBSSH2_PACKET *pkg;
     LIBSSH2_CHANNEL *ch;
     LIBSSH2_LISTENER *l;
+    int packets_left = 0;
 
     if (session->free_state == libssh2_NB_state_idle) {
         _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "Freeing session resource",
@@ -1018,6 +1019,9 @@ session_free(LIBSSH2_SESSION *session)
 
     /* Cleanup all remaining packets */
     while ((pkg = _libssh2_list_first(&session->packets))) {
+        packets_left++;
+        _libssh2_debug(session, LIBSSH2_TRACE_TRANS,
+            "packet left with id %d", pkg->data[0]);
         /* unlink the node */
         _libssh2_list_remove(&pkg->node);
 
@@ -1025,6 +1029,8 @@ session_free(LIBSSH2_SESSION *session)
         LIBSSH2_FREE(session, pkg->data);
         LIBSSH2_FREE(session, pkg);
     }
+    _libssh2_debug(session, LIBSSH2_TRACE_TRANS,
+         "Extra packets left %d", packets_left);
 
     if(session->socket_prev_blockstate)
         /* if the socket was previously blocking, put it back so */
-- 
1.7.7.6

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

From libssh2-devel-bounces@cool.haxx.se  Sun Feb 26 20:07:57 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1QJ7nlB012265;
	Sun, 26 Feb 2012 20:07:56 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1QJ7kjD012202
	for <libssh2-devel@cool.haxx.se>; Sun, 26 Feb 2012 20:07:47 +0100
Received: from int-mx01.intmail.prod.int.phx2.redhat.com
	(int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1QJ7eCu005022
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Sun, 26 Feb 2012 14:07:42 -0500
Received: from beast.broked.org (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id q1QI8uOo012159; Sun, 26 Feb 2012 13:08:58 -0500
Message-ID: <4F4A74E3.3050006@redhat.com>
Date: Sun, 26 Feb 2012 11:07:31 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120209 Thunderbird/10.0.1
MIME-Version: 1.0
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: sharing experiences with nonblocking exec and NVAL from
	libssh2_channel_wait_closed() with community
References: <4F49082D.7040602@redhat.com> <20120225191918.20649.qmail@stuge.se>
	<4F4A4E08.1010502@redhat.com>
In-Reply-To: <4F4A4E08.1010502@redhat.com>
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
Cc: peter@stuge.se
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On 02/26/2012 08:21 AM, Steven Dake wrote:
> On 02/25/2012 12:19 PM, Peter Stuge wrote:
>> Steven Dake wrote:
>>> The reason for the enter back into the read state is that
>>> libssh2_channel_wait_closed() checks for eof, and even though the code
>>> has already checked and passed the EOF state, further packets appear to
>>> be sent on the channel.
>>
>> I'm not sure if that is allowed. What packets are sent?
>>
> 97
> 
>>
>>> This seems like some kind of odd race condition to me,
>>
>> Can you show libssh2 trace output from this happening?
>>
>>
> 
> Turns out I was wrong with "read" fixing up the connection.  My code
> actually has a timer (5 seconds) on the ssh connection and eventually
> times out the connection on the return of -34.  The packet which is sent
> is 97 (close).  The offending code is at channelc:2179:
>     while (packet) {
>         if (((packet->data[0] == SSH_MSG_CHANNEL_DATA)
>              || (packet->data[0] == SSH_MSG_CHANNEL_EXTENDED_DATA))
>             && (channel->local.id == _libssh2_ntohu32(packet->data + 1))) {
>             /* There's data waiting to be read yet, mask the EOF status */
>             return 0;
>         }
>         packet = _libssh2_list_next(&packet->node);
>     }
> 
> 
> (the return 0)
> 
> I have attached the typescript of the scenario happening.
> 
> One thing that I noticed after looking at the typescript with libssh2
> tracing is that my code may be doing two execs on the same session at
> the same time (in a nonblocking way).
> 
> I had assumed two outstanding execs would be safe - is that assumption
> correct?  Could also relate to my packet leaking..
> 
Further follow up on this point.  I changed my code around so that it
only schedules one non-blocking exec at a time (Ie i go from open to
free before doing another open operation).  This resolves the -34 error
code with the wait_closed but the leak in the other thread we discussed
is still present with this change.

If multiple non-blocking execs can't be sent on the session, might be
helpful to add that info to the man page.  If the intent is for multiple
non-blocing execs to occur on a session at one time, the code as is
appears defective.

Hope the extra info helps.

Regards
-steve

> Thanks!
> -steve
> 
> 
> 
>> //Peter
>> _______________________________________________
>> libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel
> 
> 
> 
> _______________________________________________
> libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel

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

From libssh2-devel-bounces@cool.haxx.se  Sun Feb 26 20:10:34 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1QJAVNr014417;
	Sun, 26 Feb 2012 20:10:34 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1QJATIp014385
	for <libssh2-devel@cool.haxx.se>; Sun, 26 Feb 2012 20:10:30 +0100
Received: from int-mx12.intmail.prod.int.phx2.redhat.com
	(int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1QJAUC8025112
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Sun, 26 Feb 2012 14:10:30 -0500
Received: from beast.broked.org (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id q1QIC82c005906; Sun, 26 Feb 2012 13:12:09 -0500
Message-ID: <4F4A75A4.7020001@redhat.com>
Date: Sun, 26 Feb 2012 11:10:44 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120209 Thunderbird/10.0.1
MIME-Version: 1.0
To: Daniel Stenberg <daniel@haxx.se>
Subject: Re: memory leak in _libssh2_channel_open
References: <4F46FC86.2030805@redhat.com>
	<alpine.DEB.2.00.1202242259090.14133@tvnag.unkk.fr>
	<4F48197D.1060201@redhat.com>
	<alpine.DEB.2.00.1202250015510.22794@tvnag.unkk.fr>
	<4F481B28.7040409@redhat.com> <4F48FE8F.7060300@redhat.com>
	<alpine.DEB.2.00.1202252220530.13027@tvnag.unkk.fr>
In-Reply-To: <alpine.DEB.2.00.1202252220530.13027@tvnag.unkk.fr>
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
Cc: libssh2 development <libssh2-devel@cool.haxx.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

On 02/25/2012 02:25 PM, Daniel Stenberg wrote:
> On Sat, 25 Feb 2012, Steven Dake wrote:
> 
>> So it appears the packets are still present on the session list but
>> somehow dropped by the open call and not removed.
>>
>> If you have other suggestions for getting to the root cause please let
>> me know.  I am happy to help.
> 
> My suspicion is that the call to _libssh2_list_add() within the
> src/packet.c:_libssh2_packet_add() function is what adds the packet to
> the incoming queue of packets, and some packets that arrive are never
> yanked off that list.
> 
> If you would add some debug code that would count the length of that
> linked list and logged it occasionally we could see if that is true. The
> list should really only grow temporarily and then go back to almost
> nothing. If that turns out to be true, we then of course need to figure
> out what packets that are lingering there and how to stop them from
> doing it!

Thanks for the tip.  I'll see if I can instrument this code as you
suggested and determine which packet id is pending on the list if the
list doesn't go to zero.

Enjoy your vacation

Regards
-steve

> 
> (BTW, I'll be away on a week's vacation starting tomorrow so I might not
> respond very quickly until I get back.)
> 

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

From libssh2-devel-bounces@cool.haxx.se  Sun Feb 26 20:18:17 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1QJI78m019887;
	Sun, 26 Feb 2012 20:18:16 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1QJI5ov019870
	for <libssh2-devel@cool.haxx.se>; Sun, 26 Feb 2012 20:18:05 +0100
Received: from int-mx09.intmail.prod.int.phx2.redhat.com
	(int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1QJI5WB008121
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Sun, 26 Feb 2012 14:18:05 -0500
Received: from beast.broked.org (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id q1QJI3jt019516; Sun, 26 Feb 2012 14:18:05 -0500
Message-ID: <4F4A8517.9050808@redhat.com>
Date: Sun, 26 Feb 2012 12:16:39 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120209 Thunderbird/10.0.1
MIME-Version: 1.0
To: Daniel Stenberg <daniel@haxx.se>
Subject: Re: memory leak in _libssh2_channel_open
References: <4F46FC86.2030805@redhat.com>
	<alpine.DEB.2.00.1202242259090.14133@tvnag.unkk.fr>
	<4F48197D.1060201@redhat.com>
	<alpine.DEB.2.00.1202250015510.22794@tvnag.unkk.fr>
	<4F481B28.7040409@redhat.com> <4F48FE8F.7060300@redhat.com>
	<alpine.DEB.2.00.1202252220530.13027@tvnag.unkk.fr>
In-Reply-To: <alpine.DEB.2.00.1202252220530.13027@tvnag.unkk.fr>
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
Cc: libssh2 development <libssh2-devel@cool.haxx.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from base64 to 8bit by giant.haxx.se id q1QJI78m019887

On 02/25/2012 02:25 PM, Daniel Stenberg wrote:
> On Sat, 25 Feb 2012, Steven Dake wrote:
> 
>> So it appears the packets are still present on the session list but
>> somehow dropped by the open call and not removed.
>>
>> If you have other suggestions for getting to the root cause please let
>> me know.  I am happy to help.
> 
> My suspicion is that the call to _libssh2_list_add() within the
> src/packet.c:_libssh2_packet_add() function is what adds the packet to
> the incoming queue of packets, and some packets that arrive are never
> yanked off that list.
> 
> If you would add some debug code that would count the length of that
> linked list and logged it occasionally we could see if that is true. The
> list should really only grow temporarily and then go back to almost
> nothing. If that turns out to be true, we then of course need to figure
> out what packets that are lingering there and how to stop them from
> doing it!
> 
> (BTW, I'll be away on a week's vacation starting tomorrow so I might not
> respond very quickly until I get back.)
> 

I have found two packets that seem to leak into the session packet list
which are not removed

The packet id 3 (#define SSH_MSG_UNIMPLEMENTED) seems to leak 1 or 2 times.

Stack trace:
#0  0x000000366b436285 in raise () from /lib64/libc.so.6
#1  0x000000366b437b9b in abort () from /lib64/libc.so.6
#2  0x000000366b42ee9e in __assert_fail_base () from /lib64/libc.so.6
#3  0x000000366b42ef42 in __assert_fail () from /lib64/libc.so.6
#4  0x00007ffff7b5684b in _libssh2_packet_add (session=0x62eea0,
data=0x623500 "\024\250x\006\275 \336!\220\070\371#\375uÄŠ%",
datalen=769, macstate=0) at packet.c:429
#5  0x00007ffff7b6a96f in fullpacket (session=0x62eea0, encrypted=0) at
transport.c:236
#6  0x00007ffff7b6b1f3 in _libssh2_transport_read (session=0x62eea0) at
transport.c:556
#7  0x00007ffff7b57f4a in _libssh2_packet_require (session=0x62eea0,
packet_type=20 '\024', data=0x63bcb8, data_len=0x63bcc0, match_ofs=0,
match_buf=0x0, match_len=0, state=
    0x63bb60) at packet.c:1097
#8  0x00007ffff7b54167 in _libssh2_kex_exchange (session=0x62eea0,
reexchange=0, key_state=0x63bb58) at kex.c:1717
#9  0x00007ffff7b5ddf0 in session_startup (session=0x62eea0, sock=12) at
session.c:718
#10 0x00007ffff7b5e0ba in libssh2_session_handshake (session=0x62eea0,
sock=12) at session.c:796
#11 0x00007ffff7b5e112 in libssh2_session_startup (session=0x62eea0,
sock=12) at session.c:815
#12 0x000000000040600c in ssh_assembly_connect (data=0x629c60) at
trans_ssh.c:374
#13 0x00007ffff7d8b1eb in job_dispatch (item=0x6261b0, p=<optimized
out>) at loop_job.c:39
#14 0x00007ffff7d89d37 in qb_loop_run_level (level=0x60ff30) at loop.c:45
#15 qb_loop_run (lp=<optimized out>) at loop.c:206
#16 0x0000000000403745 in main (argc=<optimized out>,
argv=0x7fffffffde48) at caped.c:171


The packet id of 82 (#define SSH_MSG_REQUEST_FAILURE 82) leaks continuously.

Two stack traces:
consistent leaks:
#0  0x000000366b436285 in raise () from /lib64/libc.so.6
#1  0x000000366b437b9b in abort () from /lib64/libc.so.6
#2  0x000000366b42ee9e in __assert_fail_base () from /lib64/libc.so.6
#3  0x000000366b42ef42 in __assert_fail () from /lib64/libc.so.6
#4  0x00007ffff7b56864 in _libssh2_packet_add (session=0x655220,
data=0x66e9b0 "`", datalen=5, macstate=0) at packet.c:430
#5  0x00007ffff7b6a987 in fullpacket (session=0x655220, encrypted=1) at
transport.c:236
#6  0x00007ffff7b6b20b in _libssh2_transport_read (session=0x655220) at
transport.c:556
#7  0x00007ffff7b4d8c2 in channel_wait_eof (channel=0x670c80) at
channel.c:2213
#8  0x00007ffff7b4d948 in libssh2_channel_wait_eof (channel=0x670c80) at
channel.c:2242
#9  0x00000000004058ea in assembly_ssh_exec (data=0x670800) at
trans_ssh.c:200
#10 0x00007ffff7d8b1eb in job_dispatch (item=0x66ffc0, p=<optimized
out>) at loop_job.c:39
#11 0x00007ffff7d89d37 in qb_loop_run_level (level=0x60ff30) at loop.c:45
#12 qb_loop_run (lp=<optimized out>) at loop.c:206
#13 0x0000000000403745 in main (argc=<optimized out>,
argv=0x7fffffffde48) at caped.c:171


a leak during startup on packet 82:
(gdb) where
#0  0x000000366b436285 in raise () from /lib64/libc.so.6
#1  0x000000366b437b9b in abort () from /lib64/libc.so.6
#2  0x000000366b42ee9e in __assert_fail_base () from /lib64/libc.so.6
#3  0x000000366b42ef42 in __assert_fail () from /lib64/libc.so.6
#4  0x00007ffff7b5684b in _libssh2_packet_add (session=0x62eea0,
data=0x6173a0 "\024\341l\241\236\003\\\277\340\256\357ÑŒ\364r\320\060",
datalen=769, macstate=0) at packet.c:429
#5  0x00007ffff7b6a96f in fullpacket (session=0x62eea0, encrypted=0) at
transport.c:236
#6  0x00007ffff7b6b1f3 in _libssh2_transport_read (session=0x62eea0) at
transport.c:556
#7  0x00007ffff7b57f4a in _libssh2_packet_require (session=0x62eea0,
packet_type=20 '\024', data=0x63bcb8, data_len=0x63bcc0, match_ofs=0,
match_buf=0x0, match_len=0, state=
    0x63bb60) at packet.c:1097
#8  0x00007ffff7b54167 in _libssh2_kex_exchange (session=0x62eea0,
reexchange=0, key_state=0x63bb58) at kex.c:1717
#9  0x00007ffff7b5ddf0 in session_startup (session=0x62eea0, sock=12) at
session.c:718
#10 0x00007ffff7b5e0ba in libssh2_session_handshake (session=0x62eea0,
sock=12) at session.c:796
#11 0x00007ffff7b5e112 in libssh2_session_startup (session=0x62eea0,
sock=12) at session.c:815
#12 0x000000000040600c in ssh_assembly_connect (data=0x629c60) at
trans_ssh.c:374
#13 0x00007ffff7d8b1eb in job_dispatch (item=0x6294c0, p=<optimized
out>) at loop_job.c:39
#14 0x00007ffff7d89d37 in qb_loop_run_level (level=0x60ff30) at loop.c:45
#15 qb_loop_run (lp=<optimized out>) at loop.c:206
#16 0x0000000000403745 in main (argc=<optimized out>,
argv=0x7fffffffde48) at caped.c:171


It appears something related to how I'm using EOF seems to be causing
the problem.  You mentioned in a different thread that call model I am
using may not work.  What would you suggest?

I'm not sure why there isn't a leak in the open path.  Maybe valgrind ha
the stack trace recorded incorrectly?  Or perhaps I am asserting on the
wrong iteration.  I'll play with it more and see if I can find more
information.

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

From libssh2-devel-bounces@cool.haxx.se  Sun Feb 26 20:27:20 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1QJREVR027226;
	Sun, 26 Feb 2012 20:27:19 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1QJRBWh027177
	for <libssh2-devel@cool.haxx.se>; Sun, 26 Feb 2012 20:27:12 +0100
Received: from int-mx10.intmail.prod.int.phx2.redhat.com
	(int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1QJR9Jh000442
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Sun, 26 Feb 2012 14:27:09 -0500
Received: from beast.broked.org (ovpn-112-33.phx2.redhat.com [10.3.112.33])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id q1QJR8hb007110; Sun, 26 Feb 2012 14:27:09 -0500
Message-ID: <4F4A8737.6080301@redhat.com>
Date: Sun, 26 Feb 2012 12:25:43 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120209 Thunderbird/10.0.1
MIME-Version: 1.0
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: memory leak in _libssh2_channel_open
References: <4F46FC86.2030805@redhat.com>
	<alpine.DEB.2.00.1202242259090.14133@tvnag.unkk.fr>
	<4F48197D.1060201@redhat.com>
	<alpine.DEB.2.00.1202250015510.22794@tvnag.unkk.fr>
	<4F481B28.7040409@redhat.com> <4F48FE8F.7060300@redhat.com>
	<alpine.DEB.2.00.1202252220530.13027@tvnag.unkk.fr>
	<4F4A8517.9050808@redhat.com>
In-Reply-To: <4F4A8517.9050808@redhat.com>
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
Cc: Daniel Stenberg <daniel@haxx.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from base64 to 8bit by giant.haxx.se id q1QJREVR027226

On 02/26/2012 12:16 PM, Steven Dake wrote:
> On 02/25/2012 02:25 PM, Daniel Stenberg wrote:
>> On Sat, 25 Feb 2012, Steven Dake wrote:
>>
>>> So it appears the packets are still present on the session list but
>>> somehow dropped by the open call and not removed.
>>>
>>> If you have other suggestions for getting to the root cause please let
>>> me know.  I am happy to help.
>>
>> My suspicion is that the call to _libssh2_list_add() within the
>> src/packet.c:_libssh2_packet_add() function is what adds the packet to
>> the incoming queue of packets, and some packets that arrive are never
>> yanked off that list.
>>
>> If you would add some debug code that would count the length of that
>> linked list and logged it occasionally we could see if that is true. The
>> list should really only grow temporarily and then go back to almost
>> nothing. If that turns out to be true, we then of course need to figure
>> out what packets that are lingering there and how to stop them from
>> doing it!
>>
>> (BTW, I'll be away on a week's vacation starting tomorrow so I might not
>> respond very quickly until I get back.)
>>
> 
> I have found two packets that seem to leak into the session packet list
> which are not removed
> 
> The packet id 3 (#define SSH_MSG_UNIMPLEMENTED) seems to leak 1 or 2 times.
> 
> Stack trace:
> #0  0x000000366b436285 in raise () from /lib64/libc.so.6
> #1  0x000000366b437b9b in abort () from /lib64/libc.so.6
> #2  0x000000366b42ee9e in __assert_fail_base () from /lib64/libc.so.6
> #3  0x000000366b42ef42 in __assert_fail () from /lib64/libc.so.6
> #4  0x00007ffff7b5684b in _libssh2_packet_add (session=0x62eea0,
> data=0x623500 "\024\250x\006\275 \336!\220\070\371#\375uÄŠ%",
> datalen=769, macstate=0) at packet.c:429
> #5  0x00007ffff7b6a96f in fullpacket (session=0x62eea0, encrypted=0) at
> transport.c:236
> #6  0x00007ffff7b6b1f3 in _libssh2_transport_read (session=0x62eea0) at
> transport.c:556
> #7  0x00007ffff7b57f4a in _libssh2_packet_require (session=0x62eea0,
> packet_type=20 '\024', data=0x63bcb8, data_len=0x63bcc0, match_ofs=0,
> match_buf=0x0, match_len=0, state=
>     0x63bb60) at packet.c:1097
> #8  0x00007ffff7b54167 in _libssh2_kex_exchange (session=0x62eea0,
> reexchange=0, key_state=0x63bb58) at kex.c:1717
> #9  0x00007ffff7b5ddf0 in session_startup (session=0x62eea0, sock=12) at
> session.c:718
> #10 0x00007ffff7b5e0ba in libssh2_session_handshake (session=0x62eea0,
> sock=12) at session.c:796
> #11 0x00007ffff7b5e112 in libssh2_session_startup (session=0x62eea0,
> sock=12) at session.c:815
> #12 0x000000000040600c in ssh_assembly_connect (data=0x629c60) at
> trans_ssh.c:374
> #13 0x00007ffff7d8b1eb in job_dispatch (item=0x6261b0, p=<optimized
> out>) at loop_job.c:39
> #14 0x00007ffff7d89d37 in qb_loop_run_level (level=0x60ff30) at loop.c:45
> #15 qb_loop_run (lp=<optimized out>) at loop.c:206
> #16 0x0000000000403745 in main (argc=<optimized out>,
> argv=0x7fffffffde48) at caped.c:171
> 
> 
> The packet id of 82 (#define SSH_MSG_REQUEST_FAILURE 82) leaks continuously.
> 
> Two stack traces:
> consistent leaks:
> #0  0x000000366b436285 in raise () from /lib64/libc.so.6
> #1  0x000000366b437b9b in abort () from /lib64/libc.so.6
> #2  0x000000366b42ee9e in __assert_fail_base () from /lib64/libc.so.6
> #3  0x000000366b42ef42 in __assert_fail () from /lib64/libc.so.6
> #4  0x00007ffff7b56864 in _libssh2_packet_add (session=0x655220,
> data=0x66e9b0 "`", datalen=5, macstate=0) at packet.c:430
> #5  0x00007ffff7b6a987 in fullpacket (session=0x655220, encrypted=1) at
> transport.c:236
> #6  0x00007ffff7b6b20b in _libssh2_transport_read (session=0x655220) at
> transport.c:556
> #7  0x00007ffff7b4d8c2 in channel_wait_eof (channel=0x670c80) at
> channel.c:2213
> #8  0x00007ffff7b4d948 in libssh2_channel_wait_eof (channel=0x670c80) at
> channel.c:2242
> #9  0x00000000004058ea in assembly_ssh_exec (data=0x670800) at
> trans_ssh.c:200
> #10 0x00007ffff7d8b1eb in job_dispatch (item=0x66ffc0, p=<optimized
> out>) at loop_job.c:39
> #11 0x00007ffff7d89d37 in qb_loop_run_level (level=0x60ff30) at loop.c:45
> #12 qb_loop_run (lp=<optimized out>) at loop.c:206
> #13 0x0000000000403745 in main (argc=<optimized out>,
> argv=0x7fffffffde48) at caped.c:171
> 
> 
> a leak during startup on packet 82:
> (gdb) where
> #0  0x000000366b436285 in raise () from /lib64/libc.so.6
> #1  0x000000366b437b9b in abort () from /lib64/libc.so.6
> #2  0x000000366b42ee9e in __assert_fail_base () from /lib64/libc.so.6
> #3  0x000000366b42ef42 in __assert_fail () from /lib64/libc.so.6
> #4  0x00007ffff7b5684b in _libssh2_packet_add (session=0x62eea0,
> data=0x6173a0 "\024\341l\241\236\003\\\277\340\256\357ÑŒ\364r\320\060",
> datalen=769, macstate=0) at packet.c:429
> #5  0x00007ffff7b6a96f in fullpacket (session=0x62eea0, encrypted=0) at
> transport.c:236
> #6  0x00007ffff7b6b1f3 in _libssh2_transport_read (session=0x62eea0) at
> transport.c:556
> #7  0x00007ffff7b57f4a in _libssh2_packet_require (session=0x62eea0,
> packet_type=20 '\024', data=0x63bcb8, data_len=0x63bcc0, match_ofs=0,
> match_buf=0x0, match_len=0, state=
>     0x63bb60) at packet.c:1097
> #8  0x00007ffff7b54167 in _libssh2_kex_exchange (session=0x62eea0,
> reexchange=0, key_state=0x63bb58) at kex.c:1717
> #9  0x00007ffff7b5ddf0 in session_startup (session=0x62eea0, sock=12) at
> session.c:718
> #10 0x00007ffff7b5e0ba in libssh2_session_handshake (session=0x62eea0,
> sock=12) at session.c:796
> #11 0x00007ffff7b5e112 in libssh2_session_startup (session=0x62eea0,
> sock=12) at session.c:815
> #12 0x000000000040600c in ssh_assembly_connect (data=0x629c60) at
> trans_ssh.c:374
> #13 0x00007ffff7d8b1eb in job_dispatch (item=0x6294c0, p=<optimized
> out>) at loop_job.c:39
> #14 0x00007ffff7d89d37 in qb_loop_run_level (level=0x60ff30) at loop.c:45
> #15 qb_loop_run (lp=<optimized out>) at loop.c:206
> #16 0x0000000000403745 in main (argc=<optimized out>,
> argv=0x7fffffffde48) at caped.c:171
> 
> 

here is the open leak

(gdb) where
#0  0x000000366b436285 in raise () from /lib64/libc.so.6
#1  0x000000366b437b9b in abort () from /lib64/libc.so.6
#2  0x000000366b42ee9e in __assert_fail_base () from /lib64/libc.so.6
#3  0x000000366b42ef42 in __assert_fail () from /lib64/libc.so.6
#4  0x00007ffff7b56866 in _libssh2_packet_add (session=0x62eea0,
data=0x66f6e0 "[", datalen=17, macstate=0) at packet.c:430
#5  0x00007ffff7b6a98b in fullpacket (session=0x62eea0, encrypted=1) at
transport.c:236
#6  0x00007ffff7b6b20f in _libssh2_transport_read (session=0x62eea0) at
transport.c:556
#7  0x00007ffff7b58288 in _libssh2_packet_requirev (session=0x62eea0,
packet_types=0x7ffff7b70e15 "[\\", data=0x63bf80, data_len=0x63bf88,
match_ofs=1, match_buf=0x62512c "",
    match_len=4, state=0x63bf60) at packet.c:1218
#8  0x00007ffff7b49aa9 in _libssh2_channel_open (session=0x62eea0,
channel_type=0x408603 "session", channel_type_len=7, window_size=262144,
packet_size=32768, message=0x0,
    message_len=0) at channel.c:230
#9  0x00007ffff7b49eec in libssh2_channel_open_ex (session=0x62eea0,
type=0x408603 "session", type_len=7, window_size=262144,
packet_size=32768, msg=0x0, msg_len=0)
    at channel.c:331
#10 0x0000000000405aa8 in assembly_ssh_exec (data=0x62a490) at
trans_ssh.c:145
#11 0x00007ffff7d8b1eb in job_dispatch (item=0x654ad0, p=<optimized
out>) at loop_job.c:39
#12 0x00007ffff7d89d37 in qb_loop_run_level (level=0x60ff30) at loop.c:45
#13 qb_loop_run (lp=<optimized out>) at loop.c:206
#14 0x0000000000403745 in main (argc=<optimized out>,
argv=0x7fffffffde48) at caped.c:171


> It appears something related to how I'm using EOF seems to be causing
> the problem.  You mentioned in a different thread that call model I am
> using may not work.  What would you suggest?
> 
> I'm not sure why there isn't a leak in the open path.  Maybe valgrind ha
> the stack trace recorded incorrectly?  Or perhaps I am asserting on the
> wrong iteration.  I'll play with it more and see if I can find more
> information.
> 
> Regards
> -steve
> _______________________________________________
> libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel

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

From libssh2-devel-bounces@cool.haxx.se  Tue Feb 28 05:19:15 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1S4J8eq019826;
	Tue, 28 Feb 2012 05:19:14 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1S4J3Ak019739
	for <libssh2-devel@cool.haxx.se>; Tue, 28 Feb 2012 05:19:04 +0100
Received: from int-mx10.intmail.prod.int.phx2.redhat.com
	(int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1S4J2ew002790
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 27 Feb 2012 23:19:02 -0500
Received: from beast.broked.org ([10.3.112.11])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id q1S4J0rv010098; Mon, 27 Feb 2012 23:19:01 -0500
Message-ID: <4F4C5559.1010702@redhat.com>
Date: Mon, 27 Feb 2012 21:17:29 -0700
From: Steven Dake <sdake@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:10.0.1) Gecko/20120216 Thunderbird/10.0.1
MIME-Version: 1.0
To: libssh2 development <libssh2-devel@cool.haxx.se>
Subject: Re: memory leak in _libssh2_channel_open
References: <4F46FC86.2030805@redhat.com>
	<alpine.DEB.2.00.1202242259090.14133@tvnag.unkk.fr>
	<4F48197D.1060201@redhat.com>
	<alpine.DEB.2.00.1202250015510.22794@tvnag.unkk.fr>
	<4F481B28.7040409@redhat.com> <4F48FE8F.7060300@redhat.com>
	<alpine.DEB.2.00.1202252220530.13027@tvnag.unkk.fr>
	<4F4A8517.9050808@redhat.com> <4F4A8737.6080301@redhat.com>
In-Reply-To: <4F4A8737.6080301@redhat.com>
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
Cc: Daniel Stenberg <daniel@haxx.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from base64 to 8bit by giant.haxx.se id q1S4J8eq019826

On 02/26/2012 12:25 PM, Steven Dake wrote:
> On 02/26/2012 12:16 PM, Steven Dake wrote:
>> On 02/25/2012 02:25 PM, Daniel Stenberg wrote:
>>> On Sat, 25 Feb 2012, Steven Dake wrote:
>>>
>>>> So it appears the packets are still present on the session list but
>>>> somehow dropped by the open call and not removed.
>>>>
>>>> If you have other suggestions for getting to the root cause please let
>>>> me know.  I am happy to help.
>>>
>>> My suspicion is that the call to _libssh2_list_add() within the
>>> src/packet.c:_libssh2_packet_add() function is what adds the packet to
>>> the incoming queue of packets, and some packets that arrive are never
>>> yanked off that list.
>>>
>>> If you would add some debug code that would count the length of that
>>> linked list and logged it occasionally we could see if that is true. The
>>> list should really only grow temporarily and then go back to almost
>>> nothing. If that turns out to be true, we then of course need to figure
>>> out what packets that are lingering there and how to stop them from
>>> doing it!
>>>
>>> (BTW, I'll be away on a week's vacation starting tomorrow so I might not
>>> respond very quickly until I get back.)
>>>
>>
>> I have found two packets that seem to leak into the session packet list
>> which are not removed
>>
>> The packet id 3 (#define SSH_MSG_UNIMPLEMENTED) seems to leak 1 or 2 times.
>>
>> Stack trace:
>> #0  0x000000366b436285 in raise () from /lib64/libc.so.6
>> #1  0x000000366b437b9b in abort () from /lib64/libc.so.6
>> #2  0x000000366b42ee9e in __assert_fail_base () from /lib64/libc.so.6
>> #3  0x000000366b42ef42 in __assert_fail () from /lib64/libc.so.6
>> #4  0x00007ffff7b5684b in _libssh2_packet_add (session=0x62eea0,
>> data=0x623500 "\024\250x\006\275 \336!\220\070\371#\375uÄŠ%",
>> datalen=769, macstate=0) at packet.c:429
>> #5  0x00007ffff7b6a96f in fullpacket (session=0x62eea0, encrypted=0) at
>> transport.c:236
>> #6  0x00007ffff7b6b1f3 in _libssh2_transport_read (session=0x62eea0) at
>> transport.c:556
>> #7  0x00007ffff7b57f4a in _libssh2_packet_require (session=0x62eea0,
>> packet_type=20 '\024', data=0x63bcb8, data_len=0x63bcc0, match_ofs=0,
>> match_buf=0x0, match_len=0, state=
>>     0x63bb60) at packet.c:1097
>> #8  0x00007ffff7b54167 in _libssh2_kex_exchange (session=0x62eea0,
>> reexchange=0, key_state=0x63bb58) at kex.c:1717
>> #9  0x00007ffff7b5ddf0 in session_startup (session=0x62eea0, sock=12) at
>> session.c:718
>> #10 0x00007ffff7b5e0ba in libssh2_session_handshake (session=0x62eea0,
>> sock=12) at session.c:796
>> #11 0x00007ffff7b5e112 in libssh2_session_startup (session=0x62eea0,
>> sock=12) at session.c:815
>> #12 0x000000000040600c in ssh_assembly_connect (data=0x629c60) at
>> trans_ssh.c:374
>> #13 0x00007ffff7d8b1eb in job_dispatch (item=0x6261b0, p=<optimized
>> out>) at loop_job.c:39
>> #14 0x00007ffff7d89d37 in qb_loop_run_level (level=0x60ff30) at loop.c:45
>> #15 qb_loop_run (lp=<optimized out>) at loop.c:206
>> #16 0x0000000000403745 in main (argc=<optimized out>,
>> argv=0x7fffffffde48) at caped.c:171
>>
>>
>> The packet id of 82 (#define SSH_MSG_REQUEST_FAILURE 82) leaks continuously.
>>
>> Two stack traces:
>> consistent leaks:
>> #0  0x000000366b436285 in raise () from /lib64/libc.so.6
>> #1  0x000000366b437b9b in abort () from /lib64/libc.so.6
>> #2  0x000000366b42ee9e in __assert_fail_base () from /lib64/libc.so.6
>> #3  0x000000366b42ef42 in __assert_fail () from /lib64/libc.so.6
>> #4  0x00007ffff7b56864 in _libssh2_packet_add (session=0x655220,
>> data=0x66e9b0 "`", datalen=5, macstate=0) at packet.c:430
>> #5  0x00007ffff7b6a987 in fullpacket (session=0x655220, encrypted=1) at
>> transport.c:236
>> #6  0x00007ffff7b6b20b in _libssh2_transport_read (session=0x655220) at
>> transport.c:556
>> #7  0x00007ffff7b4d8c2 in channel_wait_eof (channel=0x670c80) at
>> channel.c:2213
>> #8  0x00007ffff7b4d948 in libssh2_channel_wait_eof (channel=0x670c80) at
>> channel.c:2242
>> #9  0x00000000004058ea in assembly_ssh_exec (data=0x670800) at
>> trans_ssh.c:200
>> #10 0x00007ffff7d8b1eb in job_dispatch (item=0x66ffc0, p=<optimized
>> out>) at loop_job.c:39
>> #11 0x00007ffff7d89d37 in qb_loop_run_level (level=0x60ff30) at loop.c:45
>> #12 qb_loop_run (lp=<optimized out>) at loop.c:206
>> #13 0x0000000000403745 in main (argc=<optimized out>,
>> argv=0x7fffffffde48) at caped.c:171
>>
>>
>> a leak during startup on packet 82:
>> (gdb) where
>> #0  0x000000366b436285 in raise () from /lib64/libc.so.6
>> #1  0x000000366b437b9b in abort () from /lib64/libc.so.6
>> #2  0x000000366b42ee9e in __assert_fail_base () from /lib64/libc.so.6
>> #3  0x000000366b42ef42 in __assert_fail () from /lib64/libc.so.6
>> #4  0x00007ffff7b5684b in _libssh2_packet_add (session=0x62eea0,
>> data=0x6173a0 "\024\341l\241\236\003\\\277\340\256\357ÑŒ\364r\320\060",
>> datalen=769, macstate=0) at packet.c:429
>> #5  0x00007ffff7b6a96f in fullpacket (session=0x62eea0, encrypted=0) at
>> transport.c:236
>> #6  0x00007ffff7b6b1f3 in _libssh2_transport_read (session=0x62eea0) at
>> transport.c:556
>> #7  0x00007ffff7b57f4a in _libssh2_packet_require (session=0x62eea0,
>> packet_type=20 '\024', data=0x63bcb8, data_len=0x63bcc0, match_ofs=0,
>> match_buf=0x0, match_len=0, state=
>>     0x63bb60) at packet.c:1097
>> #8  0x00007ffff7b54167 in _libssh2_kex_exchange (session=0x62eea0,
>> reexchange=0, key_state=0x63bb58) at kex.c:1717
>> #9  0x00007ffff7b5ddf0 in session_startup (session=0x62eea0, sock=12) at
>> session.c:718
>> #10 0x00007ffff7b5e0ba in libssh2_session_handshake (session=0x62eea0,
>> sock=12) at session.c:796
>> #11 0x00007ffff7b5e112 in libssh2_session_startup (session=0x62eea0,
>> sock=12) at session.c:815
>> #12 0x000000000040600c in ssh_assembly_connect (data=0x629c60) at
>> trans_ssh.c:374
>> #13 0x00007ffff7d8b1eb in job_dispatch (item=0x6294c0, p=<optimized
>> out>) at loop_job.c:39
>> #14 0x00007ffff7d89d37 in qb_loop_run_level (level=0x60ff30) at loop.c:45
>> #15 qb_loop_run (lp=<optimized out>) at loop.c:206
>> #16 0x0000000000403745 in main (argc=<optimized out>,
>> argv=0x7fffffffde48) at caped.c:171
>>
>>
> 
> here is the open leak
> 
> (gdb) where
> #0  0x000000366b436285 in raise () from /lib64/libc.so.6
> #1  0x000000366b437b9b in abort () from /lib64/libc.so.6
> #2  0x000000366b42ee9e in __assert_fail_base () from /lib64/libc.so.6
> #3  0x000000366b42ef42 in __assert_fail () from /lib64/libc.so.6
> #4  0x00007ffff7b56866 in _libssh2_packet_add (session=0x62eea0,
> data=0x66f6e0 "[", datalen=17, macstate=0) at packet.c:430
> #5  0x00007ffff7b6a98b in fullpacket (session=0x62eea0, encrypted=1) at
> transport.c:236
> #6  0x00007ffff7b6b20f in _libssh2_transport_read (session=0x62eea0) at
> transport.c:556
> #7  0x00007ffff7b58288 in _libssh2_packet_requirev (session=0x62eea0,
> packet_types=0x7ffff7b70e15 "[\\", data=0x63bf80, data_len=0x63bf88,
> match_ofs=1, match_buf=0x62512c "",
>     match_len=4, state=0x63bf60) at packet.c:1218
> #8  0x00007ffff7b49aa9 in _libssh2_channel_open (session=0x62eea0,
> channel_type=0x408603 "session", channel_type_len=7, window_size=262144,
> packet_size=32768, message=0x0,
>     message_len=0) at channel.c:230
> #9  0x00007ffff7b49eec in libssh2_channel_open_ex (session=0x62eea0,
> type=0x408603 "session", type_len=7, window_size=262144,
> packet_size=32768, msg=0x0, msg_len=0)
>     at channel.c:331
> #10 0x0000000000405aa8 in assembly_ssh_exec (data=0x62a490) at
> trans_ssh.c:145
> #11 0x00007ffff7d8b1eb in job_dispatch (item=0x654ad0, p=<optimized
> out>) at loop_job.c:39
> #12 0x00007ffff7d89d37 in qb_loop_run_level (level=0x60ff30) at loop.c:45
> #13 qb_loop_run (lp=<optimized out>) at loop.c:206
> #14 0x0000000000403745 in main (argc=<optimized out>,
> argv=0x7fffffffde48) at caped.c:171
> 
> 
>> It appears something related to how I'm using EOF seems to be causing
>> the problem.  You mentioned in a different thread that call model I am
>> using may not work.  What would you suggest?
>>
>> I'm not sure why there isn't a leak in the open path.  Maybe valgrind ha
>> the stack trace recorded incorrectly?  Or perhaps I am asserting on the
>> wrong iteration.  I'll play with it more and see if I can find more
>> information.
>>
>> Regards
>> -steve

Hi,

I have found with my tracing patch I previously posted that the cause of
the problem of the heavy leak was related to using the following api:

libssh2_keepalive_config

If the code passes 1 in the want_reply parameter, the ssh server (fedora
16 opensshd) responds with a REQUEST_FAILURE (82) for every
keepalive_send the code calls.  I am not sure where the error is there,
but I'd expect a REQUEST_FAILURE would result in no packet allocation in
packet add.  I haven't provided a patch as I'm not sure exactly what the
solution should be.

Regards
-steve

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

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

From libssh2-devel-bounces@cool.haxx.se  Tue Feb 28 05:52:03 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1S49IbO007276;
	Tue, 28 Feb 2012 05:09:40 +0100
Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1S499bS007196
	for <libssh2-devel@cool.haxx.se>; Tue, 28 Feb 2012 05:09:10 +0100
Received: from int-mx11.intmail.prod.int.phx2.redhat.com
	(int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24])
	by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1S40Jls004998
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)
	for <libssh2-devel@cool.haxx.se>; Mon, 27 Feb 2012 23:00:37 -0500
Received: from beast.broked.org.com ([10.3.112.11])
	by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id q1S40GN7030927; Mon, 27 Feb 2012 23:00:19 -0500
From: Steven Dake <sdake@redhat.com>
To: libssh2-devel@cool.haxx.se
Subject: [PATCH] Follow RFC4253 section 11.4
Date: Mon, 27 Feb 2012 20:58:43 -0700
Message-Id: <1330401523-8188-1-git-send-email-sdake@redhat.com>
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24
Cc: Steven Dake <sdake@redhat.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

11.4.  Reserved Messages

   An implementation MUST respond to all unrecognized messages with an
   SSH_MSG_UNIMPLEMENTED message in the order in which the messages were
   received.  Such messages MUST be otherwise ignored.  Later protocol
   versions may define other meanings for these message types.

      byte      SSH_MSG_UNIMPLEMENTED
      uint32    packet sequence number of rejected message

Signed-off-by: Steven Dake <sdake@redhat.com>
---
 src/packet.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/src/packet.c b/src/packet.c
index 5852d0c..882940c 100644
--- a/src/packet.c
+++ b/src/packet.c
@@ -522,6 +522,11 @@ _libssh2_packet_add(LIBSSH2_SESSION * session, unsigned char *data,
             session->packAdd_state = libssh2_NB_state_idle;
             return 0;
 
+        case SSH_MSG_UNIMPLEMENTED:
+            LIBSSH2_FREE(session, data);
+            session->packAdd_state = libssh2_NB_state_idle;
+            return 0;
+
             /*
               byte      SSH_MSG_DEBUG
               boolean   always_display
-- 
1.7.7.6

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

From libssh2-devel-bounces@cool.haxx.se  Tue Feb 28 17:06:07 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1SALuEb015454;
	Tue, 28 Feb 2012 11:22:08 +0100
Received: from vps1.henriknordstrom.net (vps1.henriknordstrom.net
	[IPv6:2a02:750:7::d0a])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1SALnEX015396
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Tue, 28 Feb 2012 11:21:49 +0100
Received: from home.hno.se (home.hno.se [IPv6:2001:470:df90::1])
	(authenticated bits=128)
	by vps1.henriknordstrom.net (8.14.2/8.14.2/Debian-2build1) with ESMTP
	id q1SALldP003639; Tue, 28 Feb 2012 10:21:49 GMT
Received: from [127.0.0.1] (localhost.localdomain [127.0.0.1])
	by home.hno.se (8.14.5/8.14.5) with ESMTP id q1SALkUk008772;
	Tue, 28 Feb 2012 11:21:46 +0100
Message-ID: <1330424506.1025.13.camel@home.hno.se>
Subject: Re: [PATCH] Follow RFC4253 section 11.4
From: Henrik =?ISO-8859-1?Q?Nordstr=F6m?= <henrik@henriknordstrom.net>
To: libssh2 development <libssh2-devel@cool.haxx.se>
Date: Tue, 28 Feb 2012 11:21:46 +0100
In-Reply-To: <1330401523-8188-1-git-send-email-sdake@redhat.com>
References: <1330401523-8188-1-git-send-email-sdake@redhat.com>
X-Mailer: Evolution 3.2.3 (3.2.3-1.fc16) 
Mime-Version: 1.0
X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00
	autolearn=ham version=3.3.2
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on home.hno.se
X-Greylist: Sender succeeded SMTP AUTH authentication, not delayed by
	milter-greylist-3.0 (vps1.henriknordstrom.net
	[IPv6:2a02:750:7::d0a]); Tue, 28 Feb 2012 10:21:49 +0000 (UTC)
Cc: Steven Dake <sdake@redhat.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from base64 to 8bit by giant.haxx.se id q1SALuEb015454

mÃ¥n 2012-02-27 klockan 20:58 -0700 skrev Steven Dake:
> 11.4.  Reserved Messages
> 
>    An implementation MUST respond to all unrecognized messages with an
>    SSH_MSG_UNIMPLEMENTED message in the order in which the messages were
>    received.  Such messages MUST be otherwise ignored.  Later protocol
>    versions may define other meanings for these message types.
> 
>       byte      SSH_MSG_UNIMPLEMENTED
>       uint32    packet sequence number of rejected message
> 
>  
> +        case SSH_MSG_UNIMPLEMENTED:
> +            LIBSSH2_FREE(session, data);
> +            session->packAdd_state = libssh2_NB_state_idle;
> +            return 0;
> +

Err.. it's an error and needs to be dealt with. If not then the
application will not know that the request failed.

Regards
Henrik

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

From libssh2-devel-bounces@cool.haxx.se  Tue Feb 28 17:08:41 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1SA9WNN007526;
	Tue, 28 Feb 2012 11:09:56 +0100
Received: from vps1.henriknordstrom.net (vps1.henriknordstrom.net
	[IPv6:2a02:750:7::d0a])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1SA9TH8007501
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Tue, 28 Feb 2012 11:09:29 +0100
Received: from home.hno.se (home.hno.se [IPv6:2001:470:df90::1])
	(authenticated bits=128)
	by vps1.henriknordstrom.net (8.14.2/8.14.2/Debian-2build1) with ESMTP
	id q1SA9RL2022332
	for <libssh2-devel@cool.haxx.se>; Tue, 28 Feb 2012 10:09:29 GMT
Received: from [127.0.0.1] (localhost.localdomain [127.0.0.1])
	by home.hno.se (8.14.5/8.14.5) with ESMTP id q1SA9Qbo007533
	for <libssh2-devel@cool.haxx.se>; Tue, 28 Feb 2012 11:09:26 +0100
Message-ID: <1330423766.1025.10.camel@home.hno.se>
Subject: Re: memory leak in _libssh2_channel_open
From: Henrik =?ISO-8859-1?Q?Nordstr=F6m?= <henrik@henriknordstrom.net>
To: libssh2-devel@cool.haxx.se
Date: Tue, 28 Feb 2012 11:09:26 +0100
In-Reply-To: <4F4C5559.1010702@redhat.com>
References: <4F46FC86.2030805@redhat.com>
	<alpine.DEB.2.00.1202242259090.14133@tvnag.unkk.fr>
	<4F48197D.1060201@redhat.com>
	<alpine.DEB.2.00.1202250015510.22794@tvnag.unkk.fr>
	<4F481B28.7040409@redhat.com> <4F48FE8F.7060300@redhat.com>
	<alpine.DEB.2.00.1202252220530.13027@tvnag.unkk.fr>
	<4F4A8517.9050808@redhat.com> <4F4A8737.6080301@redhat.com>
	<4F4C5559.1010702@redhat.com>
X-Mailer: Evolution 3.2.3 (3.2.3-1.fc16) 
Mime-Version: 1.0
X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00
	autolearn=ham version=3.3.2
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on home.hno.se
X-Greylist: Sender succeeded SMTP AUTH authentication, not delayed by
	milter-greylist-3.0 (vps1.henriknordstrom.net
	[IPv6:2a02:750:7::d0a]); Tue, 28 Feb 2012 10:09:29 +0000 (UTC)
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se
Content-Transfer-Encoding: 8bit
X-MIME-Autoconverted: from base64 to 8bit by giant.haxx.se id q1SA9WNN007526

mÃ¥n 2012-02-27 klockan 21:17 -0700 skrev Steven Dake:

> I have found with my tracing patch I previously posted that the cause of
> the problem of the heavy leak was related to using the following api:
> 
> libssh2_keepalive_config

Gah, keepalive again..

> If the code passes 1 in the want_reply parameter, the ssh server (fedora
> 16 opensshd) responds with a REQUEST_FAILURE (82) for every
> keepalive_send the code calls.  I am not sure where the error is there,

It's the expected response. keep-alive is done using an unhandled
MSG_GLOBAL_REQUEST message.

> but I'd expect a REQUEST_FAILURE would result in no packet allocation in
> packet add.  I haven't provided a patch as I'm not sure exactly what the
> solution should be.

Errors also need processing, but no one is eating the keepalive error
response.

Regards
Henrik

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

From libssh2-devel-bounces@cool.haxx.se  Wed Feb 29 08:04:37 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1T74C9K026954;
	Wed, 29 Feb 2012 08:04:34 +0100
Received: from mail-iy0-f182.google.com (mail-iy0-f182.google.com
	[209.85.210.182])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1T7492h026835
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Wed, 29 Feb 2012 08:04:10 +0100
Received: by iahk25 with SMTP id k25so1677922iah.41
	for <libssh2-devel@cool.haxx.se>; Tue, 28 Feb 2012 23:04:04 -0800 (PST)
Received-SPF: pass (google.com: domain of xmitchx@gmail.com designates
	10.50.182.197 as permitted sender) client-ip=10.50.182.197; 
Authentication-Results: mr.google.com;
	spf=pass (google.com: domain of xmitchx@gmail.com
	designates 10.50.182.197 as permitted sender)
	smtp.mail=xmitchx@gmail.com;
	dkim=pass header.i=xmitchx@gmail.com
Received: from mr.google.com ([10.50.182.197])
	by 10.50.182.197 with SMTP id eg5mr5759267igc.36.1330499044328
	(num_hops = 1); Tue, 28 Feb 2012 23:04:04 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:from:date:x-google-sender-auth:message-id
	:subject:to:content-type;
	bh=SsrqaiNuHfvjq4VVDLecLFDs88RFUODI14qt0/HBFsY=;
	b=E7f+sPMqd9f6BFTVelXSMfaSUxKRaPIgvCi7eY10bVUHHfotg4esJhMIddSVScOv1k
	RerMbXnSwKckTNf0A6/UjIJIsN8xFjjNLLFdy7VmXrVztldArOsyCu8vRkEerOFQ7zrm
	Kt8xv/oXpoVXQuS5tJEHKKnEjss3V4OXRg5M4=
Received: by 10.50.182.197 with SMTP id eg5mr4781292igc.36.1330499044275; Tue,
	28 Feb 2012 23:04:04 -0800 (PST)
MIME-Version: 1.0
Received: by 10.42.96.6 with HTTP; Tue, 28 Feb 2012 23:03:44 -0800 (PST)
From: Mitchell Hashimoto <mitchell.hashimoto@gmail.com>
Date: Tue, 28 Feb 2012 23:03:44 -0800
X-Google-Sender-Auth: XRg8DC2ziBRw7NuCKlBaiRwbcpU
Message-ID: <CACOXMX4S1TL+mu3begwh0733TyrukV8Dw=DOv27Z_Zy332u1OA@mail.gmail.com>
Subject: Callback for channel data ready
To: libssh2-devel@cool.haxx.se
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1228835291=="
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

--===============1228835291==
Content-Type: multipart/alternative; boundary=14dae9340ac9e8773404ba14f2cf

--14dae9340ac9e8773404ba14f2cf
Content-Type: text/plain; charset=ISO-8859-1

Hi,

I've just started using libssh2 and so far the API and documentation has
been fantastic, so thank you very much for that.

I have a simple question: If I have multiple channels on top of a session
that sent out an `exec`, how do I know when data is ready on each of them?
I can use select() on my socket, which tells me when data is ready to be
read in general, but how do I know which channel to read on?

Of course I could iterate through each channel and do a channel_read() but
I was hoping perhaps there was a better way?

Thanks!
Mitchell

--14dae9340ac9e8773404ba14f2cf
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hi,<div><br></div><div>I&#39;ve just started using libssh2 and so far the A=
PI and documentation has been fantastic, so thank you very much for that.</=
div><div><br></div><div>I have a simple question: If I have multiple channe=
ls on top of a session that sent out an `exec`, how do I know when data is =
ready on each of them? I can use select() on my socket, which tells me when=
 data is ready to be read in general, but how do I know which channel to re=
ad on?</div>

<div><br></div><div>Of course I could iterate through each channel and do a=
 channel_read() but I was hoping perhaps there was a better way?</div><div>=
<br></div><div>Thanks!</div><div>Mitchell</div>

--14dae9340ac9e8773404ba14f2cf--

--===============1228835291==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--===============1228835291==--

From libssh2-devel-bounces@cool.haxx.se  Wed Feb 29 09:08:19 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1T882WQ012928;
	Wed, 29 Feb 2012 09:08:17 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q1T8819V012798
	for <libssh2-devel@cool.haxx.se>; Wed, 29 Feb 2012 09:08:01 +0100
Received: (qmail 13737 invoked by uid 501); 29 Feb 2012 08:08:00 -0000
Message-ID: <20120229080800.13736.qmail@stuge.se>
Date: Wed, 29 Feb 2012 09:08:00 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: Callback for channel data ready
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <CACOXMX4S1TL+mu3begwh0733TyrukV8Dw=DOv27Z_Zy332u1OA@mail.gmail.com>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <CACOXMX4S1TL+mu3begwh0733TyrukV8Dw=DOv27Z_Zy332u1OA@mail.gmail.com>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Mitchell Hashimoto wrote:
> I could iterate through each channel and do a channel_read()

Indeed. See example/direct_tcpip.c or example/tcpip-forward.c.


> but I was hoping perhaps there was a better way?

Sorry not at this time. I think we want callbacks though, so feel
free to discuss and send patches. :)


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

From libssh2-devel-bounces@cool.haxx.se  Wed Feb 29 09:17:24 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1T8HJPg018716;
	Wed, 29 Feb 2012 09:17:23 +0100
Received: from vps1.henriknordstrom.net (vps1.henriknordstrom.net
	[IPv6:2a02:750:7::d0a])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1T8HHnn018706
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Wed, 29 Feb 2012 09:17:17 +0100
Received: from home.hno.se (home.hno.se [IPv6:2001:470:df90::1])
	(authenticated bits=128)
	by vps1.henriknordstrom.net (8.14.2/8.14.2/Debian-2build1) with ESMTP
	id q1T8HGaG011985
	for <libssh2-devel@cool.haxx.se>; Wed, 29 Feb 2012 08:17:18 GMT
Received: from [127.0.0.1] (localhost.localdomain [127.0.0.1])
	by home.hno.se (8.14.5/8.14.5) with ESMTP id q1T8HFUM011288
	for <libssh2-devel@cool.haxx.se>; Wed, 29 Feb 2012 09:17:15 +0100
Message-ID: <1330503435.9655.2.camel@home.hno.se>
Subject: Re: Callback for channel data ready
From: Henrik =?ISO-8859-1?Q?Nordstr=F6m?= <henrik@henriknordstrom.net>
To: libssh2 development <libssh2-devel@cool.haxx.se>
Date: Wed, 29 Feb 2012 09:17:15 +0100
In-Reply-To: <CACOXMX4S1TL+mu3begwh0733TyrukV8Dw=DOv27Z_Zy332u1OA@mail.gmail.com>
References: <CACOXMX4S1TL+mu3begwh0733TyrukV8Dw=DOv27Z_Zy332u1OA@mail.gmail.com>
X-Mailer: Evolution 3.2.3 (3.2.3-1.fc16) 
Mime-Version: 1.0
X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00
	autolearn=ham version=3.3.2
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on home.hno.se
X-Greylist: Sender succeeded SMTP AUTH authentication, not delayed by
	milter-greylist-3.0 (vps1.henriknordstrom.net
	[IPv6:2a02:750:7::d0a]); Wed, 29 Feb 2012 08:17:18 +0000 (UTC)
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

tis 2012-02-28 klockan 23:03 -0800 skrev Mitchell Hashimoto:

> Of course I could iterate through each channel and do a channel_read()
> but I was hoping perhaps there was a better way?

Current API requires iterating over them with libssh2_channel_read.

Regards
Henrik


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

From libssh2-devel-bounces@cool.haxx.se  Wed Feb 29 16:30:02 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1TFTZu5016666;
	Wed, 29 Feb 2012 16:29:57 +0100
Received: from nic.appgate.com (nic.appgate.com [79.138.127.130])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1TFTYiG016656
	for <libssh2-devel@cool.haxx.se>; Wed, 29 Feb 2012 16:29:34 +0100
Received: from krakatau.got.appgate.com (krakatau.got.appgate.com
	[172.23.2.32]) by nic.appgate.com (Postfix) with ESMTP id 42A451F2A47
	for <libssh2-devel@cool.haxx.se>; Wed, 29 Feb 2012 16:29:34 +0100 (MET)
Received: from localhost (it.got.cryptzone.com [172.24.4.4])
	by krakatau.got.appgate.com (Postfix) with ESMTP id 682BFBD4083
	for <libssh2-devel@cool.haxx.se>; Wed, 29 Feb 2012 16:29:34 +0100 (CET)
Received: from 172.24.4.2 (SquirrelMail authenticated user tom)
	by localhost with HTTP; Wed, 29 Feb 2012 16:29:34 +0100
Message-ID: <35797bd9fe8d03ceffb25140ea07b73e.squirrel@localhost>
Date: Wed, 29 Feb 2012 16:29:34 +0100
Subject: Build fails on OpenSolaris
From: "Tom Weber" <tom.weber@cryptzone.com>
To: libssh2-devel@cool.haxx.se
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
X-Priority: 3 (Normal)
Importance: Normal
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Hi!

The build of 1.4.0 fails in example/x11.c on OpenSolaris snv_89, since that
platform lacks cfmakeraw(). I only need the library so I don't need a working
x11 example, I just want the example to not be compiled, either through an
automatic check or a configure option such as --disable-examples. Right now
I'm patching the Makefile but a more sustainable solution would be nicer.

This is my configure output:

$ ./configure --with-openssl --with-libz
checking whether to enable maintainer-specific portions of Makefiles... no
checking for sed... /usr/bin/sed
checking for a BSD-compatible install... /usr/bin/ginstall -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking libssh2 version... 1.4.0
checking build system type... i386-pc-solaris2.11
checking host system type... i386-pc-solaris2.11
configure: autobuild project... libssh2
configure: autobuild revision... 1.4.0
configure: autobuild hostname...
configure: autobuild timestamp... 20120229-161414
checking for style of include used by make... GNU
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking dependency style of gcc... gcc3
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /usr/pd/bin/grep
checking for egrep... /usr/pd/bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for long long... yes
checking if _REENTRANT is already defined... no
checking if _REENTRANT is actually needed... yes
checking if _REENTRANT is onwards defined... yes
checking for library containing socket... -lsocket
checking for library containing inet_addr... -lnsl
checking for gcc... (cached) gcc
checking whether we are using the GNU C compiler... (cached) yes
checking whether gcc accepts -g... (cached) yes
checking for gcc option to accept ISO C89... (cached) none needed
checking dependency style of gcc... (cached) gcc3
checking whether ln -s works... yes
checking whether make sets $(MAKE)... (cached) yes
checking for sshd... no
checking for a sed that does not truncate output... (cached) /usr/bin/sed
checking for fgrep... /usr/pd/bin/grep -F
checking for ld used by gcc... /usr/ccs/bin/ld
checking if the linker (/usr/ccs/bin/ld) is GNU ld... no
checking for BSD- or MS-compatible name lister (nm)... /usr/pd/opt/gcc3/bin/nm -B
checking the name lister (/usr/pd/opt/gcc3/bin/nm -B) interface... BSD nm
checking the maximum length of command line arguments... 786240
checking whether the shell understands some XSI constructs... yes
checking whether the shell understands "+="... yes
checking for /usr/ccs/bin/ld option to reload object files... -r
checking for objdump... objdump
checking how to recognize dependent libraries... pass_all
checking for ar... ar
checking for strip... strip
checking for ranlib... ranlib
checking command to parse /usr/pd/opt/gcc3/bin/nm -B output from gcc object... ok
checking for dlfcn.h... yes
checking for objdir... .libs
checking if gcc supports -fno-rtti -fno-exceptions... no
checking for gcc option to produce PIC... -fPIC -DPIC
checking if gcc PIC flag -fPIC -DPIC works... yes
checking if gcc static flag -static works... no
checking if gcc supports -c -o file.o... yes
checking if gcc supports -c -o file.o... (cached) yes
checking whether the gcc linker (/usr/ccs/bin/ld) supports shared libraries...
yes
checking whether -lc should be explicitly linked in... yes
checking dynamic linker characteristics... solaris2.11 ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... yes
checking whether byte ordering is bigendian... no
checking for special C compiler options needed for large files... no
checking for _FILE_OFFSET_BITS value needed for large files... 64
checking for ld used by GCC... /usr/ccs/bin/ld
checking if the linker (/usr/ccs/bin/ld) is GNU ld... no
checking for shared library run path origin... done
checking for libssl... yes
checking how to link with libssl... -lssl -lcrypto
checking for EVP_aes_128_ctr... no
checking for libz... yes
checking how to link with libz... -lz
checking whether to enable pedantic and debug compiler options... no
checking whether to enable hidden symbols in the library... no
checking errno.h usability... yes
checking errno.h presence... yes
checking for errno.h... yes
checking fcntl.h usability... yes
checking fcntl.h presence... yes
checking for fcntl.h... yes
checking stdio.h usability... yes
checking stdio.h presence... yes
checking for stdio.h... yes
checking for stdlib.h... (cached) yes
checking for unistd.h... (cached) yes
checking sys/uio.h usability... yes
checking sys/uio.h presence... yes
checking for sys/uio.h... yes
checking sys/select.h usability... yes
checking sys/select.h presence... yes
checking for sys/select.h... yes
checking sys/socket.h usability... yes
checking sys/socket.h presence... yes
checking for sys/socket.h... yes
checking sys/ioctl.h usability... yes
checking sys/ioctl.h presence... yes
checking for sys/ioctl.h... yes
checking sys/time.h usability... yes
checking sys/time.h presence... yes
checking for sys/time.h... yes
checking arpa/inet.h usability... yes
checking arpa/inet.h presence... yes
checking for arpa/inet.h... yes
checking netinet/in.h usability... yes
checking netinet/in.h presence... yes
checking for netinet/in.h... yes
checking sys/un.h usability... yes
checking sys/un.h presence... yes
checking for sys/un.h... yes
checking windows.h usability... no
checking windows.h presence... no
checking for windows.h... no
checking winsock2.h usability... no
checking winsock2.h presence... no
checking for winsock2.h... no
checking ws2tcpip.h usability... no
checking ws2tcpip.h presence... no
checking for ws2tcpip.h... no
checking for poll... yes
checking for gettimeofday... yes
checking for select... yes
checking for strtoll... yes
checking for size_t... yes
checking for working alloca.h... yes
checking for alloca... yes
checking for an ANSI C-conforming const... yes
checking for inline... inline
checking non-blocking sockets style... O_NONBLOCK
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating tests/Makefile
config.status: creating example/Makefile
config.status: creating docs/Makefile
config.status: creating libssh2.pc
config.status: creating src/libssh2_config.h
config.status: creating example/libssh2_config.h
config.status: executing depfiles commands
config.status: executing libtool commands
configure: summary of build options:

  version:          1.4.0
  Host type:        i386-pc-solaris2.11
  Install prefix:   /usr/local
  Compiler:         gcc
  Compiler flags:   -g -O2
  Library types:    Shared=yes, Static=yes
  Crypto library:   openssl: yes (AES-CTR: no) libgcrypt: no
  Debug build:      no
  Path to sshd:      (only for self-tests)
  libz compression: yes


And this is the relevant portion of the gmake output:

...
/bin/bash ../libtool --tag=CC --mode=link gcc  -g -O2   -o x11  x11.o
../src/libssh2.la -lnsl -lsocket
libtool: link: gcc -g -O2 -o .libs/x11 x11.o  ../src/.libs/libssh2.so -lssl
-lcrypto -lz -lnsl -lsocket -R/usr/local/lib
Undefined                       first referenced
 symbol                             in file
cfmakeraw                           x11.o
ld: fatal: Symbol referencing errors. No output written to .libs/x11
collect2: ld returned 1 exit status
gmake[2]: *** [x11] Error 1
...
gmake: *** [all-recursive] Error 1


-- 
Best regards,
Tom Weber
Cryptzone Group AB

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

From libssh2-devel-bounces@cool.haxx.se  Wed Feb 29 17:15:57 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1TGFmeL022390;
	Wed, 29 Feb 2012 17:15:56 +0100
Received: from nic.appgate.com (nic.appgate.com [79.138.127.130])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1TGFkO2022373
	for <libssh2-devel@cool.haxx.se>; Wed, 29 Feb 2012 17:15:46 +0100
Received: from krakatau.got.appgate.com (krakatau.got.appgate.com
	[172.23.2.32]) by nic.appgate.com (Postfix) with ESMTP id 20D001F2A44
	for <libssh2-devel@cool.haxx.se>; Wed, 29 Feb 2012 17:15:48 +0100 (MET)
Received: from localhost (it.got.cryptzone.com [172.24.4.4])
	by krakatau.got.appgate.com (Postfix) with ESMTP id 19267BD4048
	for <libssh2-devel@cool.haxx.se>; Wed, 29 Feb 2012 17:15:48 +0100 (CET)
Received: from 172.24.4.2 (SquirrelMail authenticated user tom)
	by localhost with HTTP; Wed, 29 Feb 2012 17:15:48 +0100
Message-ID: <ae4bd76285d74afd83da1655b75b00c2.squirrel@localhost>
Date: Wed, 29 Feb 2012 17:15:48 +0100
Subject: Timestamp patch for _libssh2_debug()
From: "Tom Weber" <tom.weber@cryptzone.com>
To: libssh2-devel@cool.haxx.se
User-Agent: SquirrelMail/1.4.21
MIME-Version: 1.0
Content-Type: multipart/mixed;boundary="----=_20120229171548_95397"
X-Priority: 3 (Normal)
Importance: Normal
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

------=_20120229171548_95397
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 8bit

Hi!

Please include this patch in the next release. You can apply it directly to
src/misc.c in 1.4.0.

The timestamps generated by _libssh2_debug() measure time since a quite
arbitrary point in time. It's the first time the function was called, rounded
down to the previous whole second. So if gettimeofday() returned
1000000.123456 the first time, the time 1000000.000000 is taken as the
reference. So if the next call occurs at gettimeofday() 1000000.456789,
_libssh2_debug() would print 0.456789 as timestamp, instead of 0.333333 which
is the actual time difference. This caused some confusion as my application
mixes these printouts with similar ones with proper calculation, so the time
could seem to jump up and down by as much as a second in the logs.

My patch saves also the second fraction at the first call, and makes a proper
calculation using carry.

Ideally the function should print the time since process invocation, as
returned by getrusage(), but that would require more work to port to platforms
which don't have it. A cheaper, mostly equivalent way would be to measure time
since libssh2_init() was called.

-- 
Best regards,
Tom Weber
Cryptzone Group AB
------=_20120229171548_95397
Content-Type: application/octet-stream; name="misc.c.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="misc.c.patch"

Mzk3YzM5Nwo8ICAgICBzdGF0aWMgaW50IGZpcnN0c2VjOwotLS0KPiAgICAgc3RhdGljIHN0cnVj
dCB0aW1ldmFsIGZpcnN0X3RpbWUgPSB7IDAsIDAgfTsKNDI4LDQyOWM0MjgsNDM4CjwgICAgIGlm
KCFmaXJzdHNlYykgewo8ICAgICAgICAgZmlyc3RzZWMgPSBub3cudHZfc2VjOwotLS0KPiAgICAg
aWYgKCFmaXJzdF90aW1lLnR2X3NlYykgewo+ICAgICAgICAgZmlyc3RfdGltZSA9IG5vdzsKPiAg
ICAgfQo+ICAgICBpZiAobm93LnR2X3VzZWMgPCBmaXJzdF90aW1lLnR2X3VzZWMpIHsKPiAgICAg
ICAgIC8qIGNhcnJ5ICovCj4gICAgICAgICBub3cudHZfc2VjIC09IGZpcnN0X3RpbWUudHZfc2Vj
ICsgMTsKPiAgICAgICAgIG5vdy50dl91c2VjICs9IDEwMDAwMDAgLSBmaXJzdF90aW1lLnR2X3Vz
ZWM7Cj4gICAgIH0gZWxzZSB7Cj4gICAgICAgICAvKiBubyBjYXJyeSAqLwo+ICAgICAgICAgbm93
LnR2X3NlYyAtPSBmaXJzdF90aW1lLnR2X3NlYzsKPiAgICAgICAgIG5vdy50dl91c2VjIC09IGZp
cnN0X3RpbWUudHZfdXNlYzsKNDMxZDQzOQo8ICAgICBub3cudHZfc2VjIC09IGZpcnN0c2VjOwo0
MzRjNDQyCjwgICAgICAgICAgICAgICAgICAgIChpbnQpbm93LnR2X3NlYywgKGludClub3cudHZf
dXNlYywgY29udGV4dHRleHQpOwotLS0KPiAgICAgICAgICAgICAgICAgICAgKGludCkgbm93LnR2
X3NlYywgKGludCkgbm93LnR2X3VzZWMsIGNvbnRleHR0ZXh0KTsK
------=_20120229171548_95397
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

------=_20120229171548_95397--


From libssh2-devel-bounces@cool.haxx.se  Wed Feb 29 19:44:31 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1TIiBhu011790;
	Wed, 29 Feb 2012 19:44:28 +0100
Received: from mail-iy0-f182.google.com (mail-iy0-f182.google.com
	[209.85.210.182])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1TIi8Wg011756
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <libssh2-devel@cool.haxx.se>; Wed, 29 Feb 2012 19:44:09 +0100
Received: by iahk25 with SMTP id k25so2552956iah.41
	for <libssh2-devel@cool.haxx.se>; Wed, 29 Feb 2012 10:44:03 -0800 (PST)
Received-SPF: pass (google.com: domain of xmitchx@gmail.com designates
	10.50.37.236 as permitted sender) client-ip=10.50.37.236; 
Authentication-Results: mr.google.com;
	spf=pass (google.com: domain of xmitchx@gmail.com
	designates 10.50.37.236 as permitted sender)
	smtp.mail=xmitchx@gmail.com;
	dkim=pass header.i=xmitchx@gmail.com
Received: from mr.google.com ([10.50.37.236])
	by 10.50.37.236 with SMTP id b12mr1737238igk.36.1330541043190 (num_hops
	= 1); Wed, 29 Feb 2012 10:44:03 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:in-reply-to:references:from:date
	:x-google-sender-auth:message-id:subject:to:content-type;
	bh=v4OJgpLSFADVzpGDLo7ScNTz/4ZGecPi4Wt5PXXtj8M=;
	b=SOb1XNCFMOkuIxR4Hkjx13u3lRCFE6l99mkFOa0hexcaZZr4zE1IkuIx0IBl6X2mgs
	hu5xhmlRQIXRolpcaj6UySQ7Ar3rAWck3cNe624RYHsMxg5sH9kgppxJftbc7xyneFIm
	pH+B0BAz2b20PQ5wm9H3rsjyHa+h2D6MSvito=
Received: by 10.50.37.236 with SMTP id b12mr1426851igk.36.1330541043150; Wed,
	29 Feb 2012 10:44:03 -0800 (PST)
MIME-Version: 1.0
Received: by 10.42.96.6 with HTTP; Wed, 29 Feb 2012 10:43:43 -0800 (PST)
In-Reply-To: <20120229080800.13736.qmail@stuge.se>
References: <CACOXMX4S1TL+mu3begwh0733TyrukV8Dw=DOv27Z_Zy332u1OA@mail.gmail.com>
	<20120229080800.13736.qmail@stuge.se>
From: Mitchell Hashimoto <mitchell.hashimoto@gmail.com>
Date: Wed, 29 Feb 2012 10:43:43 -0800
X-Google-Sender-Auth: YCyD_bgB8FFNyWJbKKH-7aGBqeY
Message-ID: <CACOXMX588bakCNKonxWryjXgRrTqGwtNKm7ehL_FExQdprk6pg@mail.gmail.com>
Subject: Re: Callback for channel data ready
To: libssh2 development <libssh2-devel@cool.haxx.se>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============0572382192=="
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

--===============0572382192==
Content-Type: multipart/alternative; boundary=f46d044788d93c705904ba1eba13

--f46d044788d93c705904ba1eba13
Content-Type: text/plain; charset=ISO-8859-1

Peter,

On Wed, Feb 29, 2012 at 12:08 AM, Peter Stuge <peter@stuge.se> wrote:

> Mitchell Hashimoto wrote:
> > I could iterate through each channel and do a channel_read()
>
> Indeed. See example/direct_tcpip.c or example/tcpip-forward.c.
>
>
> > but I was hoping perhaps there was a better way?
>
> Sorry not at this time. I think we want callbacks though, so feel
> free to discuss and send patches. :)
>

Understood. Thanks.

I haven't been using libssh2 long enough to feel comfortable enough in
suggesting API improvements, since I haven't quite immersed myself in the
"libssh2 way." But I agree that callbacks would be fantastic.

Best,
Mitchell


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

--f46d044788d93c705904ba1eba13
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Peter,<br><br><div class=3D"gmail_quote">On Wed, Feb 29, 2012 at 12:08 AM, =
Peter Stuge <span dir=3D"ltr">&lt;<a href=3D"mailto:peter@stuge.se">peter@s=
tuge.se</a>&gt;</span> wrote:<br><blockquote class=3D"gmail_quote" style=3D=
"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class=3D"im">Mitchell Hashimoto wrote:<br>
&gt; I could iterate through each channel and do a channel_read()<br>
<br>
</div>Indeed. See example/direct_tcpip.c or example/tcpip-forward.c.<br>
<div class=3D"im"><br>
<br>
&gt; but I was hoping perhaps there was a better way?<br>
<br>
</div>Sorry not at this time. I think we want callbacks though, so feel<br>
free to discuss and send patches. :)<br></blockquote><div><br></div><div>Un=
derstood. Thanks.</div><div><br></div><div>I haven&#39;t been using libssh2=
 long enough to feel comfortable enough in suggesting API improvements, sin=
ce I haven&#39;t quite immersed myself in the &quot;libssh2 way.&quot; But =
I agree that callbacks would be fantastic.</div>

<div><br></div><div>Best,</div><div>Mitchell =A0</div><div>=A0</div><blockq=
uote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc =
solid;padding-left:1ex">
<br>
<br>
//Peter<br>
_______________________________________________<br>
libssh2-devel <a href=3D"http://cool.haxx.se/cgi-bin/mailman/listinfo/libss=
h2-devel" target=3D"_blank">http://cool.haxx.se/cgi-bin/mailman/listinfo/li=
bssh2-devel</a><br>
</blockquote></div><br>

--f46d044788d93c705904ba1eba13--

--===============0572382192==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--===============0572382192==--

From libssh2-devel-bounces@cool.haxx.se  Wed Feb 29 22:33:18 2012
Return-Path: <libssh2-devel-bounces@cool.haxx.se>
Received: from www.haxx.se (localhost.localdomain [127.0.0.1])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with ESMTP id q1TLWvRj024847;
	Wed, 29 Feb 2012 22:33:15 +0100
Received: from foo.stuge.se (qmailr@foo.stuge.se [212.116.89.98])
	by giant.haxx.se (8.14.4/8.14.4/Debian-2) with SMTP id q1TLWt9r024829
	for <libssh2-devel@cool.haxx.se>; Wed, 29 Feb 2012 22:32:55 +0100
Received: (qmail 16169 invoked by uid 501); 29 Feb 2012 21:32:57 -0000
Message-ID: <20120229213257.16168.qmail@stuge.se>
Date: Wed, 29 Feb 2012 22:32:57 +0100
From: Peter Stuge <peter@stuge.se>
To: libssh2-devel@cool.haxx.se
Subject: Re: Build fails on OpenSolaris
Mail-Followup-To: libssh2-devel@cool.haxx.se
References: <35797bd9fe8d03ceffb25140ea07b73e.squirrel@localhost>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <35797bd9fe8d03ceffb25140ea07b73e.squirrel@localhost>
X-BeenThere: libssh2-devel@cool.haxx.se
X-Mailman-Version: 2.1.14
Precedence: list
Reply-To: libssh2 development <libssh2-devel@cool.haxx.se>
List-Id: libssh2 development <libssh2-devel.cool.haxx.se>
List-Unsubscribe: <http://cool.haxx.se/cgi-bin/mailman/options/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=unsubscribe>
List-Archive: <http://cool.haxx.se/pipermail/libssh2-devel>
List-Post: <mailto:libssh2-devel@cool.haxx.se>
List-Help: <mailto:libssh2-devel-request@cool.haxx.se?subject=help>
List-Subscribe: <http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel>, 
	<mailto:libssh2-devel-request@cool.haxx.se?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: libssh2-devel-bounces@cool.haxx.se
Sender: libssh2-devel-bounces@cool.haxx.se

Tom Weber wrote:
> The build of 1.4.0 fails in example/x11.c on OpenSolaris snv_89, since
> that platform lacks cfmakeraw().

Fixed by http://git.libssh2.org/?p=libssh2.git;a=commitdiff;h=aa8f2cbf


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

