mirror of
https://github.com/samba-team/samba.git
synced 2025-01-08 21:18:16 +03:00
s4:lib/tls: remove tstream_tls_push_trigger_write step
At the time of https://bugzilla.samba.org/show_bug.cgi?id=7218, we tested this versions: 2.4.1 -> broken 2.4.2 -> broken 2.6.0 -> broken 2.8.0 -> broken 2.8.1 -> broken 2.8.2 -> OK 2.8.3 -> OK 2.8.4 -> OK 2.8.5 -> OK 2.8.6 -> OK 2.10.0 -> broken 2.10.1 -> broken 2.10.2 -> OK These seemed to be the fixes in gnutls upstream. Change 2.8.1 -> 2.8.2: http://git.savannah.gnu.org/gitweb/?p=gnutls.git;a=commitdiff;h=28fb34099edaf62e5472cc6e5e2749fed369ea01 Change 2.10.1 -> 2.10.2: http://git.savannah.gnu.org/gitweb/?p=gnutls.git;a=commitdiff;h=0d07d8432d57805a8354ebd6c1e7829f3ab159cb This shouldn't be a problem with recent (>= 3.6) versions of gnutls. BUG: https://bugzilla.samba.org/show_bug.cgi?id=15621 Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
This commit is contained in:
parent
68f6a461e1
commit
5844ef27aa
@ -75,7 +75,6 @@ struct tstream_tls {
|
|||||||
off_t ofs;
|
off_t ofs;
|
||||||
struct iovec iov;
|
struct iovec iov;
|
||||||
struct tevent_req *subreq;
|
struct tevent_req *subreq;
|
||||||
struct tevent_immediate *im;
|
|
||||||
} push;
|
} push;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@ -160,9 +159,7 @@ static void tstream_tls_retry_trigger(struct tevent_context *ctx,
|
|||||||
tstream_tls_retry(stream, true);
|
tstream_tls_retry(stream, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tstream_tls_push_trigger_write(struct tevent_context *ev,
|
static void tstream_tls_push_done(struct tevent_req *subreq);
|
||||||
struct tevent_immediate *im,
|
|
||||||
void *private_data);
|
|
||||||
|
|
||||||
static ssize_t tstream_tls_push_function(gnutls_transport_ptr_t ptr,
|
static ssize_t tstream_tls_push_function(gnutls_transport_ptr_t ptr,
|
||||||
const void *buf, size_t size)
|
const void *buf, size_t size)
|
||||||
@ -173,6 +170,7 @@ static ssize_t tstream_tls_push_function(gnutls_transport_ptr_t ptr,
|
|||||||
struct tstream_tls *tlss =
|
struct tstream_tls *tlss =
|
||||||
tstream_context_data(stream,
|
tstream_context_data(stream,
|
||||||
struct tstream_tls);
|
struct tstream_tls);
|
||||||
|
struct tevent_req *subreq = NULL;
|
||||||
uint8_t *nbuf;
|
uint8_t *nbuf;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
@ -206,56 +204,7 @@ static ssize_t tstream_tls_push_function(gnutls_transport_ptr_t ptr,
|
|||||||
tlss->push.buf = nbuf;
|
tlss->push.buf = nbuf;
|
||||||
|
|
||||||
memcpy(tlss->push.buf + tlss->push.ofs, buf, len);
|
memcpy(tlss->push.buf + tlss->push.ofs, buf, len);
|
||||||
|
|
||||||
if (tlss->push.im == NULL) {
|
|
||||||
tlss->push.im = tevent_create_immediate(tlss);
|
|
||||||
if (tlss->push.im == NULL) {
|
|
||||||
errno = ENOMEM;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tlss->push.ofs == 0) {
|
|
||||||
/*
|
|
||||||
* We'll do start the tstream_writev
|
|
||||||
* in the next event cycle.
|
|
||||||
*
|
|
||||||
* This way we can batch all push requests,
|
|
||||||
* if they fit into a UINT16_MAX buffer.
|
|
||||||
*
|
|
||||||
* This is important as gnutls_handshake()
|
|
||||||
* had a bug in some versions e.g. 2.4.1
|
|
||||||
* and others (See bug #7218) and it doesn't
|
|
||||||
* handle EAGAIN.
|
|
||||||
*/
|
|
||||||
tevent_schedule_immediate(tlss->push.im,
|
|
||||||
tlss->current_ev,
|
|
||||||
tstream_tls_push_trigger_write,
|
|
||||||
stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
tlss->push.ofs += len;
|
tlss->push.ofs += len;
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void tstream_tls_push_done(struct tevent_req *subreq);
|
|
||||||
|
|
||||||
static void tstream_tls_push_trigger_write(struct tevent_context *ev,
|
|
||||||
struct tevent_immediate *im,
|
|
||||||
void *private_data)
|
|
||||||
{
|
|
||||||
struct tstream_context *stream =
|
|
||||||
talloc_get_type_abort(private_data,
|
|
||||||
struct tstream_context);
|
|
||||||
struct tstream_tls *tlss =
|
|
||||||
tstream_context_data(stream,
|
|
||||||
struct tstream_tls);
|
|
||||||
struct tevent_req *subreq;
|
|
||||||
|
|
||||||
if (tlss->push.subreq) {
|
|
||||||
/* nothing todo */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
tlss->push.iov.iov_base = (char *)tlss->push.buf;
|
tlss->push.iov.iov_base = (char *)tlss->push.buf;
|
||||||
tlss->push.iov.iov_len = tlss->push.ofs;
|
tlss->push.iov.iov_len = tlss->push.ofs;
|
||||||
@ -265,13 +214,13 @@ static void tstream_tls_push_trigger_write(struct tevent_context *ev,
|
|||||||
tlss->plain_stream,
|
tlss->plain_stream,
|
||||||
&tlss->push.iov, 1);
|
&tlss->push.iov, 1);
|
||||||
if (subreq == NULL) {
|
if (subreq == NULL) {
|
||||||
tlss->error = ENOMEM;
|
errno = ENOMEM;
|
||||||
tstream_tls_retry(stream, false);
|
return -1;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
tevent_req_set_callback(subreq, tstream_tls_push_done, stream);
|
tevent_req_set_callback(subreq, tstream_tls_push_done, stream);
|
||||||
|
|
||||||
tlss->push.subreq = subreq;
|
tlss->push.subreq = subreq;
|
||||||
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tstream_tls_push_done(struct tevent_req *subreq)
|
static void tstream_tls_push_done(struct tevent_req *subreq)
|
||||||
|
Loading…
Reference in New Issue
Block a user