From 83cd30553af708a2406d57ce969dca5574dba06d Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 20 May 2011 13:07:17 +0200 Subject: [PATCH 1/2] s3: Fork the echo handler only after SMB1 negprot is done This enables activating the echo responder also if SMB2 is enabled, albeit it will only be used for SMB1 at this moment. Autobuild-User: Volker Lendecke Autobuild-Date: Fri May 20 15:06:03 CEST 2011 on sn-devel-104 --- source3/smbd/negprot.c | 5 +++++ source3/smbd/process.c | 9 ++------- source3/smbd/proto.h | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/source3/smbd/negprot.c b/source3/smbd/negprot.c index a2e7e0b..562dcea 100644 --- a/source3/smbd/negprot.c +++ b/source3/smbd/negprot.c @@ -716,6 +716,11 @@ void reply_negprot(struct smb_request *req) } TALLOC_FREE(cliprotos); + + if (lp_async_smb_echo_handler() && !fork_echo_handler(sconn)) { + exit_server("Failed to fork echo handler"); + } + END_PROFILE(SMBnegprot); return; } diff --git a/source3/smbd/process.c b/source3/smbd/process.c index ccbaec5..a337469 100644 --- a/source3/smbd/process.c +++ b/source3/smbd/process.c @@ -2806,7 +2806,7 @@ static void smbd_echo_loop(struct smbd_server_connection *sconn, /* * Handle SMBecho requests in a forked child process */ -static bool fork_echo_handler(struct smbd_server_connection *sconn) +bool fork_echo_handler(struct smbd_server_connection *sconn) { int listener_pipe[2]; int res; @@ -2920,8 +2920,7 @@ void smbd_process(struct smbd_server_connection *sconn) const char *remaddr = NULL; int ret; - if (lp_maxprotocol() == PROTOCOL_SMB2 && - !lp_async_smb_echo_handler()) { + if (lp_maxprotocol() == PROTOCOL_SMB2) { /* * We're not making the decision here, * we're just allowing the client @@ -3042,10 +3041,6 @@ void smbd_process(struct smbd_server_connection *sconn) exit_server("Failed to init smb_signing"); } - if (lp_async_smb_echo_handler() && !fork_echo_handler(sconn)) { - exit_server("Failed to fork echo handler"); - } - /* Setup oplocks */ if (!init_oplocks(sconn->msg_ctx)) exit_server("Failed to init oplocks"); diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index b7bb063..6cbbcfa 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -793,6 +793,7 @@ size_t req_wct_ofs(struct smb_request *req); void chain_reply(struct smb_request *req); bool req_is_in_chain(struct smb_request *req); void smbd_process(struct smbd_server_connection *sconn); +bool fork_echo_handler(struct smbd_server_connection *sconn); /* The following definitions come from smbd/quotas.c */ -- 1.7.0.4 From 623003e59fe7fd683d630c11df33856ffefe7397 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 31 Aug 2011 15:06:35 +0200 Subject: [PATCH 2/2] s3: Do not fork the echo handler for smb2 If a smb1 negprot negotiated smb2 we forked the echo responder. This will eventually lead to a panic from [2011/08/30 10:33:29.212578, 0, pid=3846917] smbd/smb2_server.c:243(smbd_smb2_request_create) Invalid SMB packet: first request: 0x0009 because from the echo responder we always read using the normal smb1 protocol handling routine. If that is a bit down the smb2 stream, we get a non-negprot packet and panic. BTW, the echo responder is not required for smb2 anyway, Microsoft confirmed that it probes the server liveness using TCP keepalives and not smb2 echo requests. --- source3/smbd/negprot.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/source3/smbd/negprot.c b/source3/smbd/negprot.c index 562dcea..a628514 100644 --- a/source3/smbd/negprot.c +++ b/source3/smbd/negprot.c @@ -717,7 +717,8 @@ void reply_negprot(struct smb_request *req) TALLOC_FREE(cliprotos); - if (lp_async_smb_echo_handler() && !fork_echo_handler(sconn)) { + if (lp_async_smb_echo_handler() && (get_Protocol() < PROTOCOL_SMB2) && + !fork_echo_handler(sconn)) { exit_server("Failed to fork echo handler"); } -- 1.7.0.4