[SCM] Samba Shared Repository - branch master updated
Stefan Metzmacher
metze at samba.org
Mon Jul 23 16:09:03 MDT 2012
The branch, master has been updated
via 43b070d libcli/smb: pass down smbXcli_session to smb1cli_req_create/send() and smb1cli_trans*
via af90c71 s4:libcli/raw: setup a smbXcli_session for each smbcli_session
via cdec0c4 s3:libsmb: use cli_state_{g,s}et_uid instead of smb1.uid directly
via 6bff589 libcli/smb: introduce smb1.session for uid use
from a256d61 s3-winbind: Fix bug #9052 resolving our own "Domain Local" groups.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 43b070d8dd20d7a2a1a0ec1eb5ebc679cd699bf3
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Jul 23 20:15:21 2012 +0200
libcli/smb: pass down smbXcli_session to smb1cli_req_create/send() and smb1cli_trans*
metze
Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
Autobuild-Date(master): Tue Jul 24 00:08:58 CEST 2012 on sn-devel-104
commit af90c71ed8e66586aa23f7d0e18efc557c9a0c08
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Jul 23 19:47:05 2012 +0200
s4:libcli/raw: setup a smbXcli_session for each smbcli_session
metze
commit cdec0c46464c8b524fc64ff46f1af809af026086
Author: Luk Claes <luk at debian.org>
Date: Sat Jun 2 12:45:40 2012 +0200
s3:libsmb: use cli_state_{g,s}et_uid instead of smb1.uid directly
Signed-off-by: Luk Claes <luk at debian.org>
Signed-off-by: Stefan Metzmacher <metze at samba.org>
commit 6bff589e33afde6e0f7db9f99f14be5cb171f587
Author: Luk Claes <luk at debian.org>
Date: Sat Jun 2 12:49:22 2012 +0200
libcli/smb: introduce smb1.session for uid use
Signed-off-by: Luk Claes <luk at debian.org>
Signed-off-by: Stefan Metzmacher <metze at samba.org>
-----------------------------------------------------------------------
Summary of changes:
libcli/smb/smb1cli_trans.c | 21 +++++++++++++--------
libcli/smb/smbXcli_base.c | 34 +++++++++++++++++++++++++++-------
libcli/smb/smbXcli_base.h | 13 +++++++++----
source3/include/client.h | 2 +-
source3/libsmb/async_smb.c | 4 ++--
source3/libsmb/clientgen.c | 11 +++++++----
source3/libsmb/clitrans.c | 6 ++++--
source4/libcli/raw/clisession.c | 14 +++++++++++++-
source4/libcli/raw/clitransport.c | 13 ++++++++-----
source4/libcli/raw/libcliraw.h | 1 +
source4/libcli/raw/rawrequest.c | 2 ++
source4/libcli/raw/rawtrans.c | 20 ++++++++++++++------
12 files changed, 101 insertions(+), 40 deletions(-)
Changeset truncated at 500 lines:
diff --git a/libcli/smb/smb1cli_trans.c b/libcli/smb/smb1cli_trans.c
index fadac8e..ca0fdc1 100644
--- a/libcli/smb/smb1cli_trans.c
+++ b/libcli/smb/smb1cli_trans.c
@@ -40,7 +40,7 @@ struct smb1cli_trans_state {
uint16_t mid;
uint32_t pid;
uint16_t tid;
- uint16_t uid;
+ struct smbXcli_session *session;
const char *pipe_name;
uint8_t *pipe_name_conv;
size_t pipe_name_conv_len;
@@ -415,7 +415,8 @@ struct tevent_req *smb1cli_trans_send(
uint8_t additional_flags, uint8_t clear_flags,
uint16_t additional_flags2, uint16_t clear_flags2,
uint32_t timeout_msec,
- uint32_t pid, uint16_t tid, uint16_t uid,
+ uint32_t pid, uint16_t tid,
+ struct smbXcli_session *session,
const char *pipe_name, uint16_t fid, uint16_t function, int flags,
uint16_t *setup, uint8_t num_setup, uint8_t max_setup,
uint8_t *param, uint32_t num_param, uint32_t max_param,
@@ -470,7 +471,7 @@ struct tevent_req *smb1cli_trans_send(
state->rsetup = NULL;
state->pid = pid;
state->tid = tid;
- state->uid = uid;
+ state->session = session;
ZERO_STRUCT(state->rparam);
ZERO_STRUCT(state->rdata);
@@ -513,7 +514,8 @@ struct tevent_req *smb1cli_trans_send(
state->additional_flags2,
state->clear_flags2,
state->timeout_msec,
- state->pid, state->tid, state->uid,
+ state->pid, state->tid,
+ state->session,
wct, state->vwv,
iov_count, state->iov);
if (tevent_req_nomem(subreq, req)) {
@@ -644,7 +646,8 @@ static void smb1cli_trans_done(struct tevent_req *subreq)
state->additional_flags2,
state->clear_flags2,
state->timeout_msec,
- state->pid, state->tid, state->uid,
+ state->pid, state->tid,
+ state->session,
wct, state->vwv,
iov_count, state->iov);
if (tevent_req_nomem(subreq2, req)) {
@@ -750,7 +753,8 @@ static void smb1cli_trans_done2(struct tevent_req *subreq2)
state->additional_flags2,
state->clear_flags2,
state->timeout_msec,
- state->pid, state->tid, state->uid,
+ state->pid, state->tid,
+ state->session,
wct, state->vwv,
iov_count, state->iov);
if (tevent_req_nomem(subreq2, req)) {
@@ -840,7 +844,8 @@ NTSTATUS smb1cli_trans(TALLOC_CTX *mem_ctx, struct smbXcli_conn *conn,
uint8_t additional_flags, uint8_t clear_flags,
uint16_t additional_flags2, uint16_t clear_flags2,
uint32_t timeout_msec,
- uint32_t pid, uint16_t tid, uint16_t uid,
+ uint32_t pid, uint16_t tid,
+ struct smbXcli_session *session,
const char *pipe_name, uint16_t fid, uint16_t function,
int flags,
uint16_t *setup, uint8_t num_setup, uint8_t max_setup,
@@ -874,7 +879,7 @@ NTSTATUS smb1cli_trans(TALLOC_CTX *mem_ctx, struct smbXcli_conn *conn,
additional_flags, clear_flags,
additional_flags2, clear_flags2,
timeout_msec,
- pid, tid, uid,
+ pid, tid, session,
pipe_name, fid, function, flags,
setup, num_setup, max_setup,
param, num_param, max_param,
diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c
index 326a43d..c41890d 100644
--- a/libcli/smb/smbXcli_base.c
+++ b/libcli/smb/smbXcli_base.c
@@ -132,6 +132,10 @@ struct smbXcli_session {
struct smbXcli_conn *conn;
struct {
+ uint16_t session_id;
+ } smb1;
+
+ struct {
uint64_t session_id;
uint16_t session_flags;
DATA_BLOB application_key;
@@ -1091,7 +1095,6 @@ static bool smb1cli_req_cancel(struct tevent_req *req)
uint16_t flags2;
uint32_t pid;
uint16_t tid;
- uint16_t uid;
uint16_t mid;
struct tevent_req *subreq;
NTSTATUS status;
@@ -1101,7 +1104,6 @@ static bool smb1cli_req_cancel(struct tevent_req *req)
pid = SVAL(state->smb1.hdr, HDR_PID);
pid |= SVAL(state->smb1.hdr, HDR_PIDHIGH)<<16;
tid = SVAL(state->smb1.hdr, HDR_TID);
- uid = SVAL(state->smb1.hdr, HDR_UID);
mid = SVAL(state->smb1.hdr, HDR_MID);
subreq = smb1cli_req_create(state, state->ev,
@@ -1110,7 +1112,8 @@ static bool smb1cli_req_cancel(struct tevent_req *req)
flags, 0,
flags2, 0,
0, /* timeout */
- pid, tid, uid,
+ pid, tid,
+ state->session,
0, NULL, /* vwv */
0, NULL); /* bytes */
if (subreq == NULL) {
@@ -1147,7 +1150,7 @@ struct tevent_req *smb1cli_req_create(TALLOC_CTX *mem_ctx,
uint32_t timeout_msec,
uint32_t pid,
uint16_t tid,
- uint16_t uid,
+ struct smbXcli_session *session,
uint8_t wct, uint16_t *vwv,
int iov_count,
struct iovec *bytes_iov)
@@ -1156,6 +1159,7 @@ struct tevent_req *smb1cli_req_create(TALLOC_CTX *mem_ctx,
struct smbXcli_req_state *state;
uint8_t flags = 0;
uint16_t flags2 = 0;
+ uint16_t uid = 0;
if (iov_count > MAX_SMB_IOV) {
/*
@@ -1171,6 +1175,11 @@ struct tevent_req *smb1cli_req_create(TALLOC_CTX *mem_ctx,
}
state->ev = ev;
state->conn = conn;
+ state->session = session;
+
+ if (session) {
+ uid = session->smb1.session_id;
+ }
state->smb1.recv_cmd = 0xFF;
state->smb1.recv_status = NT_STATUS_INTERNAL_ERROR;
@@ -1415,7 +1424,7 @@ struct tevent_req *smb1cli_req_send(TALLOC_CTX *mem_ctx,
uint32_t timeout_msec,
uint32_t pid,
uint16_t tid,
- uint16_t uid,
+ struct smbXcli_session *session,
uint8_t wct, uint16_t *vwv,
uint32_t num_bytes,
const uint8_t *bytes)
@@ -1431,7 +1440,7 @@ struct tevent_req *smb1cli_req_send(TALLOC_CTX *mem_ctx,
additional_flags, clear_flags,
additional_flags2, clear_flags2,
timeout_msec,
- pid, tid, uid,
+ pid, tid, session,
wct, vwv, 1, &iov);
if (req == NULL) {
return NULL;
@@ -3528,7 +3537,7 @@ static struct tevent_req *smbXcli_negprot_smb1_subreq(struct smbXcli_negprot_sta
flags, ~flags,
flags2, ~flags2,
state->timeout_msec,
- 0xFFFE, 0, 0, /* pid, tid, uid */
+ 0xFFFE, 0, NULL, /* pid, tid, session */
0, NULL, /* wct, vwv */
bytes.length, bytes.data);
}
@@ -4208,6 +4217,17 @@ struct smbXcli_session *smbXcli_session_create(TALLOC_CTX *mem_ctx,
return session;
}
+uint16_t smb1cli_session_current_id(struct smbXcli_session *session)
+{
+ return session->smb1.session_id;
+}
+
+void smb1cli_session_set_id(struct smbXcli_session *session,
+ uint16_t session_id)
+{
+ session->smb1.session_id = session_id;
+}
+
uint8_t smb2cli_session_security_mode(struct smbXcli_session *session)
{
struct smbXcli_conn *conn = session->conn;
diff --git a/libcli/smb/smbXcli_base.h b/libcli/smb/smbXcli_base.h
index 81a8e93..9d4847c 100644
--- a/libcli/smb/smbXcli_base.h
+++ b/libcli/smb/smbXcli_base.h
@@ -110,7 +110,7 @@ struct tevent_req *smb1cli_req_create(TALLOC_CTX *mem_ctx,
uint32_t timeout_msec,
uint32_t pid,
uint16_t tid,
- uint16_t uid,
+ struct smbXcli_session *session,
uint8_t wct, uint16_t *vwv,
int iov_count,
struct iovec *bytes_iov);
@@ -127,7 +127,7 @@ struct tevent_req *smb1cli_req_send(TALLOC_CTX *mem_ctx,
uint32_t timeout_msec,
uint32_t pid,
uint16_t tid,
- uint16_t uid,
+ struct smbXcli_session *session,
uint8_t wct, uint16_t *vwv,
uint32_t num_bytes,
const uint8_t *bytes);
@@ -151,7 +151,8 @@ struct tevent_req *smb1cli_trans_send(
uint8_t additional_flags, uint8_t clear_flags,
uint16_t additional_flags2, uint16_t clear_flags2,
uint32_t timeout_msec,
- uint32_t pid, uint16_t tid, uint16_t uid,
+ uint32_t pid, uint16_t tid,
+ struct smbXcli_session *session,
const char *pipe_name, uint16_t fid, uint16_t function, int flags,
uint16_t *setup, uint8_t num_setup, uint8_t max_setup,
uint8_t *param, uint32_t num_param, uint32_t max_param,
@@ -169,7 +170,8 @@ NTSTATUS smb1cli_trans(TALLOC_CTX *mem_ctx, struct smbXcli_conn *conn,
uint8_t additional_flags, uint8_t clear_flags,
uint16_t additional_flags2, uint16_t clear_flags2,
uint32_t timeout_msec,
- uint32_t pid, uint16_t tid, uint16_t uid,
+ uint32_t pid, uint16_t tid,
+ struct smbXcli_session *session,
const char *pipe_name, uint16_t fid, uint16_t function,
int flags,
uint16_t *setup, uint8_t num_setup, uint8_t max_setup,
@@ -245,6 +247,9 @@ NTSTATUS smbXcli_negprot(struct smbXcli_conn *conn,
struct smbXcli_session *smbXcli_session_create(TALLOC_CTX *mem_ctx,
struct smbXcli_conn *conn);
+uint16_t smb1cli_session_current_id(struct smbXcli_session* session);
+void smb1cli_session_set_id(struct smbXcli_session* session,
+ uint16_t session_id);
uint8_t smb2cli_session_security_mode(struct smbXcli_session *session);
uint64_t smb2cli_session_current_id(struct smbXcli_session *session);
uint16_t smb2cli_session_get_flags(struct smbXcli_session *session);
diff --git a/source3/include/client.h b/source3/include/client.h
index 5694ed0..b6e62a3 100644
--- a/source3/include/client.h
+++ b/source3/include/client.h
@@ -104,7 +104,7 @@ struct cli_state {
uint16_t pid;
uint16_t vc_num;
uint16_t tid;
- uint16_t uid;
+ struct smbXcli_session *session;
} smb1;
struct {
diff --git a/source3/libsmb/async_smb.c b/source3/libsmb/async_smb.c
index c2986e2..a82b0ce 100644
--- a/source3/libsmb/async_smb.c
+++ b/source3/libsmb/async_smb.c
@@ -93,7 +93,7 @@ struct tevent_req *cli_smb_req_create(TALLOC_CTX *mem_ctx,
cli->timeout,
cli->smb1.pid,
cli->smb1.tid,
- cli->smb1.uid,
+ cli->smb1.session,
wct, vwv, iov_count, bytes_iov);
if (state->req == NULL) {
talloc_free(state);
@@ -151,7 +151,7 @@ struct tevent_req *cli_smb_send(TALLOC_CTX *mem_ctx,
cli->timeout,
cli->smb1.pid,
cli->smb1.tid,
- cli->smb1.uid,
+ cli->smb1.session,
wct, vwv, num_bytes, bytes);
if (state->req == NULL) {
talloc_free(state);
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index 4398d80..dcb8467 100644
--- a/source3/libsmb/clientgen.c
+++ b/source3/libsmb/clientgen.c
@@ -269,7 +269,10 @@ struct cli_state *cli_state_create(TALLOC_CTX *mem_ctx,
cli->smb1.pid = (uint16_t)getpid();
cli->smb1.vc_num = cli->smb1.pid;
cli->smb1.tid = UINT16_MAX;
- cli->smb1.uid = UID_FIELD_INVALID;
+ cli->smb1.session = smbXcli_session_create(cli, cli->conn);
+ if (cli->smb1.session == NULL) {
+ goto error;
+ }
cli->initialised = 1;
return cli;
@@ -398,13 +401,13 @@ uint16_t cli_state_set_tid(struct cli_state *cli, uint16_t tid)
uint16_t cli_state_get_uid(struct cli_state *cli)
{
- return cli->smb1.uid;
+ return smb1cli_session_current_id(cli->smb1.session);
}
uint16_t cli_state_set_uid(struct cli_state *cli, uint16_t uid)
{
- uint16_t ret = cli->smb1.uid;
- cli->smb1.uid = uid;
+ uint16_t ret = smb1cli_session_current_id(cli->smb1.session);
+ smb1cli_session_set_id(cli->smb1.session, uid);
return ret;
}
diff --git a/source3/libsmb/clitrans.c b/source3/libsmb/clitrans.c
index 5dd7008..5a27678 100644
--- a/source3/libsmb/clitrans.c
+++ b/source3/libsmb/clitrans.c
@@ -89,7 +89,8 @@ struct tevent_req *cli_trans_send(
additional_flags, clear_flags,
additional_flags2, clear_flags2,
cli->timeout,
- cli->smb1.pid, cli->smb1.tid, cli->smb1.uid,
+ cli->smb1.pid, cli->smb1.tid,
+ cli->smb1.session,
pipe_name, fid, function, flags,
setup, num_setup, max_setup,
param, num_param, max_param,
@@ -183,7 +184,8 @@ NTSTATUS cli_trans(TALLOC_CTX *mem_ctx, struct cli_state *cli,
additional_flags, clear_flags,
additional_flags2, clear_flags2,
cli->timeout,
- cli->smb1.pid, cli->smb1.tid, cli->smb1.uid,
+ cli->smb1.pid, cli->smb1.tid,
+ cli->smb1.session,
pipe_name, fid, function, flags,
setup, num_setup, max_setup,
param, num_param, max_param,
diff --git a/source4/libcli/raw/clisession.c b/source4/libcli/raw/clisession.c
index d68f309..23d7fd1 100644
--- a/source4/libcli/raw/clisession.c
+++ b/source4/libcli/raw/clisession.c
@@ -55,7 +55,19 @@ struct smbcli_session *smbcli_session_init(struct smbcli_transport *transport,
session->pid = (uint16_t)getpid();
session->vuid = UID_FIELD_INVALID;
session->options = options;
-
+
+ /*
+ * for now session->vuid is still used by the callers, but we call:
+ * smb1cli_session_set_id(session->smbXcli, session->vuid);
+ * before using session->smbXcli, in future we should remove
+ * session->vuid.
+ */
+ session->smbXcli = smbXcli_session_create(session, transport->conn);
+ if (session->smbXcli == NULL) {
+ talloc_free(session);
+ return NULL;
+ }
+
capabilities = transport->negotiate.capabilities;
flags2 = FLAGS2_LONG_PATH_COMPONENTS | FLAGS2_EXTENDED_ATTRIBUTES;
diff --git a/source4/libcli/raw/clitransport.c b/source4/libcli/raw/clitransport.c
index f9759b1..321df76 100644
--- a/source4/libcli/raw/clitransport.c
+++ b/source4/libcli/raw/clitransport.c
@@ -214,7 +214,7 @@ struct tevent_req *smbcli_transport_setup_subreq(struct smbcli_request *req)
uint16_t clear_flags2;
uint32_t pid;
uint16_t tid;
- uint16_t uid;
+ struct smbXcli_session *session = NULL;
uint32_t timeout_msec = transport->options.request_timeout * 1000;
struct iovec *bytes_iov = NULL;
struct tevent_req *subreq = NULL;
@@ -225,11 +225,14 @@ struct tevent_req *smbcli_transport_setup_subreq(struct smbcli_request *req)
pid = SVAL(req->out.hdr, HDR_PID);
pid |= SVAL(req->out.hdr, HDR_PIDHIGH)<<16;
tid = SVAL(req->out.hdr, HDR_TID);
- uid = SVAL(req->out.hdr, HDR_UID);
clear_flags = ~additional_flags;
clear_flags2 = ~additional_flags2;
+ if (req->session) {
+ session = req->session->smbXcli;
+ }
+
bytes_iov = talloc(req, struct iovec);
if (bytes_iov == NULL) {
return NULL;
@@ -248,7 +251,7 @@ struct tevent_req *smbcli_transport_setup_subreq(struct smbcli_request *req)
timeout_msec,
pid,
tid,
- uid,
+ session,
req->out.wct,
(uint16_t *)req->out.vwv,
1, bytes_iov);
@@ -293,7 +296,7 @@ void smbcli_transport_send(struct smbcli_request *req)
0, /* timeout_msec */
0, /* pid */
0, /* tid */
- 0, /* uid */
+ NULL, /* session */
0, /* wct */
NULL, /* vwv */
0, /* iov_count */
@@ -499,7 +502,7 @@ static void smbcli_transport_break_handler(struct tevent_req *subreq)
0, /* timeout_msec */
0, /* pid */
0, /* tid */
- 0, /* uid */
+ NULL, /* session */
0, /* wct */
NULL, /* vwv */
0, /* iov_count */
diff --git a/source4/libcli/raw/libcliraw.h b/source4/libcli/raw/libcliraw.h
index b7e5e21..8cdccc1 100644
--- a/source4/libcli/raw/libcliraw.h
+++ b/source4/libcli/raw/libcliraw.h
@@ -156,6 +156,7 @@ struct smbcli_session {
/* after a session setup the server provides us with
a vuid identifying the security context */
+ struct smbXcli_session *smbXcli;
uint16_t vuid;
/* default pid for this session */
diff --git a/source4/libcli/raw/rawrequest.c b/source4/libcli/raw/rawrequest.c
index 1b4c8c7..56bbf25 100644
--- a/source4/libcli/raw/rawrequest.c
+++ b/source4/libcli/raw/rawrequest.c
@@ -146,6 +146,8 @@ struct smbcli_request *smbcli_request_setup_session(struct smbcli_session *sessi
if (!req) return NULL;
+ smb1cli_session_set_id(session->smbXcli, session->vuid);
+
req->session = session;
SSVAL(req->out.hdr, HDR_FLG2, session->flags2);
diff --git a/source4/libcli/raw/rawtrans.c b/source4/libcli/raw/rawtrans.c
index 8e16e5b..1df5209 100644
--- a/source4/libcli/raw/rawtrans.c
+++ b/source4/libcli/raw/rawtrans.c
@@ -37,7 +37,7 @@ static struct smbcli_request *smb_raw_trans_backend_send(struct smbcli_tree *tre
uint16_t clear_flags2;
uint32_t pid;
uint16_t tid;
- uint16_t uid;
+ struct smbXcli_session *session = NULL;
const char *pipe_name = NULL;
uint8_t s;
uint32_t timeout_msec;
@@ -55,7 +55,10 @@ static struct smbcli_request *smb_raw_trans_backend_send(struct smbcli_tree *tre
pid = SVAL(req->out.hdr, HDR_PID);
pid |= SVAL(req->out.hdr, HDR_PIDHIGH)<<16;
tid = SVAL(req->out.hdr, HDR_TID);
- uid = SVAL(req->out.hdr, HDR_UID);
+
+ if (req->session) {
+ session = req->session->smbXcli;
+ }
clear_flags = ~additional_flags;
clear_flags2 = ~additional_flags2;
@@ -86,7 +89,8 @@ static struct smbcli_request *smb_raw_trans_backend_send(struct smbcli_tree *tre
additional_flags2,
clear_flags2,
timeout_msec,
- pid, tid, uid,
+ pid, tid,
+ session,
pipe_name,
0xFFFF, /* fid */
0, /* function */
@@ -259,7 +263,7 @@ struct smbcli_request *smb_raw_nttrans_send(struct smbcli_tree *tree,
uint16_t clear_flags2;
uint32_t pid;
uint16_t tid;
- uint16_t uid;
+ struct smbXcli_session *session = NULL;
uint32_t timeout_msec;
uint32_t tmp;
@@ -275,7 +279,10 @@ struct smbcli_request *smb_raw_nttrans_send(struct smbcli_tree *tree,
pid = SVAL(req->out.hdr, HDR_PID);
pid |= SVAL(req->out.hdr, HDR_PIDHIGH)<<16;
tid = SVAL(req->out.hdr, HDR_TID);
- uid = SVAL(req->out.hdr, HDR_UID);
+
+ if (req->session) {
+ session = req->session->smbXcli;
+ }
--
Samba Shared Repository
More information about the samba-cvs
mailing list