[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Sat Sep 29 03:53:03 MDT 2012


The branch, master has been updated
       via  6fbb1b5 s3:libsmb: use smbXcli_conn_remote_name() in smb2_tcon_send()
       via  4e1306c s3:libsmb: make cli_echo* protocol independent
       via  b186fdd libcli/smb: add smb1cli_echo*
       via  a7fa026 libcli/smb: add smb2cli_echo*
       via  faa039e libcli/smb: use an explicit TALLOC_FREE(subreq) in smb2cli_*
      from  f0f310c build: Remove duplicate check for struct getquota_rslt member getquota_rslt_u

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 6fbb1b5fd55897def70b9603423f23ed8335428e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Sep 28 19:11:14 2012 +0200

    s3:libsmb: use smbXcli_conn_remote_name() in smb2_tcon_send()
    
    metze
    
    Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
    Autobuild-Date(master): Sat Sep 29 11:52:43 CEST 2012 on sn-devel-104

commit 4e1306c46a0ab00c2e1a5d78a2f3a9bd9bb45cbe
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Sep 28 20:00:21 2012 +0200

    s3:libsmb: make cli_echo* protocol independent
    
    metze

commit b186fdd185d2d5c7d9abd7f652aed58fec6de2ff
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Sep 28 19:53:16 2012 +0200

    libcli/smb: add smb1cli_echo*
    
    metze

commit a7fa02664ad8c8bbdad14e4c7f732d0da1867449
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Sep 28 19:18:37 2012 +0200

    libcli/smb: add smb2cli_echo*
    
    metze

commit faa039ef463e681a28cacd7dda44961219f7b8c6
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Sep 28 19:48:26 2012 +0200

    libcli/smb: use an explicit TALLOC_FREE(subreq) in smb2cli_*
    
    metze

-----------------------------------------------------------------------

Summary of changes:
 libcli/smb/smb1cli_echo.c                      |  170 ++++++++++++++++++++++++
 libcli/smb/smb2cli_close.c                     |    1 +
 libcli/smb/smb2cli_create.c                    |    1 +
 libcli/smb/{smb2cli_flush.c => smb2cli_echo.c} |   56 +++-----
 libcli/smb/smb2cli_flush.c                     |    1 +
 libcli/smb/smb2cli_ioctl.c                     |    1 +
 libcli/smb/smb2cli_query_directory.c           |    1 +
 libcli/smb/smb2cli_query_info.c                |    1 +
 libcli/smb/smb2cli_read.c                      |    1 +
 libcli/smb/smb2cli_set_info.c                  |    1 +
 libcli/smb/smb2cli_write.c                     |    1 +
 libcli/smb/smbXcli_base.h                      |   18 +++
 libcli/smb/wscript                             |    2 +
 source3/Makefile.in                            |    2 +
 source3/libsmb/clientgen.c                     |   55 +++-----
 source3/libsmb/smb2cli_tcon.c                  |    6 +-
 16 files changed, 249 insertions(+), 69 deletions(-)
 create mode 100644 libcli/smb/smb1cli_echo.c
 copy libcli/smb/{smb2cli_flush.c => smb2cli_echo.c} (63%)


Changeset truncated at 500 lines:

diff --git a/libcli/smb/smb1cli_echo.c b/libcli/smb/smb1cli_echo.c
new file mode 100644
index 0000000..cab8ae6
--- /dev/null
+++ b/libcli/smb/smb1cli_echo.c
@@ -0,0 +1,170 @@
+/*
+   Unix SMB/CIFS implementation.
+   smb2 lib
+   Copyright (C) Stefan Metzmacher 2012
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "system/network.h"
+#include "lib/util/tevent_ntstatus.h"
+#include "smb_common.h"
+#include "smbXcli_base.h"
+
+struct smb1cli_echo_state {
+	uint16_t vwv[1];
+	DATA_BLOB data;
+	uint16_t num_echos;
+};
+
+static void smb1cli_echo_done(struct tevent_req *subreq);
+
+struct tevent_req *smb1cli_echo_send(TALLOC_CTX *mem_ctx,
+				     struct tevent_context *ev,
+				     struct smbXcli_conn *conn,
+				     uint32_t timeout_msec,
+				     uint16_t num_echos,
+				     DATA_BLOB data)
+{
+	struct tevent_req *req, *subreq;
+	struct smb1cli_echo_state *state;
+
+	req = tevent_req_create(mem_ctx, &state, struct smb1cli_echo_state);
+	if (req == NULL) {
+		return NULL;
+	}
+	SSVAL(state->vwv, 0, num_echos);
+	state->data = data;
+	state->num_echos = num_echos;
+
+	subreq = smb1cli_req_send(state, ev, conn, SMBecho,
+				  0, 0, /* *_flags */
+				  0, 0, /* *_flags2 */
+				  timeout_msec,
+				  0, /* pid */
+				  NULL, /* tcon */
+				  NULL, /* session */
+				  ARRAY_SIZE(state->vwv), state->vwv,
+				  data.length, data.data);
+	if (subreq == NULL) {
+		goto fail;
+	}
+	tevent_req_set_callback(subreq, smb1cli_echo_done, req);
+	return req;
+ fail:
+	TALLOC_FREE(req);
+	return NULL;
+}
+
+static void smb1cli_echo_done(struct tevent_req *subreq)
+{
+	struct tevent_req *req = tevent_req_callback_data(
+		subreq, struct tevent_req);
+	struct smb1cli_echo_state *state = tevent_req_data(
+		req, struct smb1cli_echo_state);
+	NTSTATUS status;
+	uint32_t num_bytes;
+	uint8_t *bytes;
+	struct iovec *recv_iov;
+	struct smb1cli_req_expected_response expected[] = {
+	{
+		.status = NT_STATUS_OK,
+		.wct    = 1,
+	},
+	};
+
+	status = smb1cli_req_recv(subreq, state,
+				  &recv_iov,
+				  NULL, /* phdr */
+				  NULL, /* pwct */
+				  NULL, /* pvwv */
+				  NULL, /* pvwv_offset */
+				  &num_bytes,
+				  &bytes,
+				  NULL, /* pbytes_offset */
+				  NULL, /* pinbuf */
+				  expected, ARRAY_SIZE(expected));
+	TALLOC_FREE(subreq);
+	if (!NT_STATUS_IS_OK(status)) {
+		tevent_req_nterror(req, status);
+		return;
+	}
+
+	if (num_bytes != state->data.length) {
+		tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
+		return;
+	}
+
+	if (memcmp(bytes, state->data.data, num_bytes) != 0) {
+		tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);
+		return;
+	}
+
+	/* TODO: do we want to verify the sequence number? */
+
+	state->num_echos -=1;
+	if (state->num_echos == 0) {
+		tevent_req_done(req);
+		return;
+	}
+
+	if (!smbXcli_req_set_pending(subreq)) {
+		tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
+		return;
+	}
+}
+
+/**
+ * Get the result out from an echo request
+ * @param[in] req	The async_req from smb1cli_echo_send
+ * @retval Did the server reply correctly?
+ */
+
+NTSTATUS smb1cli_echo_recv(struct tevent_req *req)
+{
+	return tevent_req_simple_recv_ntstatus(req);
+}
+
+NTSTATUS smb1cli_echo(struct smbXcli_conn *conn, uint32_t timeout_msec,
+		      uint16_t num_echos, DATA_BLOB data)
+{
+	TALLOC_CTX *frame = talloc_stackframe();
+	struct tevent_context *ev;
+	struct tevent_req *req;
+	NTSTATUS status = NT_STATUS_NO_MEMORY;
+
+	if (smbXcli_conn_has_async_calls(conn)) {
+		/*
+		 * Can't use sync call while an async call is in flight
+		 */
+		status = NT_STATUS_INVALID_PARAMETER;
+		goto fail;
+	}
+	ev = tevent_context_init(frame);
+	if (ev == NULL) {
+		goto fail;
+	}
+	req = smb1cli_echo_send(frame, ev, conn, timeout_msec, num_echos, data);
+	if (req == NULL) {
+		goto fail;
+	}
+	if (!tevent_req_poll_ntstatus(req, ev, &status)) {
+		goto fail;
+	}
+	status = smb1cli_echo_recv(req);
+ fail:
+	TALLOC_FREE(frame);
+	return status;
+}
diff --git a/libcli/smb/smb2cli_close.c b/libcli/smb/smb2cli_close.c
index fbeee55..c10a21f 100644
--- a/libcli/smb/smb2cli_close.c
+++ b/libcli/smb/smb2cli_close.c
@@ -83,6 +83,7 @@ static void smb2cli_close_done(struct tevent_req *subreq)
 
 	status = smb2cli_req_recv(subreq, NULL, NULL,
 				  expected, ARRAY_SIZE(expected));
+	TALLOC_FREE(subreq);
 	if (tevent_req_nterror(req, status)) {
 		return;
 	}
diff --git a/libcli/smb/smb2cli_create.c b/libcli/smb/smb2cli_create.c
index 4d264ef..62efc48 100644
--- a/libcli/smb/smb2cli_create.c
+++ b/libcli/smb/smb2cli_create.c
@@ -172,6 +172,7 @@ static void smb2cli_create_done(struct tevent_req *subreq)
 
 	status = smb2cli_req_recv(subreq, state, &iov,
 				  expected, ARRAY_SIZE(expected));
+	TALLOC_FREE(subreq);
 	if (tevent_req_nterror(req, status)) {
 		return;
 	}
diff --git a/libcli/smb/smb2cli_flush.c b/libcli/smb/smb2cli_echo.c
similarity index 63%
copy from libcli/smb/smb2cli_flush.c
copy to libcli/smb/smb2cli_echo.c
index a280e15..b978d50 100644
--- a/libcli/smb/smb2cli_flush.c
+++ b/libcli/smb/smb2cli_echo.c
@@ -1,7 +1,7 @@
 /*
    Unix SMB/CIFS implementation.
    smb2 lib
-   Copyright (C) Volker Lendecke 2011
+   Copyright (C) Stefan Metzmacher 2012
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -23,50 +23,45 @@
 #include "smb_common.h"
 #include "smbXcli_base.h"
 
-struct smb2cli_flush_state {
-	uint8_t fixed[24];
+struct smb2cli_echo_state {
+	uint8_t fixed[0x4];
 };
 
-static void smb2cli_flush_done(struct tevent_req *subreq);
+static void smb2cli_echo_done(struct tevent_req *subreq);
 
-struct tevent_req *smb2cli_flush_send(TALLOC_CTX *mem_ctx,
-				       struct tevent_context *ev,
-				       struct smbXcli_conn *conn,
-				       uint32_t timeout_msec,
-				       struct smbXcli_session *session,
-				       struct smbXcli_tcon *tcon,
-				       uint64_t fid_persistent,
-				       uint64_t fid_volatile)
+struct tevent_req *smb2cli_echo_send(TALLOC_CTX *mem_ctx,
+				     struct tevent_context *ev,
+				     struct smbXcli_conn *conn,
+				     uint32_t timeout_msec)
 {
 	struct tevent_req *req, *subreq;
-	struct smb2cli_flush_state *state;
+	struct smb2cli_echo_state *state;
 	uint8_t *fixed;
 
 	req = tevent_req_create(mem_ctx, &state,
-				struct smb2cli_flush_state);
+				struct smb2cli_echo_state);
 	if (req == NULL) {
 		return NULL;
 	}
 	fixed = state->fixed;
-	SSVAL(fixed, 0, 24);
-	SBVAL(fixed, 8, fid_persistent);
-	SBVAL(fixed, 16, fid_volatile);
+	SSVAL(fixed, 0, 4);
+	SSVAL(fixed, 2, 0);
 
-	subreq = smb2cli_req_send(state, ev, conn, SMB2_OP_FLUSH,
+	subreq = smb2cli_req_send(state, ev, conn, SMB2_OP_KEEPALIVE,
 				  0, 0, /* flags */
 				  timeout_msec,
-				  tcon,
-				  session,
+				  NULL, /* tcon */
+				  NULL, /* session */
 				  state->fixed, sizeof(state->fixed),
 				  NULL, 0);
 	if (tevent_req_nomem(subreq, req)) {
 		return tevent_req_post(req, ev);
 	}
-	tevent_req_set_callback(subreq, smb2cli_flush_done, req);
+	tevent_req_set_callback(subreq, smb2cli_echo_done, req);
 	return req;
 }
 
-static void smb2cli_flush_done(struct tevent_req *subreq)
+static void smb2cli_echo_done(struct tevent_req *subreq)
 {
 	struct tevent_req *req =
 		tevent_req_callback_data(subreq,
@@ -81,23 +76,20 @@ static void smb2cli_flush_done(struct tevent_req *subreq)
 
 	status = smb2cli_req_recv(subreq, NULL, NULL,
 				  expected, ARRAY_SIZE(expected));
+	TALLOC_FREE(subreq);
 	if (tevent_req_nterror(req, status)) {
 		return;
 	}
 	tevent_req_done(req);
 }
 
-NTSTATUS smb2cli_flush_recv(struct tevent_req *req)
+NTSTATUS smb2cli_echo_recv(struct tevent_req *req)
 {
 	return tevent_req_simple_recv_ntstatus(req);
 }
 
-NTSTATUS smb2cli_flush(struct smbXcli_conn *conn,
-		       uint32_t timeout_msec,
-		       struct smbXcli_session *session,
-		       struct smbXcli_tcon *tcon,
-		       uint64_t fid_persistent,
-		       uint64_t fid_volatile)
+NTSTATUS smb2cli_echo(struct smbXcli_conn *conn,
+		      uint32_t timeout_msec)
 {
 	TALLOC_CTX *frame = talloc_stackframe();
 	struct tevent_context *ev;
@@ -115,16 +107,14 @@ NTSTATUS smb2cli_flush(struct smbXcli_conn *conn,
 	if (ev == NULL) {
 		goto fail;
 	}
-	req = smb2cli_flush_send(frame, ev, conn, timeout_msec,
-				 session, tcon,
-				 fid_persistent, fid_volatile);
+	req = smb2cli_echo_send(frame, ev, conn, timeout_msec);
 	if (req == NULL) {
 		goto fail;
 	}
 	if (!tevent_req_poll_ntstatus(req, ev, &status)) {
 		goto fail;
 	}
-	status = smb2cli_flush_recv(req);
+	status = smb2cli_echo_recv(req);
  fail:
 	TALLOC_FREE(frame);
 	return status;
diff --git a/libcli/smb/smb2cli_flush.c b/libcli/smb/smb2cli_flush.c
index a280e15..4b14347 100644
--- a/libcli/smb/smb2cli_flush.c
+++ b/libcli/smb/smb2cli_flush.c
@@ -81,6 +81,7 @@ static void smb2cli_flush_done(struct tevent_req *subreq)
 
 	status = smb2cli_req_recv(subreq, NULL, NULL,
 				  expected, ARRAY_SIZE(expected));
+	TALLOC_FREE(subreq);
 	if (tevent_req_nterror(req, status)) {
 		return;
 	}
diff --git a/libcli/smb/smb2cli_ioctl.c b/libcli/smb/smb2cli_ioctl.c
index 687c9d5..dd1788f 100644
--- a/libcli/smb/smb2cli_ioctl.c
+++ b/libcli/smb/smb2cli_ioctl.c
@@ -178,6 +178,7 @@ static void smb2cli_ioctl_done(struct tevent_req *subreq)
 
 	status = smb2cli_req_recv(subreq, state, &iov,
 				  expected, ARRAY_SIZE(expected));
+	TALLOC_FREE(subreq);
 	if (tevent_req_nterror(req, status)) {
 		return;
 	}
diff --git a/libcli/smb/smb2cli_query_directory.c b/libcli/smb/smb2cli_query_directory.c
index 3278378..49d5365 100644
--- a/libcli/smb/smb2cli_query_directory.c
+++ b/libcli/smb/smb2cli_query_directory.c
@@ -121,6 +121,7 @@ static void smb2cli_query_directory_done(struct tevent_req *subreq)
 
 	status = smb2cli_req_recv(subreq, state, &iov,
 				  expected, ARRAY_SIZE(expected));
+	TALLOC_FREE(subreq);
 	if (tevent_req_nterror(req, status)) {
 		return;
 	}
diff --git a/libcli/smb/smb2cli_query_info.c b/libcli/smb/smb2cli_query_info.c
index 80cec9c..96847fc 100644
--- a/libcli/smb/smb2cli_query_info.c
+++ b/libcli/smb/smb2cli_query_info.c
@@ -133,6 +133,7 @@ static void smb2cli_query_info_done(struct tevent_req *subreq)
 
 	status = smb2cli_req_recv(subreq, state, &iov,
 				  expected, ARRAY_SIZE(expected));
+	TALLOC_FREE(subreq);
 	if (tevent_req_nterror(req, status)) {
 		return;
 	}
diff --git a/libcli/smb/smb2cli_read.c b/libcli/smb/smb2cli_read.c
index e808b0c..11bcae7 100644
--- a/libcli/smb/smb2cli_read.c
+++ b/libcli/smb/smb2cli_read.c
@@ -103,6 +103,7 @@ static void smb2cli_read_done(struct tevent_req *subreq)
 
 	status = smb2cli_req_recv(subreq, state, &iov,
 				  expected, ARRAY_SIZE(expected));
+	TALLOC_FREE(subreq);
 	if (tevent_req_nterror(req, status)) {
 		return;
 	}
diff --git a/libcli/smb/smb2cli_set_info.c b/libcli/smb/smb2cli_set_info.c
index 41fe83e..0ac4703 100644
--- a/libcli/smb/smb2cli_set_info.c
+++ b/libcli/smb/smb2cli_set_info.c
@@ -111,6 +111,7 @@ static void smb2cli_set_info_done(struct tevent_req *subreq)
 
 	status = smb2cli_req_recv(subreq, NULL, NULL,
 				  expected, ARRAY_SIZE(expected));
+	TALLOC_FREE(subreq);
 	if (tevent_req_nterror(req, status)) {
 		return;
 	}
diff --git a/libcli/smb/smb2cli_write.c b/libcli/smb/smb2cli_write.c
index a149924..e7d7f75 100644
--- a/libcli/smb/smb2cli_write.c
+++ b/libcli/smb/smb2cli_write.c
@@ -104,6 +104,7 @@ static void smb2cli_write_done(struct tevent_req *subreq)
 
 	status = smb2cli_req_recv(subreq, NULL, NULL,
 				  expected, ARRAY_SIZE(expected));
+	TALLOC_FREE(subreq);
 	if (tevent_req_nterror(req, status)) {
 		return;
 	}
diff --git a/libcli/smb/smbXcli_base.h b/libcli/smb/smbXcli_base.h
index 5ef201e..03cb280 100644
--- a/libcli/smb/smbXcli_base.h
+++ b/libcli/smb/smbXcli_base.h
@@ -187,6 +187,16 @@ NTSTATUS smb1cli_trans(TALLOC_CTX *mem_ctx, struct smbXcli_conn *conn,
 		uint8_t **rparam, uint32_t min_rparam, uint32_t *num_rparam,
 		uint8_t **rdata, uint32_t min_rdata, uint32_t *num_rdata);
 
+struct tevent_req *smb1cli_echo_send(TALLOC_CTX *mem_ctx,
+				     struct tevent_context *ev,
+				     struct smbXcli_conn *conn,
+				     uint32_t timeout_msec,
+				     uint16_t num_echos,
+				     DATA_BLOB data);
+NTSTATUS smb1cli_echo_recv(struct tevent_req *req);
+NTSTATUS smb1cli_echo(struct smbXcli_conn *conn, uint32_t timeout_msec,
+		      uint16_t num_echos, DATA_BLOB data);
+
 uint32_t smb2cli_conn_server_capabilities(struct smbXcli_conn *conn);
 uint16_t smb2cli_conn_server_security_mode(struct smbXcli_conn *conn);
 uint32_t smb2cli_conn_max_trans_size(struct smbXcli_conn *conn);
@@ -567,4 +577,12 @@ NTSTATUS smb2cli_ioctl(struct smbXcli_conn *conn,
 		       DATA_BLOB *out_input_buffer,
 		       DATA_BLOB *out_output_buffer);
 
+struct tevent_req *smb2cli_echo_send(TALLOC_CTX *mem_ctx,
+				     struct tevent_context *ev,
+				     struct smbXcli_conn *conn,
+				     uint32_t timeout_msec);
+NTSTATUS smb2cli_echo_recv(struct tevent_req *req);
+NTSTATUS smb2cli_echo(struct smbXcli_conn *conn,
+		      uint32_t timeout_msec);
+
 #endif /* _SMBXCLI_BASE_H_ */
diff --git a/libcli/smb/wscript b/libcli/smb/wscript
index ae65d68..3616ad1 100755
--- a/libcli/smb/wscript
+++ b/libcli/smb/wscript
@@ -21,6 +21,7 @@ def build(bld):
 		util.c
 		smbXcli_base.c
 		smb1cli_trans.c
+		smb1cli_echo.c
 		smb2cli_session.c
                 smb2cli_create.c
                 smb2cli_close.c
@@ -31,6 +32,7 @@ def build(bld):
 		smb2cli_query_info.c
 		smb2cli_query_directory.c
 		smb2cli_ioctl.c
+		smb2cli_echo.c
 	''',
 	deps='LIBCRYPTO errors gensec krb5samba smb_transport',
 	public_deps='talloc samba-util',
diff --git a/source3/Makefile.in b/source3/Makefile.in
index 0e72fea..a29aae2 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -629,6 +629,7 @@ LIBSMB_OBJ = libsmb/clientgen.o libsmb/cliconnect.o libsmb/clifile.o \
 	     ../libcli/smb/read_smb.o \
 	     ../libcli/smb/smbXcli_base.o \
 	     ../libcli/smb/smb1cli_trans.o \
+	     ../libcli/smb/smb1cli_echo.o \
 	     ../libcli/smb/smb2cli_session.o \
 	     libsmb/smb2cli_tcon.o \
 	     ../libcli/smb/smb2cli_create.o \
@@ -642,6 +643,7 @@ LIBSMB_OBJ = libsmb/clientgen.o libsmb/cliconnect.o libsmb/clifile.o \
 	     ../libcli/smb/smb2cli_ioctl.o \
 	     ../libcli/smb/smb2cli_query_info.o \
 	     ../libcli/smb/smb2cli_set_info.o \
+	     ../libcli/smb/smb2cli_echo.o \
 	     libsmb/cli_np_tstream.o \
 	     libsmb/smbsock_connect.o \
 	     $(LIBSAMBA_OBJ) \
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index 31af1e7..6bc8d0c 100644
--- a/source3/libsmb/clientgen.c
+++ b/source3/libsmb/clientgen.c
@@ -454,9 +454,7 @@ time_t cli_state_server_time(struct cli_state *cli)
 }
 
 struct cli_echo_state {
-	uint16_t vwv[1];
-	DATA_BLOB data;
-	int num_echos;
+	bool is_smb2;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list