[SCM] Samba Shared Repository - branch master updated
Stefan Metzmacher
metze at samba.org
Thu May 17 13:54:05 MDT 2012
The branch, master has been updated
via 918eb3e s4:torture: add smb2.session.expire1
via 50e1861 s4:torture: add smb2.session.reconnect2 test
via 908b737 s4:torture: rename smb2.session.reconnect to smb2.session.reconnect1
via 184227d s4:torture: remove unused vars in smb2.session.reauth*
via 90c309b s4:auth/gensec_gssapi: add "gensec_gssapi:requested_life_time" option
via bffa1c5 s3:gse: implement gensec_gse_expire_time()
via 6b38d02 s4:auth/gensec: implement gensec_gssapi_expire_time()
via 9ac855c auth/gensec: implement gensec_spnego_expire_time()
via dce6fdf auth/gensec: add gensec_expire_time()
via 677c4fd s4:auth/gensec_gssapi: add missing 'break' statements
via 943cb79 s4:auth/gensec_gssapi: remember the expire time
via 9ec866f s3:gse: remember the expire time
via ff700ac s3:smb2_sesssetup: make use of nt_status_squash() in smbd_smb2_session_setup_recv()
from 632af66 Check the return from create_acl_blob
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 918eb3ecc53e0033f119640959803155b0a6af02
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu May 17 18:32:49 2012 +0200
s4:torture: add smb2.session.expire1
metze
Autobuild-User: Stefan Metzmacher <metze at samba.org>
Autobuild-Date: Thu May 17 21:53:11 CEST 2012 on sn-devel-104
commit 50e1861381f4f04d8c0430d6e32ec53d59118be9
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Apr 30 16:40:14 2012 +0200
s4:torture: add smb2.session.reconnect2 test
This uses just one transport connection
and demonstrates the implicit logoff of the previous session.
metze
commit 908b737a299a9493036e1d661f3742fb197d415f
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Apr 30 14:46:54 2012 +0200
s4:torture: rename smb2.session.reconnect to smb2.session.reconnect1
metze
commit 184227d2699b876b38d6929fd5063fea5c8b3485
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu May 17 18:32:16 2012 +0200
s4:torture: remove unused vars in smb2.session.reauth*
metze
commit 90c309b053c0328419a79361e0c2e32486cef428
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Apr 20 13:51:22 2012 +0200
s4:auth/gensec_gssapi: add "gensec_gssapi:requested_life_time" option
metze
commit bffa1c5547dbe8075004f61bd25e63b4d2e3c521
Author: Stefan Metzmacher <metze at samba.org>
Date: Sat Mar 3 04:34:19 2012 +0100
s3:gse: implement gensec_gse_expire_time()
metze
commit 6b38d0274a209c951fc0ef33e2913aaaa9d48299
Author: Stefan Metzmacher <metze at samba.org>
Date: Sat Mar 3 04:33:55 2012 +0100
s4:auth/gensec: implement gensec_gssapi_expire_time()
metze
commit 9ac855c8b8680aedc299497fc48004e1523cb49a
Author: Stefan Metzmacher <metze at samba.org>
Date: Sat Mar 3 04:33:15 2012 +0100
auth/gensec: implement gensec_spnego_expire_time()
metze
commit dce6fdf195f3485be4b4e6b1dcf44b57a4cf7782
Author: Stefan Metzmacher <metze at samba.org>
Date: Sat Mar 3 04:32:45 2012 +0100
auth/gensec: add gensec_expire_time()
metze
commit 677c4fd2c10435b5d5e06f226db4ee9c7a2ab988
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu May 17 17:31:09 2012 +0200
s4:auth/gensec_gssapi: add missing 'break' statements
metze
commit 943cb79596e2823f166bc6a59d40008afa187b7a
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Mar 2 22:02:36 2012 +0100
s4:auth/gensec_gssapi: remember the expire time
metze
commit 9ec866fb6cdb672b2a7cb882510e7abd80679491
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Jan 26 17:32:12 2012 +0100
s3:gse: remember the expire time
metze
commit ff700acdd04b2a3e01d125a616571479410e9657
Author: Stefan Metzmacher <metze at samba.org>
Date: Wed May 16 15:32:08 2012 +0200
s3:smb2_sesssetup: make use of nt_status_squash() in smbd_smb2_session_setup_recv()
metze
-----------------------------------------------------------------------
Summary of changes:
auth/gensec/gensec.c | 8 ++
auth/gensec/gensec.h | 4 +
auth/gensec/spnego.c | 12 ++
source3/librpc/crypto/gse.c | 29 +++++-
source3/smbd/smb2_sesssetup.c | 2 +-
source4/auth/gensec/gensec_gssapi.c | 32 ++++++-
source4/auth/gensec/gensec_gssapi.h | 1 +
source4/torture/smb2/session.c | 189 ++++++++++++++++++++++++++++++++++-
8 files changed, 266 insertions(+), 11 deletions(-)
Changeset truncated at 500 lines:
diff --git a/auth/gensec/gensec.c b/auth/gensec/gensec.c
index 1e61bf0..ea62861 100644
--- a/auth/gensec/gensec.c
+++ b/auth/gensec/gensec.c
@@ -395,6 +395,14 @@ _PUBLIC_ bool gensec_have_feature(struct gensec_security *gensec_security,
return gensec_security->ops->have_feature(gensec_security, feature);
}
+_PUBLIC_ NTTIME gensec_expire_time(struct gensec_security *gensec_security)
+{
+ if (!gensec_security->ops->expire_time) {
+ return GENSEC_EXPIRE_TIME_INFINITY;
+ }
+
+ return gensec_security->ops->expire_time(gensec_security);
+}
/**
* Return the credentials structure associated with a GENSEC context
*
diff --git a/auth/gensec/gensec.h b/auth/gensec/gensec.h
index 0b0689f..efbbabe 100644
--- a/auth/gensec/gensec.h
+++ b/auth/gensec/gensec.h
@@ -61,6 +61,8 @@ struct gensec_target {
#define GENSEC_FEATURE_NEW_SPNEGO 0x00000080
#define GENSEC_FEATURE_UNIX_TOKEN 0x00000100
+#define GENSEC_EXPIRE_TIME_INFINITY (NTTIME)0x8000000000000000LL
+
/* GENSEC mode */
enum gensec_role
{
@@ -153,6 +155,7 @@ struct gensec_security_ops {
uint32_t feature);
bool (*have_feature)(struct gensec_security *gensec_security,
uint32_t feature);
+ NTTIME (*expire_time)(struct gensec_security *gensec_security);
bool enabled;
bool kerberos;
enum gensec_priority priority;
@@ -245,6 +248,7 @@ void gensec_want_feature(struct gensec_security *gensec_security,
uint32_t feature);
bool gensec_have_feature(struct gensec_security *gensec_security,
uint32_t feature);
+NTTIME gensec_expire_time(struct gensec_security *gensec_security);
NTSTATUS gensec_set_credentials(struct gensec_security *gensec_security, struct cli_credentials *credentials);
NTSTATUS gensec_set_target_service(struct gensec_security *gensec_security, const char *service);
const char *gensec_get_target_service(struct gensec_security *gensec_security);
diff --git a/auth/gensec/spnego.c b/auth/gensec/spnego.c
index 15fd8da..6ce97d9 100644
--- a/auth/gensec/spnego.c
+++ b/auth/gensec/spnego.c
@@ -1355,6 +1355,17 @@ static bool gensec_spnego_have_feature(struct gensec_security *gensec_security,
feature);
}
+static NTTIME gensec_spnego_expire_time(struct gensec_security *gensec_security)
+{
+ struct spnego_state *spnego_state = (struct spnego_state *)gensec_security->private_data;
+
+ if (!spnego_state->sub_sec_security) {
+ return GENSEC_EXPIRE_TIME_INFINITY;
+ }
+
+ return gensec_expire_time(spnego_state->sub_sec_security);
+}
+
static const char *gensec_spnego_oids[] = {
GENSEC_OID_SPNEGO,
NULL
@@ -1384,6 +1395,7 @@ static const struct gensec_security_ops gensec_spnego_security_ops = {
.session_info = gensec_spnego_session_info,
.want_feature = gensec_spnego_want_feature,
.have_feature = gensec_spnego_have_feature,
+ .expire_time = gensec_spnego_expire_time,
.enabled = true,
.priority = GENSEC_SPNEGO
};
diff --git a/source3/librpc/crypto/gse.c b/source3/librpc/crypto/gse.c
index a9c9c47..fba942b 100644
--- a/source3/librpc/crypto/gse.c
+++ b/source3/librpc/crypto/gse.c
@@ -44,6 +44,8 @@ struct gse_context {
gss_cred_id_t delegated_cred_handle;
+ NTTIME expire_time;
+
/* gensec_gse only */
krb5_context k5ctx;
krb5_ccache ccache;
@@ -145,6 +147,8 @@ static NTSTATUS gse_context_init(TALLOC_CTX *mem_ctx,
}
talloc_set_destructor((TALLOC_CTX *)gse_ctx, gse_context_destructor);
+ gse_ctx->expire_time = GENSEC_EXPIRE_TIME_INFINITY;
+
memcpy(&gse_ctx->gss_mech, gss_mech_krb5, sizeof(gss_OID_desc));
gse_ctx->gss_want_flags = GSS_C_MUTUAL_FLAG |
@@ -290,6 +294,8 @@ static NTSTATUS gse_get_client_auth_token(TALLOC_CTX *mem_ctx,
gss_buffer_desc out_data;
DATA_BLOB blob = data_blob_null;
NTSTATUS status;
+ OM_uint32 time_rec = 0;
+ struct timeval tv;
in_data.value = token_in->data;
in_data.length = token_in->length;
@@ -302,10 +308,13 @@ static NTSTATUS gse_get_client_auth_token(TALLOC_CTX *mem_ctx,
gse_ctx->gss_want_flags,
0, GSS_C_NO_CHANNEL_BINDINGS,
&in_data, NULL, &out_data,
- &gse_ctx->gss_got_flags, NULL);
+ &gse_ctx->gss_got_flags, &time_rec);
switch (gss_maj) {
case GSS_S_COMPLETE:
/* we are done with it */
+ tv = timeval_current_ofs(time_rec, 0);
+ gse_ctx->expire_time = timeval_to_nttime(&tv);
+
status = NT_STATUS_OK;
break;
case GSS_S_CONTINUE_NEEDED:
@@ -439,6 +448,8 @@ static NTSTATUS gse_get_server_auth_token(TALLOC_CTX *mem_ctx,
gss_buffer_desc out_data;
DATA_BLOB blob = data_blob_null;
NTSTATUS status;
+ OM_uint32 time_rec = 0;
+ struct timeval tv;
in_data.value = token_in->data;
in_data.length = token_in->length;
@@ -451,11 +462,15 @@ static NTSTATUS gse_get_server_auth_token(TALLOC_CTX *mem_ctx,
&gse_ctx->client_name,
&gse_ctx->ret_mech,
&out_data,
- &gse_ctx->gss_got_flags, NULL,
+ &gse_ctx->gss_got_flags,
+ &time_rec,
&gse_ctx->delegated_cred_handle);
switch (gss_maj) {
case GSS_S_COMPLETE:
/* we are done with it */
+ tv = timeval_current_ofs(time_rec, 0);
+ gse_ctx->expire_time = timeval_to_nttime(&tv);
+
status = NT_STATUS_OK;
break;
case GSS_S_CONTINUE_NEEDED:
@@ -1023,6 +1038,15 @@ static bool gensec_gse_have_feature(struct gensec_security *gensec_security,
return false;
}
+static NTTIME gensec_gse_expire_time(struct gensec_security *gensec_security)
+{
+ struct gse_context *gse_ctx =
+ talloc_get_type_abort(gensec_security->private_data,
+ struct gse_context);
+
+ return gse_ctx->expire_time;
+}
+
/*
* Extract the 'sesssion key' needed by SMB signing and ncacn_np
* (for encrypting some passwords).
@@ -1154,6 +1178,7 @@ const struct gensec_security_ops gensec_gse_krb5_security_ops = {
.wrap = gensec_gse_wrap,
.unwrap = gensec_gse_unwrap,
.have_feature = gensec_gse_have_feature,
+ .expire_time = gensec_gse_expire_time,
.enabled = true,
.kerberos = true,
.priority = GENSEC_GSSAPI
diff --git a/source3/smbd/smb2_sesssetup.c b/source3/smbd/smb2_sesssetup.c
index 2dafa06..939cfac 100644
--- a/source3/smbd/smb2_sesssetup.c
+++ b/source3/smbd/smb2_sesssetup.c
@@ -484,7 +484,7 @@ static NTSTATUS smbd_smb2_session_setup_recv(struct tevent_req *req,
if (tevent_req_is_nterror(req, &status)) {
if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
tevent_req_received(req);
- return status;
+ return nt_status_squash(status);
}
} else {
status = NT_STATUS_OK;
diff --git a/source4/auth/gensec/gensec_gssapi.c b/source4/auth/gensec/gensec_gssapi.c
index 3196473..dde481a 100644
--- a/source4/auth/gensec/gensec_gssapi.c
+++ b/source4/auth/gensec/gensec_gssapi.c
@@ -129,6 +129,7 @@ static NTSTATUS gensec_gssapi_start(struct gensec_security *gensec_security)
gensec_gssapi_state->client_name = GSS_C_NO_NAME;
gensec_gssapi_state->gss_want_flags = 0;
+ gensec_gssapi_state->expire_time = GENSEC_EXPIRE_TIME_INFINITY;
if (gensec_setting_bool(gensec_security->settings, "gensec_gssapi", "delegation_by_kdc_policy", true)) {
gensec_gssapi_state->gss_want_flags |= GSS_C_DELEG_POLICY_FLAG;
@@ -415,6 +416,14 @@ static NTSTATUS gensec_gssapi_update(struct gensec_security *gensec_security,
OM_uint32 min_stat2;
gss_buffer_desc input_token, output_token;
gss_OID gss_oid_p = NULL;
+ OM_uint32 time_req = 0;
+ OM_uint32 time_rec = 0;
+ struct timeval tv;
+
+ time_req = gensec_setting_int(gensec_security->settings,
+ "gensec_gssapi", "requested_life_time",
+ time_req);
+
input_token.length = in.length;
input_token.value = in.data;
@@ -449,13 +458,13 @@ static NTSTATUS gensec_gssapi_update(struct gensec_security *gensec_security,
gensec_gssapi_state->server_name,
gensec_gssapi_state->gss_oid,
gensec_gssapi_state->gss_want_flags,
- 0,
+ time_req,
gensec_gssapi_state->input_chan_bindings,
&input_token,
&gss_oid_p,
&output_token,
&gensec_gssapi_state->gss_got_flags, /* ret flags */
- NULL);
+ &time_rec);
if (gss_oid_p) {
gensec_gssapi_state->gss_oid = gss_oid_p;
}
@@ -484,7 +493,7 @@ static NTSTATUS gensec_gssapi_update(struct gensec_security *gensec_security,
&gss_oid_p,
&output_token,
&gensec_gssapi_state->gss_got_flags,
- NULL,
+ &time_rec,
&gensec_gssapi_state->delegated_cred_handle);
if (gss_oid_p) {
gensec_gssapi_state->gss_oid = gss_oid_p;
@@ -508,6 +517,9 @@ static NTSTATUS gensec_gssapi_update(struct gensec_security *gensec_security,
DEBUG(5, ("gensec_gssapi: NO credentials were delegated\n"));
}
+ tv = timeval_current_ofs(time_rec, 0);
+ gensec_gssapi_state->expire_time = timeval_to_nttime(&tv);
+
/* We may have been invoked as SASL, so there
* is more work to do */
if (gensec_gssapi_state->sasl) {
@@ -547,9 +559,11 @@ static NTSTATUS gensec_gssapi_update(struct gensec_security *gensec_security,
case GENSEC_CLIENT:
creds = gensec_gssapi_state->client_cred->creds;
role = "client";
+ break;
case GENSEC_SERVER:
creds = gensec_gssapi_state->server_cred->creds;
role = "server";
+ break;
}
maj_stat = gss_inquire_cred(&min_stat,
@@ -1254,6 +1268,15 @@ static bool gensec_gssapi_have_feature(struct gensec_security *gensec_security,
return false;
}
+static NTTIME gensec_gssapi_expire_time(struct gensec_security *gensec_security)
+{
+ struct gensec_gssapi_state *gensec_gssapi_state =
+ talloc_get_type_abort(gensec_security->private_data,
+ struct gensec_gssapi_state);
+
+ return gensec_gssapi_state->expire_time;
+}
+
/*
* Extract the 'sesssion key' needed by SMB signing and ncacn_np
* (for encrypting some passwords).
@@ -1464,6 +1487,7 @@ static const struct gensec_security_ops gensec_gssapi_spnego_security_ops = {
.wrap = gensec_gssapi_wrap,
.unwrap = gensec_gssapi_unwrap,
.have_feature = gensec_gssapi_have_feature,
+ .expire_time = gensec_gssapi_expire_time,
.enabled = false,
.kerberos = true,
.priority = GENSEC_GSSAPI
@@ -1488,6 +1512,7 @@ static const struct gensec_security_ops gensec_gssapi_krb5_security_ops = {
.wrap = gensec_gssapi_wrap,
.unwrap = gensec_gssapi_unwrap,
.have_feature = gensec_gssapi_have_feature,
+ .expire_time = gensec_gssapi_expire_time,
.enabled = true,
.kerberos = true,
.priority = GENSEC_GSSAPI
@@ -1507,6 +1532,7 @@ static const struct gensec_security_ops gensec_gssapi_sasl_krb5_security_ops = {
.wrap = gensec_gssapi_wrap,
.unwrap = gensec_gssapi_unwrap,
.have_feature = gensec_gssapi_have_feature,
+ .expire_time = gensec_gssapi_expire_time,
.enabled = true,
.kerberos = true,
.priority = GENSEC_GSSAPI
diff --git a/source4/auth/gensec/gensec_gssapi.h b/source4/auth/gensec/gensec_gssapi.h
index 569d787..b7429b5 100644
--- a/source4/auth/gensec/gensec_gssapi.h
+++ b/source4/auth/gensec/gensec_gssapi.h
@@ -43,6 +43,7 @@ struct gensec_gssapi_state {
gss_cred_id_t delegated_cred_handle;
+ NTTIME expire_time;
/* gensec_gssapi only */
gss_krb5_lucid_context_v1_t *lucid;
diff --git a/source4/torture/smb2/session.c b/source4/torture/smb2/session.c
index 1f27222..6051145 100644
--- a/source4/torture/smb2/session.c
+++ b/source4/torture/smb2/session.c
@@ -28,7 +28,8 @@
#include "lib/cmdline/popt_common.h"
#include "auth/credentials/credentials.h"
#include "libcli/security/security.h"
-
+#include "libcli/resolve/resolve.h"
+#include "lib/param/param.h"
#define CHECK_VAL(v, correct) do { \
if ((v) != (correct)) { \
@@ -58,7 +59,7 @@
/**
* basic test for doing a session reconnect
*/
-bool test_session_reconnect(struct torture_context *tctx, struct smb2_tree *tree)
+bool test_session_reconnect1(struct torture_context *tctx, struct smb2_tree *tree)
{
NTSTATUS status;
TALLOC_CTX *mem_ctx = talloc_new(tctx);
@@ -137,6 +138,69 @@ done:
return ret;
}
+/**
+ * basic test for doing a session reconnect on one connection
+ */
+bool test_session_reconnect2(struct torture_context *tctx, struct smb2_tree *tree)
+{
+ NTSTATUS status;
+ TALLOC_CTX *mem_ctx = talloc_new(tctx);
+ char fname[256];
+ struct smb2_handle _h1;
+ struct smb2_handle *h1 = NULL;
+ struct smb2_create io1;
+ uint64_t previous_session_id;
+ bool ret = true;
+ struct smb2_session *session2;
+ union smb_fileinfo qfinfo;
+
+ /* Add some random component to the file name. */
+ snprintf(fname, 256, "session_reconnect_%s.dat",
+ generate_random_str(tctx, 8));
+
+ smb2_util_unlink(tree, fname);
+
+ smb2_oplock_create_share(&io1, fname,
+ smb2_util_share_access(""),
+ smb2_util_oplock_level("b"));
+ io1.in.create_options |= NTCREATEX_OPTIONS_DELETE_ON_CLOSE;
+
+ status = smb2_create(tree, mem_ctx, &io1);
+ CHECK_STATUS(status, NT_STATUS_OK);
+ _h1 = io1.out.file.handle;
+ h1 = &_h1;
+ CHECK_CREATED(&io1, CREATED, FILE_ATTRIBUTE_ARCHIVE);
+ CHECK_VAL(io1.out.oplock_level, smb2_util_oplock_level("b"));
+
+ /* disconnect, reconnect and then do durable reopen */
+ previous_session_id = smb2cli_session_current_id(tree->session->smbXcli);
+
+ torture_assert(tctx, torture_smb2_session_setup(tctx, tree->session->transport,
+ previous_session_id, tctx, &session2),
+ "session reconnect (on the same connection) failed");
+
+ /* try to access the file via the old handle */
+
+ ZERO_STRUCT(qfinfo);
+ qfinfo.generic.level = RAW_FILEINFO_POSITION_INFORMATION;
+ qfinfo.generic.in.file.handle = _h1;
+ status = smb2_getinfo_file(tree, mem_ctx, &qfinfo);
+ CHECK_STATUS(status, NT_STATUS_USER_SESSION_DELETED);
+ h1 = NULL;
+
+done:
+ if (h1 != NULL) {
+ smb2_util_close(tree, *h1);
+ }
+
+ talloc_free(tree);
+ talloc_free(session2);
+
+ talloc_free(mem_ctx);
+
+ return ret;
+}
+
bool test_session_reauth1(struct torture_context *tctx, struct smb2_tree *tree)
{
NTSTATUS status;
@@ -401,7 +465,7 @@ bool test_session_reauth4(struct torture_context *tctx, struct smb2_tree *tree)
| SECINFO_DACL
| SECINFO_PROTECTED_DACL
| SECINFO_UNPROTECTED_DACL;
- struct security_descriptor *sd1, *sd2, sd3;
+ struct security_descriptor *sd1;
struct security_ace ace;
struct dom_sid *extra_sid;
@@ -523,7 +587,7 @@ bool test_session_reauth5(struct torture_context *tctx, struct smb2_tree *tree)
| SECINFO_DACL
| SECINFO_PROTECTED_DACL
| SECINFO_UNPROTECTED_DACL;
- struct security_descriptor *sd1, *sd2, sd3;
+ struct security_descriptor *sd1, *sd2;
struct security_ace ace;
struct dom_sid *extra_sid;
@@ -728,17 +792,132 @@ done:
return ret;
}
+static bool test_session_expire1(struct torture_context *tctx)
+{
+ NTSTATUS status;
+ bool ret = false;
+ struct smbcli_options options;
+ const char *host = torture_setting_string(tctx, "host", NULL);
+ const char *share = torture_setting_string(tctx, "share", NULL);
+ struct cli_credentials *credentials = cmdline_credentials;
+ struct smb2_tree *tree;
+ enum credentials_use_kerberos use_kerberos;
+ char fname[256];
+ struct smb2_handle _h1;
+ struct smb2_handle *h1 = NULL;
+ struct smb2_create io1;
+ union smb_fileinfo qfinfo;
+ size_t i;
+
+ use_kerberos = cli_credentials_get_kerberos_state(credentials);
+ if (use_kerberos != CRED_MUST_USE_KERBEROS) {
+ torture_warning(tctx, "smb2.session.expire1 requires -k yes!");
+ torture_skip(tctx, "smb2.session.expire1 requires -k yes!");
+ }
+
+ torture_assert_int_equal(tctx, use_kerberos, CRED_MUST_USE_KERBEROS,
+ "please use -k yes");
+
+ lpcfg_set_option(tctx->lp_ctx, "gensec_gssapi:requested_life_time=4");
+
+ lpcfg_smbcli_options(tctx->lp_ctx, &options);
+
+ status = smb2_connect(tctx,
+ host,
+ lpcfg_smb_ports(tctx->lp_ctx),
+ share,
+ lpcfg_resolve_context(tctx->lp_ctx),
+ credentials,
+ &tree,
+ tctx->ev,
+ &options,
+ lpcfg_socket_options(tctx->lp_ctx),
+ lpcfg_gensec_settings(tctx, tctx->lp_ctx)
+ );
+ torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
+ "smb2_connect failed");
+
+ /* Add some random component to the file name. */
+ snprintf(fname, 256, "session_expire1_%s.dat",
+ generate_random_str(tctx, 8));
+
+ smb2_util_unlink(tree, fname);
+
+ smb2_oplock_create_share(&io1, fname,
+ smb2_util_share_access(""),
+ smb2_util_oplock_level("b"));
+ io1.in.create_options |= NTCREATEX_OPTIONS_DELETE_ON_CLOSE;
+
+ status = smb2_create(tree, tctx, &io1);
+ CHECK_STATUS(status, NT_STATUS_OK);
+ _h1 = io1.out.file.handle;
+ h1 = &_h1;
+ CHECK_CREATED(&io1, CREATED, FILE_ATTRIBUTE_ARCHIVE);
+ CHECK_VAL(io1.out.oplock_level, smb2_util_oplock_level("b"));
+
+ /* get the security descriptor */
+
+ ZERO_STRUCT(qfinfo);
+
+ qfinfo.access_information.level = RAW_FILEINFO_ACCESS_INFORMATION;
+ qfinfo.access_information.in.file.handle = _h1;
+
+ for (i=0; i < 2; i++) {
+ torture_comment(tctx, "query info => OK\n");
--
Samba Shared Repository
More information about the samba-cvs
mailing list