[SCM] Samba Shared Repository - branch master updated
Stefan Metzmacher
metze at samba.org
Wed Nov 30 07:14:03 MST 2011
The branch, master has been updated
via 4afbda2 s4:libcli/raw: implement on top of smbXcli_conn/req
via 99ef6a4 s4:libcli: do the nbss session request within smbcli_sock_connect_*()
via 52dd549 s4:libcli/raw: remove unused functions
via b21f344 s4:libcli: use smbcli_sock_connect() in smbcli_socket_connect()
via 4877be53 s4:libcli: move smbcli_transport_establish() logic into smbcli_socket_connect()
via b51c92a s4:libcli: convert smbcli_transport_connect_* to tevent_req
via 706e108 s4:lib/socket: add socket_connect_multi_ex_*
from 99f2177 s3-ctdb: Make use of CTDB_CONTROL_CHECK_SRVIDS
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 4afbda221c20ffa36a1d1e37ef11f86073a49da6
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Sep 23 08:35:17 2011 +0200
s4:libcli/raw: implement on top of smbXcli_conn/req
metze
Autobuild-User: Stefan Metzmacher <metze at samba.org>
Autobuild-Date: Wed Nov 30 15:13:36 CET 2011 on sn-devel-104
commit 99ef6a4bec1058b3649e5e72f8ea85f6df93a154
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Nov 30 08:50:11 2011 +0100
s4:libcli: do the nbss session request within smbcli_sock_connect_*()
metze
commit 52dd549eb64ea9b79bd4cbeba0fa4183aad7bb4c
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Nov 30 08:35:33 2011 +0100
s4:libcli/raw: remove unused functions
metze
commit b21f344079920194f94bbee7f44d8a6582e4d1a2
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Nov 30 08:33:29 2011 +0100
s4:libcli: use smbcli_sock_connect() in smbcli_socket_connect()
metze
commit 4877be53df1181f75d603fa4edc67c34e1ba5141
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed Nov 30 07:17:31 2011 +0100
s4:libcli: move smbcli_transport_establish() logic into smbcli_socket_connect()
metze
commit b51c92a903877015acf268ab8ff0e07d3a82b295
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Nov 29 11:57:11 2011 +0100
s4:libcli: convert smbcli_transport_connect_* to tevent_req
metze
commit 706e10820d490e0865b73f66a8665951aa6a71e3
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Nov 29 16:25:03 2011 +0100
s4:lib/socket: add socket_connect_multi_ex_*
This add an async establish hook, that gets called
before a connection success is detected.
This can be used to do a NBT session request
and it makes sure that we don't cancel the connection
on port 445, just because the tcp connect on port
139 worked.
metze
-----------------------------------------------------------------------
Summary of changes:
source4/client/client.c | 18 +-
source4/lib/socket/connect_multi.c | 129 ++++-
source4/lib/socket/socket.h | 28 +
source4/libcli/cliconnect.c | 46 +-
source4/libcli/libcli.h | 10 +-
source4/libcli/raw/clioplock.c | 11 +-
source4/libcli/raw/clisession.c | 3 +-
source4/libcli/raw/clisocket.c | 407 ++++++-----
source4/libcli/raw/clitransport.c | 713 ++++++++++---------
source4/libcli/raw/libcliraw.h | 73 +--
source4/libcli/raw/rawnegotiate.c | 253 +++----
source4/libcli/raw/rawnotify.c | 64 +--
source4/libcli/raw/rawreadwrite.c | 6 -
source4/libcli/raw/rawrequest.c | 227 ++++---
source4/libcli/raw/rawtrans.c | 1126 ++++++++----------------------
source4/libcli/raw/smb_signing.c | 175 -----
source4/libcli/smb2/connect.c | 56 +-
source4/libcli/smb_composite/connect.c | 94 +--
source4/libcli/smb_composite/sesssetup.c | 42 +-
source4/librpc/rpc/dcerpc_smb.c | 10 +-
source4/ntvfs/cifs/vfs_cifs.c | 3 +-
source4/torture/basic/base.c | 36 +-
source4/torture/raw/lockbench.c | 26 +-
source4/torture/raw/openbench.c | 25 +-
24 files changed, 1486 insertions(+), 2095 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source4/client/client.c b/source4/client/client.c
index 57686bb..d7adc41 100644
--- a/source4/client/client.c
+++ b/source4/client/client.c
@@ -3184,6 +3184,7 @@ static int do_message_op(const char *netbios_name, const char *desthost,
struct nbt_name called, calling;
const char *server_name;
struct smbcli_state *cli;
+ bool ok;
make_nbt_name_client(&calling, netbios_name);
@@ -3191,17 +3192,18 @@ static int do_message_op(const char *netbios_name, const char *desthost,
server_name = destip ? destip : desthost;
- if (!(cli = smbcli_state_init(NULL)) ||
- !smbcli_socket_connect(cli, server_name, destports,
- ev_ctx, resolve_ctx, options,
- socket_options)) {
- d_printf("Connection to %s failed\n", server_name);
+ cli = smbcli_state_init(NULL);
+ if (cli == NULL) {
+ d_printf("smbcli_state_init() failed\n");
return 1;
}
- if (!smbcli_transport_establish(cli, &calling, &called)) {
- d_printf("session request failed\n");
- talloc_free(cli);
+ ok = smbcli_socket_connect(cli, server_name, destports,
+ ev_ctx, resolve_ctx, options,
+ socket_options,
+ &calling, &called);
+ if (!ok) {
+ d_printf("Connection to %s failed\n", server_name);
return 1;
}
diff --git a/source4/lib/socket/connect_multi.c b/source4/lib/socket/connect_multi.c
index 2b926c8..c8231b3 100644
--- a/source4/lib/socket/connect_multi.c
+++ b/source4/lib/socket/connect_multi.c
@@ -42,6 +42,8 @@ struct connect_multi_state {
uint16_t result_port;
int num_connects_sent, num_connects_recv;
+
+ struct socket_connect_multi_ex *ex;
};
/*
@@ -59,17 +61,19 @@ static void connect_multi_timer(struct tevent_context *ev,
struct timeval tv, void *p);
static void connect_multi_next_socket(struct composite_context *result);
static void continue_one(struct composite_context *creq);
+static void continue_one_ex(struct tevent_req *subreq);
/*
setup an async socket_connect, with multiple ports
*/
-_PUBLIC_ struct composite_context *socket_connect_multi_send(
+_PUBLIC_ struct composite_context *socket_connect_multi_ex_send(
TALLOC_CTX *mem_ctx,
const char *server_name,
int num_server_ports,
uint16_t *server_ports,
struct resolve_context *resolve_ctx,
- struct tevent_context *event_ctx)
+ struct tevent_context *event_ctx,
+ struct socket_connect_multi_ex *ex)
{
struct composite_context *result;
struct connect_multi_state *multi;
@@ -95,6 +99,8 @@ _PUBLIC_ struct composite_context *socket_connect_multi_send(
multi->ports[i] = server_ports[i];
}
+ multi->ex = ex;
+
/*
we don't want to do the name resolution separately
for each port, so start it now, then only start on
@@ -225,10 +231,61 @@ static void continue_one(struct composite_context *creq)
struct connect_multi_state *multi = talloc_get_type(result->private_data,
struct connect_multi_state);
NTSTATUS status;
- multi->num_connects_recv++;
status = socket_connect_recv(creq);
+ if (multi->ex) {
+ struct tevent_req *subreq;
+
+ subreq = multi->ex->establish_send(state,
+ result->event_ctx,
+ state->sock,
+ state->addr,
+ multi->ex->private_data);
+ if (composite_nomem(subreq, result)) return;
+ tevent_req_set_callback(subreq, continue_one_ex, state);
+ return;
+ }
+
+ multi->num_connects_recv++;
+
+ if (NT_STATUS_IS_OK(status)) {
+ multi->sock = talloc_steal(multi, state->sock);
+ multi->result_port = state->addr->port;
+ }
+
+ talloc_free(state);
+
+ if (NT_STATUS_IS_OK(status) ||
+ multi->num_connects_recv == (multi->num_address * multi->num_ports)) {
+ result->status = status;
+ composite_done(result);
+ return;
+ }
+
+ /* try the next port */
+ connect_multi_next_socket(result);
+}
+
+/*
+ one of our multi->ex->establish_send() calls hash finished. If it got a
+ connection or there are none left then we are done
+*/
+static void continue_one_ex(struct tevent_req *subreq)
+{
+ struct connect_one_state *state =
+ tevent_req_callback_data(subreq,
+ struct connect_one_state);
+ struct composite_context *result = state->result;
+ struct connect_multi_state *multi =
+ talloc_get_type_abort(result->private_data,
+ struct connect_multi_state);
+ NTSTATUS status;
+ multi->num_connects_recv++;
+
+ status = multi->ex->establish_recv(subreq);
+ TALLOC_FREE(subreq);
+
if (NT_STATUS_IS_OK(status)) {
multi->sock = talloc_steal(multi, state->sock);
multi->result_port = state->addr->port;
@@ -250,7 +307,7 @@ static void continue_one(struct composite_context *creq)
/*
async recv routine for socket_connect_multi()
*/
-_PUBLIC_ NTSTATUS socket_connect_multi_recv(struct composite_context *ctx,
+_PUBLIC_ NTSTATUS socket_connect_multi_ex_recv(struct composite_context *ctx,
TALLOC_CTX *mem_ctx,
struct socket_context **sock,
uint16_t *port)
@@ -267,6 +324,55 @@ _PUBLIC_ NTSTATUS socket_connect_multi_recv(struct composite_context *ctx,
return status;
}
+NTSTATUS socket_connect_multi_ex(TALLOC_CTX *mem_ctx,
+ const char *server_address,
+ int num_server_ports, uint16_t *server_ports,
+ struct resolve_context *resolve_ctx,
+ struct tevent_context *event_ctx,
+ struct socket_connect_multi_ex *ex,
+ struct socket_context **result,
+ uint16_t *result_port)
+{
+ struct composite_context *ctx =
+ socket_connect_multi_ex_send(mem_ctx, server_address,
+ num_server_ports, server_ports,
+ resolve_ctx,
+ event_ctx,
+ ex);
+ return socket_connect_multi_ex_recv(ctx, mem_ctx, result, result_port);
+}
+
+/*
+ setup an async socket_connect, with multiple ports
+*/
+_PUBLIC_ struct composite_context *socket_connect_multi_send(
+ TALLOC_CTX *mem_ctx,
+ const char *server_name,
+ int num_server_ports,
+ uint16_t *server_ports,
+ struct resolve_context *resolve_ctx,
+ struct tevent_context *event_ctx)
+{
+ return socket_connect_multi_ex_send(mem_ctx,
+ server_name,
+ num_server_ports,
+ server_ports,
+ resolve_ctx,
+ event_ctx,
+ NULL); /* ex */
+}
+
+/*
+ async recv routine for socket_connect_multi()
+ */
+_PUBLIC_ NTSTATUS socket_connect_multi_recv(struct composite_context *ctx,
+ TALLOC_CTX *mem_ctx,
+ struct socket_context **sock,
+ uint16_t *port)
+{
+ return socket_connect_multi_ex_recv(ctx, mem_ctx, sock, port);
+}
+
NTSTATUS socket_connect_multi(TALLOC_CTX *mem_ctx,
const char *server_address,
int num_server_ports, uint16_t *server_ports,
@@ -275,10 +381,13 @@ NTSTATUS socket_connect_multi(TALLOC_CTX *mem_ctx,
struct socket_context **result,
uint16_t *result_port)
{
- struct composite_context *ctx =
- socket_connect_multi_send(mem_ctx, server_address,
- num_server_ports, server_ports,
- resolve_ctx,
- event_ctx);
- return socket_connect_multi_recv(ctx, mem_ctx, result, result_port);
+ return socket_connect_multi_ex(mem_ctx,
+ server_address,
+ num_server_ports,
+ server_ports,
+ resolve_ctx,
+ event_ctx,
+ NULL, /* ex */
+ result,
+ result_port);
}
diff --git a/source4/lib/socket/socket.h b/source4/lib/socket/socket.h
index e00b61b..403a723 100644
--- a/source4/lib/socket/socket.h
+++ b/source4/lib/socket/socket.h
@@ -202,6 +202,34 @@ NTSTATUS socket_connect_ev(struct socket_context *sock,
uint32_t flags,
struct tevent_context *ev);
+struct socket_connect_multi_ex {
+ void *private_data;
+ struct tevent_req *(*establish_send)(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct socket_context *sock,
+ struct socket_address *addr,
+ void *private_data);
+ NTSTATUS (*establish_recv)(struct tevent_req *req);
+};
+struct composite_context *socket_connect_multi_ex_send(TALLOC_CTX *mem_ctx,
+ const char *server_address,
+ int num_server_ports,
+ uint16_t *server_ports,
+ struct resolve_context *resolve_ctx,
+ struct tevent_context *event_ctx,
+ struct socket_connect_multi_ex *ex);
+NTSTATUS socket_connect_multi_ex_recv(struct composite_context *ctx,
+ TALLOC_CTX *mem_ctx,
+ struct socket_context **result,
+ uint16_t *port);
+NTSTATUS socket_connect_multi_ex(TALLOC_CTX *mem_ctx, const char *server_address,
+ int num_server_ports, uint16_t *server_ports,
+ struct resolve_context *resolve_ctx,
+ struct tevent_context *event_ctx,
+ struct socket_connect_multi_ex *ex,
+ struct socket_context **result,
+ uint16_t *port);
+
struct composite_context *socket_connect_multi_send(TALLOC_CTX *mem_ctx,
const char *server_address,
int num_server_ports,
diff --git a/source4/libcli/cliconnect.c b/source4/libcli/cliconnect.c
index d670324..45d8d2a 100644
--- a/source4/libcli/cliconnect.c
+++ b/source4/libcli/cliconnect.c
@@ -35,35 +35,47 @@ bool smbcli_socket_connect(struct smbcli_state *cli, const char *server,
struct tevent_context *ev_ctx,
struct resolve_context *resolve_ctx,
struct smbcli_options *options,
- const char *socket_options)
+ const char *socket_options,
+ struct nbt_name *calling,
+ struct nbt_name *called)
{
- struct smbcli_socket *sock;
-
- sock = smbcli_sock_connect_byname(server, ports, NULL,
- resolve_ctx, ev_ctx,
- socket_options);
+ NTSTATUS status;
- if (sock == NULL) return false;
-
- cli->transport = smbcli_transport_init(sock, cli, true, options);
- if (!cli->transport) {
+ cli->options = *options;
+
+ status = smbcli_sock_connect(cli,
+ NULL, /* host_addr */
+ ports,
+ server,
+ resolve_ctx,
+ ev_ctx,
+ socket_options,
+ calling,
+ called,
+ &cli->sock);
+ if (!NT_STATUS_IS_OK(status)) {
return false;
}
return true;
}
-/* wrapper around smbcli_transport_connect() */
-bool smbcli_transport_establish(struct smbcli_state *cli,
- struct nbt_name *calling,
- struct nbt_name *called)
-{
- return smbcli_transport_connect(cli->transport, calling, called);
-}
-
/* wrapper around smb_raw_negotiate() */
NTSTATUS smbcli_negprot(struct smbcli_state *cli, bool unicode, int maxprotocol)
{
+ if (unicode) {
+ cli->options.unicode = 1;
+ } else {
+ cli->options.unicode = 0;
+ }
+
+ cli->transport = smbcli_transport_init(cli->sock, cli,
+ true, &cli->options);
+ cli->sock = NULL;
+ if (!cli->transport) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
return smb_raw_negotiate(cli->transport, unicode, maxprotocol);
}
diff --git a/source4/libcli/libcli.h b/source4/libcli/libcli.h
index 81a31d1..9e81740 100644
--- a/source4/libcli/libcli.h
+++ b/source4/libcli/libcli.h
@@ -22,6 +22,7 @@
#define __LIBCLI_H__
#include "librpc/gen_ndr/nbt.h"
+#include "libcli/raw/libcliraw.h"
struct substitute_context;
@@ -30,6 +31,8 @@ struct substitute_context;
i.e. a single session on a single socket.
*/
struct smbcli_state {
+ struct smbcli_options options;
+ struct smbcli_socket *sock; /* NULL if connected */
struct smbcli_transport *transport;
struct smbcli_session *session;
struct smbcli_tree *tree;
@@ -88,10 +91,9 @@ bool smbcli_socket_connect(struct smbcli_state *cli, const char *server,
struct tevent_context *ev_ctx,
struct resolve_context *resolve_ctx,
struct smbcli_options *options,
- const char *socket_options);
-bool smbcli_transport_establish(struct smbcli_state *cli,
- struct nbt_name *calling,
- struct nbt_name *called);
+ const char *socket_options,
+ struct nbt_name *calling,
+ struct nbt_name *called);
NTSTATUS smbcli_negprot(struct smbcli_state *cli, bool unicode, int maxprotocol);
NTSTATUS smbcli_session_setup(struct smbcli_state *cli,
struct cli_credentials *credentials,
diff --git a/source4/libcli/raw/clioplock.c b/source4/libcli/raw/clioplock.c
index 42ac6b5..396ab96 100644
--- a/source4/libcli/raw/clioplock.c
+++ b/source4/libcli/raw/clioplock.c
@@ -40,11 +40,12 @@ _PUBLIC_ bool smbcli_oplock_ack(struct smbcli_tree *tree, uint16_t fnum, uint16_
SSVAL(req->out.vwv,VWV(6),0);
SSVAL(req->out.vwv,VWV(7),0);
- /* this request does not expect a reply, so tell the signing
- subsystem not to allocate an id for a reply */
- req->one_way_request = 1;
-
- ret = smbcli_request_send(req);
+ /*
+ * The low level code knows it is a
+ * one way request by looking at SMBlockingX,
+ * wct == 8 and LOCKING_ANDX_OPLOCK_RELEASE
+ */
+ ret = smbcli_request_send(req);
return ret;
}
diff --git a/source4/libcli/raw/clisession.c b/source4/libcli/raw/clisession.c
index 41765bf..d68f309 100644
--- a/source4/libcli/raw/clisession.c
+++ b/source4/libcli/raw/clisession.c
@@ -23,6 +23,7 @@
#include "libcli/raw/libcliraw.h"
#include "libcli/raw/raw_proto.h"
#include "system/filesys.h"
+#include "../libcli/smb/smbXcli_base.h"
#define SETUP_REQUEST_SESSION(cmd, wct, buflen) do { \
req = smbcli_request_setup_session(session, cmd, wct, buflen); \
@@ -68,7 +69,7 @@ struct smbcli_session *smbcli_session_init(struct smbcli_transport *transport,
if (capabilities & CAP_EXTENDED_SECURITY) {
flags2 |= FLAGS2_EXTENDED_SECURITY;
}
- if (session->transport->negotiate.sign_info.doing_signing) {
+ if (smb1cli_conn_signing_is_active(session->transport->conn)) {
flags2 |= FLAGS2_SMB_SECURITY_SIGNATURES;
}
diff --git a/source4/libcli/raw/clisocket.c b/source4/libcli/raw/clisocket.c
index 70a83a4..dd3ea39 100644
--- a/source4/libcli/raw/clisocket.c
+++ b/source4/libcli/raw/clisocket.c
@@ -21,6 +21,9 @@
*/
#include "includes.h"
+#include "system/network.h"
+#include "../lib/async_req/async_sock.h"
+#include "../lib/util/tevent_ntstatus.h"
#include "lib/events/events.h"
#include "libcli/raw/libcliraw.h"
#include "libcli/composite/composite.h"
@@ -28,128 +31,220 @@
#include "libcli/resolve/resolve.h"
#include "param/param.h"
#include "libcli/raw/raw_proto.h"
+#include "../libcli/smb/read_smb.h"
-/*
- send a session request
-*/
-struct smbcli_request *smbcli_transport_connect_send(struct smbcli_transport *transport,
- struct nbt_name *calling,
- struct nbt_name *called)
+struct smbcli_transport_connect_state {
+ struct tevent_context *ev;
+ struct socket_context *sock;
+ uint8_t *request;
+ struct iovec iov;
+ uint8_t *response;
+};
+
+static void smbcli_transport_connect_writev_done(struct tevent_req *subreq);
+static void smbcli_transport_connect_read_smb_done(struct tevent_req *subreq);
+
+static struct tevent_req *smbcli_transport_connect_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct socket_context *sock,
+ uint16_t port,
+ uint32_t timeout_msec,
+ struct nbt_name *calling,
+ struct nbt_name *called)
{
- uint8_t *p;
- struct smbcli_request *req;
+ struct tevent_req *req;
+ struct smbcli_transport_connect_state *state;
+ struct tevent_req *subreq;
DATA_BLOB calling_blob, called_blob;
- TALLOC_CTX *tmp_ctx = talloc_new(transport);
+ uint8_t *p;
NTSTATUS status;
- status = nbt_name_dup(transport, called, &transport->called);
- if (!NT_STATUS_IS_OK(status)) goto failed;
-
- status = nbt_name_to_blob(tmp_ctx, &calling_blob, calling);
- if (!NT_STATUS_IS_OK(status)) goto failed;
+ req = tevent_req_create(mem_ctx, &state,
+ struct smbcli_transport_connect_state);
+ if (req == NULL) {
+ return NULL;
+ }
+ state->ev = ev;
+ state->sock = sock;
- status = nbt_name_to_blob(tmp_ctx, &called_blob, called);
- if (!NT_STATUS_IS_OK(status)) goto failed;
+ if (port != 139) {
+ tevent_req_done(req);
+ return tevent_req_post(req, ev);
+ }
- /* allocate output buffer */
- req = smbcli_request_setup_nonsmb(transport,
- NBT_HDR_SIZE +
- calling_blob.length + called_blob.length);
- if (req == NULL) goto failed;
+ status = nbt_name_to_blob(state, &calling_blob, calling);
+ if (tevent_req_nterror(req, status)) {
--
Samba Shared Repository
More information about the samba-cvs
mailing list