[SCM] Samba Shared Repository - branch master updated
Jeremy Allison
jra at samba.org
Fri Feb 7 22:28:02 UTC 2020
The branch, master has been updated
via 2d9841c9788 smbd: Remove overriding file_attributes with unix_mode in the VFS
via e0814dc5082 smbd: Allow a Posix create context to override the unix mode
via 5bdad0fb068 smbd: Add posix create ctx to CREATE_FILE for posix operations
via 3b92cbdfa90 smbd: Add a "done:" exit for get_posix_fsp()
via 4776456ce4e smbd: Make unix_perms_from_wire() public
via 8047876f4ac smbd: Add make_smb2_posix_create_ctx()
via 54bd27167ce smbd: Ignore incoming POSIX create context
via f6fe7c39cda libsmb: Add smb2_create_blob_remove()
via 23db7315936 libsmb: Allow passing in NULL to smb2_create_blob_find()
via d33d43f38ca libsmb: Add posix create context definition
via 76803ecccc8 libsmb: Add required #includes to smb_util.h
via 298dbc53321 libsmb: Add required includes to smb2_create_blob.h
via 149217ce562 libsmb: Remove "const" from smb_create_blob->tag
from 859a86b37ea s3: lib: Now remote_machine is static, we can depend on it being non-NULL.
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 2d9841c9788835484c364b61507efdf8fe34aa9e
Author: Volker Lendecke <vl at samba.org>
Date: Wed Feb 5 15:43:43 2020 +0200
smbd: Remove overriding file_attributes with unix_mode in the VFS
Internally to open.c this is still used, but that can go away next.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Fri Feb 7 22:27:48 UTC 2020 on sn-devel-184
commit e0814dc5082dd4ecca8a155e0ce24b073158fd92
Author: Volker Lendecke <vl at samba.org>
Date: Tue Feb 4 16:46:09 2020 +0200
smbd: Allow a Posix create context to override the unix mode
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 5bdad0fb068bfd896b868efa501b0ba3a1053318
Author: Volker Lendecke <vl at samba.org>
Date: Tue Feb 4 14:58:02 2020 +0200
smbd: Add posix create ctx to CREATE_FILE for posix operations
This will replace overloading file attributes
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 3b92cbdfa9057a89d404d808b5253bcc83c4f60d
Author: Volker Lendecke <vl at samba.org>
Date: Wed Feb 5 15:25:12 2020 +0200
smbd: Add a "done:" exit for get_posix_fsp()
We'll have another exit with the next commit
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 4776456ce4e99c26e5aecd2519ed69b984eca505
Author: Volker Lendecke <vl at samba.org>
Date: Tue Feb 4 15:28:16 2020 +0200
smbd: Make unix_perms_from_wire() public
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 8047876f4ac71ed103fbc4aba8ace69fac45ece9
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jan 23 21:14:44 2020 +0100
smbd: Add make_smb2_posix_create_ctx()
Will be used internally to pass an artificial posix create context
into VFS_CREATE_FILE from the SMB1 unix extension calls
Pair programmed with: Jeremy Allison <jra at samba.org>
Signed-off-by: Volker Lendecke <vl at samba.org>
commit 54bd27167ce2b2b6ca47396c4b2d03c458615f20
Author: Volker Lendecke <vl at samba.org>
Date: Tue Feb 4 17:19:05 2020 +0200
smbd: Ignore incoming POSIX create context
We will use this internally and can only expose this once SMB3.11 unix
extensions are activated for the client.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit f6fe7c39cdaeb9b415c36f7ae9a8baf45dddc5b0
Author: Volker Lendecke <vl at samba.org>
Date: Tue Feb 4 17:18:41 2020 +0200
libsmb: Add smb2_create_blob_remove()
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 23db731593614c1427066091090fd13ccebed2aa
Author: Volker Lendecke <vl at samba.org>
Date: Tue Feb 4 15:03:48 2020 +0200
libsmb: Allow passing in NULL to smb2_create_blob_find()
Will simplify callers a bit, and it does not change semantics
significantly. Zero create blobs won't find anything anyway.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit d33d43f38ca01dab644ea209210c14a7fd600167
Author: Volker Lendecke <vl at samba.org>
Date: Wed Feb 5 05:56:05 2020 +0100
libsmb: Add posix create context definition
Pair programmed with: Jeremy Allison <jra at samba.org>
Signed-off-by: Volker Lendecke <vl at samba.org>
commit 76803ecccc8df9f99004342c1f459f711b219e1c
Author: Volker Lendecke <vl at samba.org>
Date: Wed Feb 5 17:01:52 2020 +0200
libsmb: Add required #includes to smb_util.h
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 298dbc53321c0bfcc7003f5ad182be869f80c19a
Author: Volker Lendecke <vl at samba.org>
Date: Wed Feb 5 06:08:15 2020 +0100
libsmb: Add required includes to smb2_create_blob.h
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 149217ce56219280236822c86f1d8e89b311dd86
Author: Volker Lendecke <vl at samba.org>
Date: Wed Feb 5 17:00:48 2020 +0200
libsmb: Remove "const" from smb_create_blob->tag
I want to TALLOC_FREE that soon, and we do a talloc_strdup into this anyway.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
-----------------------------------------------------------------------
Summary of changes:
libcli/smb/smb2_constants.h | 1 +
libcli/smb/smb2_create_blob.c | 19 +++++
libcli/smb/smb2_create_blob.h | 9 ++-
libcli/smb/smb2_posix.c | 51 +++++++++++++
.../tstream_u32_read.h => smb/smb2_posix.h} | 27 ++++---
libcli/smb/smb_util.h | 5 ++
libcli/smb/wscript | 2 +
source3/smbd/open.c | 31 ++++++++
source3/smbd/proto.h | 13 ++++
source3/smbd/reply.c | 42 ++++++++---
source3/smbd/smb2_create.c | 8 +++
source3/smbd/trans2.c | 84 ++++++++++++++++------
12 files changed, 247 insertions(+), 45 deletions(-)
create mode 100644 libcli/smb/smb2_posix.c
copy libcli/{named_pipe_auth/tstream_u32_read.h => smb/smb2_posix.h} (65%)
Changeset truncated at 500 lines:
diff --git a/libcli/smb/smb2_constants.h b/libcli/smb/smb2_constants.h
index 5832c0e7f83..ea1a21c84e8 100644
--- a/libcli/smb/smb2_constants.h
+++ b/libcli/smb/smb2_constants.h
@@ -237,6 +237,7 @@
#define SMB2_CREATE_TAG_AAPL "AAPL"
#define SMB2_CREATE_TAG_APP_INSTANCE_ID "\x45\xBC\xA6\x6A\xEF\xA7\xF7\x4A\x90\x08\xFA\x46\x2E\x14\x4D\x74"
#define SVHDX_OPEN_DEVICE_CONTEXT "\x9C\xCB\xCF\x9E\x04\xC1\xE6\x43\x98\x0E\x15\x8D\xA1\xF6\xEC\x83"
+#define SMB2_CREATE_TAG_POSIX "\x93\xAD\x25\x50\x9C\xB4\x11\xE7\xB4\x23\x83\xDE\x96\x8B\xCD\x7C"
/* SMB2 notify flags */
#define SMB2_WATCH_TREE 0x0001
diff --git a/libcli/smb/smb2_create_blob.c b/libcli/smb/smb2_create_blob.c
index bb994f28e2f..ecd61e0c9b2 100644
--- a/libcli/smb/smb2_create_blob.c
+++ b/libcli/smb/smb2_create_blob.c
@@ -213,6 +213,10 @@ struct smb2_create_blob *smb2_create_blob_find(const struct smb2_create_blobs *b
{
uint32_t i;
+ if (b == NULL) {
+ return NULL;
+ }
+
for (i=0; i < b->num_blobs; i++) {
if (strcmp(b->blobs[i].tag, tag) == 0) {
return &b->blobs[i];
@@ -221,3 +225,18 @@ struct smb2_create_blob *smb2_create_blob_find(const struct smb2_create_blobs *b
return NULL;
}
+
+void smb2_create_blob_remove(struct smb2_create_blobs *b, const char *tag)
+{
+ struct smb2_create_blob *blob = smb2_create_blob_find(b, tag);
+
+ if (blob == NULL) {
+ return;
+ }
+
+ TALLOC_FREE(blob->tag);
+ data_blob_free(&blob->data);
+
+ *blob = b->blobs[b->num_blobs-1];
+ b->num_blobs -= 1;
+}
diff --git a/libcli/smb/smb2_create_blob.h b/libcli/smb/smb2_create_blob.h
index 90697a70892..f41e77edc3d 100644
--- a/libcli/smb/smb2_create_blob.h
+++ b/libcli/smb/smb2_create_blob.h
@@ -23,8 +23,13 @@
#ifndef _LIBCLI_SMB_SMB2_CREATE_BLOB_H_
#define _LIBCLI_SMB_SMB2_CREATE_BLOB_H_
+#include "replace.h"
+#include "lib/util/data_blob.h"
+#include "lib/util/time.h"
+#include "libcli/util/ntstatus.h"
+
struct smb2_create_blob {
- const char *tag;
+ char *tag;
DATA_BLOB data;
};
@@ -66,4 +71,6 @@ NTSTATUS smb2_create_blob_add(TALLOC_CTX *mem_ctx, struct smb2_create_blobs *b,
struct smb2_create_blob *smb2_create_blob_find(const struct smb2_create_blobs *b,
const char *tag);
+void smb2_create_blob_remove(struct smb2_create_blobs *b, const char *tag);
+
#endif /* _LIBCLI_SMB_SMB2_CREATE_BLOB_H_ */
diff --git a/libcli/smb/smb2_posix.c b/libcli/smb/smb2_posix.c
new file mode 100644
index 00000000000..60be3214da2
--- /dev/null
+++ b/libcli/smb/smb2_posix.c
@@ -0,0 +1,51 @@
+/*
+ * Unix SMB/CIFS implementation.
+ *
+ * SMB2 Posix context handling
+ *
+ * Copyright (C) Jeremy Allison 2019
+ *
+ * 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 "replace.h"
+#include "libcli/smb/smb2_posix.h"
+#include "libcli/smb/smb2_constants.h"
+#include "lib/util/byteorder.h"
+
+NTSTATUS make_smb2_posix_create_ctx(
+ TALLOC_CTX *mem_ctx,
+ struct smb2_create_blobs **crb,
+ mode_t mode)
+{
+ struct smb2_create_blobs *cblobs = NULL;
+ uint8_t linear_mode[4];
+ DATA_BLOB blob = { .data=linear_mode, .length=sizeof(linear_mode) };
+ NTSTATUS status;
+
+ cblobs = talloc_zero(mem_ctx, struct smb2_create_blobs);
+ if (cblobs == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ SIVAL(&linear_mode,0, unix_perms_to_wire(mode & ~S_IFMT));
+
+ status = smb2_create_blob_add(
+ cblobs, cblobs, SMB2_CREATE_TAG_POSIX, blob);
+ if (!NT_STATUS_IS_OK(status)) {
+ TALLOC_FREE(cblobs);
+ return status;
+ }
+ *crb = cblobs;
+ return NT_STATUS_OK;
+}
diff --git a/libcli/named_pipe_auth/tstream_u32_read.h b/libcli/smb/smb2_posix.h
similarity index 65%
copy from libcli/named_pipe_auth/tstream_u32_read.h
copy to libcli/smb/smb2_posix.h
index 1356ff03631..0751814e3dd 100644
--- a/libcli/named_pipe_auth/tstream_u32_read.h
+++ b/libcli/smb/smb2_posix.h
@@ -1,7 +1,9 @@
/*
* Unix SMB/CIFS implementation.
*
- * Copyright (C) Volker Lendecke 2019
+ * SMB2 Posix context handling
+ *
+ * Copyright (C) Jeremy Allison 2019
*
* 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
@@ -17,21 +19,18 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef TSTREAM_U32_READ_H
-#define TSTREAM_U32_READ_H
+#ifndef _LIBCLI_SMB_SMB2_POSIX_H_
+#define _LIBCLI_SMB_SMB2_POSIX_H_
#include "replace.h"
-#include "tsocket.h"
+#include "system/filesys.h"
+#include <talloc.h>
+#include "libcli/smb/smb2_create_blob.h"
+#include "libcli/smb/smb_util.h"
-struct tevent_req *tstream_u32_read_send(
- TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- uint32_t max_msglen,
- struct tstream_context *stream);
-int tstream_u32_read_recv(
- struct tevent_req *req,
+NTSTATUS make_smb2_posix_create_ctx(
TALLOC_CTX *mem_ctx,
- uint8_t **buf,
- size_t *buflen);
+ struct smb2_create_blobs **crb,
+ mode_t mode);
-#endif
+#endif /* _LIBCLI_SMB_SMB2_POSIX_H_ */
diff --git a/libcli/smb/smb_util.h b/libcli/smb/smb_util.h
index 501b8dd1d3d..8861741c92f 100644
--- a/libcli/smb/smb_util.h
+++ b/libcli/smb/smb_util.h
@@ -19,6 +19,11 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "replace.h"
+#include "system/filesys.h"
+#include "smb_constants.h"
+#include <talloc.h>
+
const char *smb_protocol_types_string(enum protocol_types protocol);
char *attrib_string(TALLOC_CTX *mem_ctx, uint32_t attrib);
uint32_t unix_perms_to_wire(mode_t perms);
diff --git a/libcli/smb/wscript b/libcli/smb/wscript
index 66c2b9b7e70..86e377f570b 100644
--- a/libcli/smb/wscript
+++ b/libcli/smb/wscript
@@ -43,6 +43,7 @@ def build(bld):
smb2cli_query_directory.c
smb2cli_ioctl.c
smb2cli_echo.c
+ smb2_posix.c
tstream_smbXcli_np.c
''',
deps='''
@@ -62,6 +63,7 @@ def build(bld):
smb2_lease.h
smb_util.h
smb_unix_ext.h
+ smb_posix.h
tstream_smbXcli_np.h
''',
)
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index e64e22581e0..709f963c277 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -5884,6 +5884,7 @@ NTSTATUS create_file_default(connection_struct *conn,
files_struct *fsp = NULL;
NTSTATUS status;
bool stream_name = false;
+ struct smb2_create_blob *posx = NULL;
DBG_DEBUG("create_file: access_mask = 0x%x "
"file_attributes = 0x%x, share_access = 0x%x, "
@@ -5985,6 +5986,36 @@ NTSTATUS create_file_default(connection_struct *conn,
}
}
+ posx = smb2_create_blob_find(
+ in_context_blobs, SMB2_CREATE_TAG_POSIX);
+ if (posx != NULL) {
+ uint32_t wire_mode_bits = 0;
+ mode_t mode_bits = 0;
+ SMB_STRUCT_STAT sbuf = { 0 };
+ enum perm_type ptype =
+ (create_options & FILE_DIRECTORY_FILE) ?
+ PERM_NEW_DIR : PERM_NEW_FILE;
+
+ if (posx->data.length != 4) {
+ status = NT_STATUS_INVALID_PARAMETER;
+ goto fail;
+ }
+
+ wire_mode_bits = IVAL(posx->data.data, 0);
+ status = unix_perms_from_wire(
+ conn, &sbuf, wire_mode_bits, ptype, &mode_bits);
+ if (!NT_STATUS_IS_OK(status)) {
+ goto fail;
+ }
+ /*
+ * Remove type info from mode, leaving only the
+ * permissions and setuid/gid bits.
+ */
+ mode_bits &= ~S_IFMT;
+
+ file_attributes = (FILE_FLAG_POSIX_SEMANTICS | mode_bits);
+ }
+
status = create_file_unixpath(
conn, req, smb_fname, access_mask, share_access,
create_disposition, create_options, file_attributes,
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index d325f7d56e0..02a8c9873c3 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -1197,6 +1197,19 @@ void reply_findnclose(struct smb_request *req);
void reply_trans2(struct smb_request *req);
void reply_transs2(struct smb_request *req);
+enum perm_type {
+ PERM_NEW_FILE,
+ PERM_NEW_DIR,
+ PERM_EXISTING_FILE,
+ PERM_EXISTING_DIR
+};
+
+NTSTATUS unix_perms_from_wire(connection_struct *conn,
+ const SMB_STRUCT_STAT *psbuf,
+ uint32_t perms,
+ enum perm_type ptype,
+ mode_t *ret_perms);
+
/* The following definitions come from smbd/uid.c */
bool change_to_guest(void);
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index 40cd7483750..aef34d9ede8 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -46,6 +46,7 @@
#include "lib/util/sys_rw_data.h"
#include "librpc/gen_ndr/open_files.h"
#include "smb1_utils.h"
+#include "libcli/smb/smb2_posix.h"
/****************************************************************************
Ensure we check the path in *exactly* the same way as W2K for a findfirst/findnext
@@ -3035,6 +3036,7 @@ static NTSTATUS do_unlink(connection_struct *conn,
NTSTATUS status;
int ret;
bool posix_paths = (req != NULL && req->posix_pathnames);
+ struct smb2_create_blobs *posx = NULL;
DEBUG(10,("do_unlink: %s, dirtype = %d\n",
smb_fname_str_dbg(smb_fname),
@@ -3106,6 +3108,16 @@ static NTSTATUS do_unlink(connection_struct *conn,
return NT_STATUS_OBJECT_NAME_INVALID;
#endif /* JRATEST */
+ if (posix_paths) {
+ status = make_smb2_posix_create_ctx(
+ talloc_tos(), &posx, 0777);
+ if (!NT_STATUS_IS_OK(status)) {
+ DBG_WARNING("make_smb2_posix_create_ctx failed: %s\n",
+ nt_errstr(status));
+ return status;
+ }
+ }
+
/* On open checks the open itself will check the share mode, so
don't do it here as we'll get it wrong. */
@@ -3118,9 +3130,7 @@ static NTSTATUS do_unlink(connection_struct *conn,
FILE_SHARE_NONE, /* share_access */
FILE_OPEN, /* create_disposition*/
FILE_NON_DIRECTORY_FILE, /* create_options */
- /* file_attributes */
- posix_paths ? FILE_FLAG_POSIX_SEMANTICS|0777 :
- FILE_ATTRIBUTE_NORMAL,
+ FILE_ATTRIBUTE_NORMAL, /* file_attributes */
0, /* oplock_request */
NULL, /* lease */
0, /* allocation_size */
@@ -3129,7 +3139,10 @@ static NTSTATUS do_unlink(connection_struct *conn,
NULL, /* ea_list */
&fsp, /* result */
NULL, /* pinfo */
- NULL, NULL); /* create context */
+ posx, /* in_context_blobs */
+ NULL); /* out_context_blobs */
+
+ TALLOC_FREE(posx);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(10, ("SMB_VFS_CREATEFILE failed: %s\n",
@@ -7295,6 +7308,7 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
long offset = 0;
int create_options = 0;
bool posix_pathnames = (req != NULL && req->posix_pathnames);
+ struct smb2_create_blobs *posx = NULL;
int rc;
/*
@@ -7334,6 +7348,15 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
}
}
+ if (posix_pathnames) {
+ status = make_smb2_posix_create_ctx(talloc_tos(), &posx, 0777);
+ if (!NT_STATUS_IS_OK(status)) {
+ DBG_WARNING("make_smb2_posix_create_ctx failed: %s\n",
+ nt_errstr(status));
+ goto out;
+ }
+ }
+
if (!src_has_wild) {
files_struct *fsp;
@@ -7411,7 +7434,7 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
FILE_SHARE_WRITE),
FILE_OPEN, /* create_disposition*/
create_options, /* create_options */
- posix_pathnames ? FILE_FLAG_POSIX_SEMANTICS|0777 : 0, /* file_attributes */
+ 0, /* file_attributes */
0, /* oplock_request */
NULL, /* lease */
0, /* allocation_size */
@@ -7420,7 +7443,8 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
NULL, /* ea_list */
&fsp, /* result */
NULL, /* pinfo */
- NULL, NULL); /* create context */
+ posx, /* in_context_blobs */
+ NULL); /* out_context_blobs */
if (!NT_STATUS_IS_OK(status)) {
DEBUG(3, ("Could not open rename source %s: %s\n",
@@ -7569,7 +7593,7 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
FILE_SHARE_WRITE),
FILE_OPEN, /* create_disposition*/
create_options, /* create_options */
- posix_pathnames ? FILE_FLAG_POSIX_SEMANTICS|0777 : 0, /* file_attributes */
+ 0, /* file_attributes */
0, /* oplock_request */
NULL, /* lease */
0, /* allocation_size */
@@ -7578,7 +7602,8 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
NULL, /* ea_list */
&fsp, /* result */
NULL, /* pinfo */
- NULL, NULL); /* create context */
+ posx, /* in_context_blobs */
+ NULL); /* out_context_blobs */
if (!NT_STATUS_IS_OK(status)) {
DEBUG(3,("rename_internals: SMB_VFS_CREATE_FILE "
@@ -7623,6 +7648,7 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
}
out:
+ TALLOC_FREE(posx);
TALLOC_FREE(talloced);
TALLOC_FREE(smb_fname_src_dir);
TALLOC_FREE(fname_src_dir);
diff --git a/source3/smbd/smb2_create.c b/source3/smbd/smb2_create.c
index bf0c3912c07..2221c4c7d0d 100644
--- a/source3/smbd/smb2_create.c
+++ b/source3/smbd/smb2_create.c
@@ -551,6 +551,14 @@ static NTSTATUS smbd_smb2_create_fetch_create_ctx(
struct smbd_smb2_create_state *state = tevent_req_data(
req, struct smbd_smb2_create_state);
+ /*
+ * For now, remove the posix create context from the wire. We
+ * are using it inside smbd and will properly use it once
+ * smb3.11 unix extensions will be done. So in the future we
+ * will remove it only if unix extensions are not negotiated.
+ */
+ smb2_create_blob_remove(in_context_blobs, SMB2_CREATE_TAG_POSIX);
+
state->dhnq = smb2_create_blob_find(in_context_blobs,
SMB2_CREATE_TAG_DHNQ);
state->dhnc = smb2_create_blob_find(in_context_blobs,
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 2cf669f4b4d..a7a4d32b2c3 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -43,6 +43,7 @@
#include "lib/readdir_attr.h"
#include "messages.h"
#include "smb1_utils.h"
+#include "libcli/smb/smb2_posix.h"
#define DIR_ENTRY_SAFETY_MARGIN 4096
@@ -118,11 +119,13 @@ static NTSTATUS get_posix_fsp(connection_struct *conn,
uint32_t share_access = FILE_SHARE_READ|
FILE_SHARE_WRITE|
FILE_SHARE_DELETE;
+ struct smb2_create_blobs *posx = NULL;
+
/*
* Only FILE_FLAG_POSIX_SEMANTICS matters on existing files,
* but set reasonable defaults.
*/
- uint32_t file_attributes = 0664|FILE_FLAG_POSIX_SEMANTICS;
+ uint32_t file_attributes = 0664;
uint32_t oplock = NO_OPLOCK;
uint32_t create_options = FILE_NON_DIRECTORY_FILE;
@@ -140,7 +143,7 @@ static NTSTATUS get_posix_fsp(connection_struct *conn,
* Only FILE_FLAG_POSIX_SEMANTICS matters on existing
* directories, but set reasonable defaults.
*/
- file_attributes = 0775|FILE_FLAG_POSIX_SEMANTICS;
+ file_attributes = 0775;
create_options = FILE_DIRECTORY_FILE;
}
@@ -148,7 +151,16 @@ static NTSTATUS get_posix_fsp(connection_struct *conn,
smb_fname_tmp = cp_smb_filename(talloc_tos(),
smb_fname);
if (smb_fname_tmp == NULL) {
- return NT_STATUS_NO_MEMORY;
+ status = NT_STATUS_NO_MEMORY;
+ goto done;
+ }
+
+ status = make_smb2_posix_create_ctx(
+ talloc_tos(), &posx, file_attributes);
+ if (!NT_STATUS_IS_OK(status)) {
+ DBG_WARNING("make_smb2_posix_create_ctx failed: %s\n",
+ nt_errstr(status));
+ goto done;
}
status = SMB_VFS_CREATE_FILE(
@@ -169,9 +181,11 @@ static NTSTATUS get_posix_fsp(connection_struct *conn,
NULL, /* ea_list */
ret_fsp, /* result */
NULL, /* pinfo */
- NULL, /* in_context */
+ posx, /* in_context */
NULL); /* out_context */
+done:
--
Samba Shared Repository
More information about the samba-cvs
mailing list