[gnutls-help] Gnutls 3.3.X + Wine = problem
Lavrentiev, Anton (NIH/NLM/NCBI) [C]
lavr at ncbi.nlm.nih.gov
Mon Mar 23 15:52:01 CET 2015
Does that ring the bell?
> The only workaround which has been found is to compile Wine (and use it)
> with the old version of Gnutls (2.12.X).
From: Lavrentiev, Anton (NIH/NLM/NCBI) [C]
Sent: Monday, June 16, 2014 10:54 AM
To: Nikos Mavrogiannopoulos
Cc: gnutls-help at gnutls.org
Subject: Re: [gnutls-help] Regression bug between 2.x and 3.2?
> From that description I think that this is pretty much expected. A call
> to gnutls_record_send() can be interrupted, and had to be called again
> (I believe that was the case in all gnutls versions). If that's not
> clear from the documentation please let me know what could be improved.
Here's the problem: there was no interruption, there was a short write.
Previous version of GNUTLS tolerated that by calling the push callback
once again, and again, and again, giving up only when nothing _at all_
was written (-1 returned). Current version bails out immediately.
This is a change in behavior, which is not backward compatible.
The code in gnutls_buffers.c has changed significantly: it was presumably
necessary to accommodate a vector write operation (writev), and could have
resulted in the inadvertent change for the plain push.
Anyhow, the push callback is documented to be a send()-like thing.
Which means it is allowed to write fewer bytes than it was requested to,
and that does not constitute an error. Previous GNUTLS version treated
that exactly so, by re-trying the write until unsuccessful (and advancing
with writes, most of the time). Current implementation considers the
short write as a fault and returns EAGAIN. Thus, the callback is
longer compatible with send(): if the callback wants GNUTLS to
keep writing it must ensure to push as many bytes as it was told to,
which means, it must be doing send()/wait()/send() sequences internally.
P.S. I'm preparing a test case which should demonstrate the changed behavior.
More information about the Gnutls-help